@@ -13,12 +13,24 @@ import Control.Monad.Error.Class (throwError)
1313import Control.Monad.Rec.Class (Step (..), tailRecM )
1414import Control.Parallel (parallel , sequential )
1515import Data.Either (either , fromLeft , fromRight )
16+ import Data.Maybe (Maybe (..))
1617import Data.Unfoldable (replicate )
1718import Partial.Unsafe (unsafePartial )
1819
1920type Test a = forall e . Aff (console :: CONSOLE | e ) a
2021type TestAVar a = forall e . Aff (console :: CONSOLE , avar :: AVAR | e ) a
2122
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+
2234replicateArray :: forall a . Int -> a -> Array a
2335replicateArray = replicate
2436
@@ -69,35 +81,38 @@ test_putTakeVar = do
6981
7082test_peekVar :: TestAVar Unit
7183test_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"
101116
102117test_killFirstForked :: Test Unit
103118test_killFirstForked = do
0 commit comments