@@ -13,12 +13,24 @@ import Control.Monad.Error.Class (throwError)
13
13
import Control.Monad.Rec.Class (Step (..), tailRecM )
14
14
import Control.Parallel (parallel , sequential )
15
15
import Data.Either (either , fromLeft , fromRight )
16
+ import Data.Maybe (Maybe (..))
16
17
import Data.Unfoldable (replicate )
17
18
import Partial.Unsafe (unsafePartial )
18
19
19
20
type Test a = forall e . Aff (console :: CONSOLE | e ) a
20
21
type TestAVar a = forall e . Aff (console :: CONSOLE , avar :: AVAR | e ) a
21
22
23
+ timeout :: Int → TestAVar Unit → TestAVar Unit
24
+ timeout ms aff = do
25
+ exn <- makeVar
26
+ clr1 <- forkAff (later' ms (putVar exn (Just " Timed out" )))
27
+ clr2 <- forkAff (aff *> putVar exn Nothing )
28
+ res ← takeVar exn
29
+ log (show res)
30
+ case res of
31
+ Nothing -> void (clr1 `cancel` error " Done" )
32
+ Just e -> void (clr2 `cancel` error " Done" ) *> throwError (error e)
33
+
22
34
replicateArray :: forall a . Int -> a -> Array a
23
35
replicateArray = replicate
24
36
@@ -69,35 +81,38 @@ test_putTakeVar = do
69
81
70
82
test_peekVar :: TestAVar Unit
71
83
test_peekVar = do
72
- v <- makeVar
73
- forkAff (later $ putVar v 1.0 )
74
- a1 <- peekVar v
75
- a2 <- takeVar v
76
- when (a1 /= a2) do
77
- throwError (error " Something horrible went wrong - peeked var is not equal to taken var" )
78
- log (" Success: Peeked value not consumed" )
79
-
80
- w <- makeVar
81
- putVar w true
82
- b <- peekVar w
83
- when (not b) do
84
- throwError (error " Something horrible went wrong - peeked var is not true" )
85
- log (" Success: Peeked value read from written var" )
86
-
87
- x <- makeVar
88
- res <- makeVar' 1
89
- forkAff do
90
- c <- peekVar x
91
- putVar x 1000
92
- d <- peekVar x
93
- modifyVar (_ + (c + d)) res
94
- putVar x 10
95
- count <- takeVar res
96
- e <- takeVar x
97
- f <- takeVar x
98
- when (not (count == 21 && e == 10 && f == 1000 )) do
99
- throwError (error " Something horrible went wrong - peeked consumers/producer ordering" )
100
- log " Success: peekVar consumer/producer order maintained"
84
+ timeout 1000 do
85
+ v <- makeVar
86
+ forkAff (later $ putVar v 1.0 )
87
+ a1 <- peekVar v
88
+ a2 <- takeVar v
89
+ when (a1 /= a2) do
90
+ throwError (error " Something horrible went wrong - peeked var is not equal to taken var" )
91
+ log (" Success: Peeked value not consumed" )
92
+
93
+ timeout 1000 do
94
+ w <- makeVar
95
+ putVar w true
96
+ b <- peekVar w
97
+ when (not b) do
98
+ throwError (error " Something horrible went wrong - peeked var is not true" )
99
+ log (" Success: Peeked value read from written var" )
100
+
101
+ timeout 1000 do
102
+ x <- makeVar
103
+ res <- makeVar' 1
104
+ forkAff do
105
+ c <- peekVar x
106
+ putVar x 1000
107
+ d <- peekVar x
108
+ modifyVar (_ + (c + d)) res
109
+ putVar x 10
110
+ count <- takeVar res
111
+ e <- takeVar x
112
+ f <- takeVar x
113
+ when (not (count == 21 && e == 10 && f == 1000 )) do
114
+ throwError (error " Something horrible went wrong - peeked consumers/producer ordering" )
115
+ log " Success: peekVar consumer/producer order maintained"
101
116
102
117
test_killFirstForked :: Test Unit
103
118
test_killFirstForked = do
0 commit comments