@@ -2,14 +2,16 @@ module Test.Main where
22
33import Prelude
44
5- import Control.Monad.Aff (Aff (), runAff , later' )
5+ import Control.Monad.Aff (Aff (), runAff , later' , forkAll )
6+ import Control.Monad.Aff.AVar (AVAR (), makeVar' , modifyVar , takeVar )
67import Control.Monad.Cont.Class (callCC )
78import Control.Monad.Eff (Eff ())
89import Control.Monad.Eff.Class (liftEff )
910import Control.Monad.Eff.Console (CONSOLE (), log , print )
1011import Control.Monad.Eff.Exception (EXCEPTION (), throwException )
1112import Control.Monad.Rec.Class (tailRecM )
1213
14+ import Data.Array ((..))
1315import Data.Either (Either (..))
1416
1517loop :: forall eff . Int -> Aff (console :: CONSOLE | eff ) Unit
@@ -20,13 +22,21 @@ loop n = tailRecM go n
2022 return (Right unit)
2123 go n = return (Left (n - 1 ))
2224
25+ all :: forall eff . Int -> Aff (console :: CONSOLE , avar :: AVAR | eff ) Unit
26+ all n = do
27+ var <- makeVar' 0
28+ forkAll $ map (\_ -> modifyVar (+ 1 ) var) (1 .. n)
29+ count <- takeVar var
30+ liftEff $ log (" Forked " <> show count)
31+
2332delay :: forall eff . Int -> Aff eff Unit
2433delay n = callCC \cont ->
2534 later' n (cont unit)
2635
27- main :: Eff (console :: CONSOLE , err :: EXCEPTION ) Unit
36+ main :: Eff (console :: CONSOLE , avar :: AVAR , err :: EXCEPTION ) Unit
2837main = runAff throwException (const (pure unit)) $ do
2938 liftEff $ log " pre-delay"
3039 delay 1000
3140 liftEff $ log " post-delay"
3241 loop 1000000
42+ all 100000
0 commit comments