@@ -12,13 +12,15 @@ import Control.Monad.IO.Class
12
12
13
13
data ConcM m c
14
14
= EndM c
15
+ | ForkM [ConcM m () ] (ConcM m c )
15
16
| forall b . TaskM (IO b ) (b -> ConcM m c )
16
17
| forall b . PureM (m b ) (b -> ConcM m c )
17
18
18
19
instance (Monad m ) => Functor (ConcM m ) where
19
- fmap f (EndM c ) = EndM $ f c
20
- fmap f (TaskM io cont) = TaskM io (fmap f . cont)
21
- fmap f (PureM p cont) = PureM p (fmap f . cont)
20
+ fmap f (EndM c ) = EndM $ f c
21
+ fmap f (ForkM forks cont) = ForkM forks (fmap f cont)
22
+ fmap f (TaskM io cont) = TaskM io (fmap f . cont)
23
+ fmap f (PureM p cont) = PureM p (fmap f . cont)
22
24
23
25
instance (Monad m ) => Applicative (ConcM m ) where
24
26
pure = EndM
@@ -27,14 +29,19 @@ instance (Monad m) => Applicative (ConcM m) where
27
29
-- (EndM f ) <*> (EndM c ) = EndM (f c)
28
30
-- (TaskM io cont) <*> (EndM c ) = TaskM io ((<*> EndM c) . cont)
29
31
-- (PureM p cont) <*> (EndM c ) = PureM p (\c2 -> cont c2 <*> EndM c)
30
- (EndM f ) <*> t = fmap f t
31
- (TaskM io cont) <*> t = TaskM io ((<*> t) . cont)
32
- (PureM p cont) <*> t = PureM p ((<*> t) . cont)
32
+ (EndM f ) <*> t = fmap f t
33
+ (ForkM forks cont) <*> t = ForkM forks (cont <*> t)
34
+ (TaskM io cont) <*> t = TaskM io ((<*> t) . cont)
35
+ (PureM p cont) <*> t = PureM p ((<*> t) . cont)
33
36
34
37
instance (Monad m ) => Monad (ConcM m ) where
35
- (EndM a ) >>= cont = PureM (pure a) cont
36
- (TaskM io cont1) >>= cont2 = TaskM io ((>>= cont2) . cont1)
37
- (PureM p cont1) >>= cont2 = PureM p ((>>= cont2) . cont1)
38
+ (EndM a ) >>= cont = PureM (pure a) cont
39
+ (ForkM forks cont1) >>= cont2 = ForkM forks (cont1 >>= cont2)
40
+ (TaskM io cont1) >>= cont2 = TaskM io ((>>= cont2) . cont1)
41
+ (PureM p cont1) >>= cont2 = PureM p ((>>= cont2) . cont1)
42
+
43
+ forkM :: [ConcM m () ] -> ConcM m ()
44
+ forkM forks = ForkM forks (EndM () )
38
45
39
46
pureM :: m c -> ConcM m c
40
47
pureM x = PureM x EndM
@@ -52,7 +59,9 @@ runConcM q_ = do
52
59
case q of
53
60
[] -> liftIO $ threadDelay 100000
54
61
_ -> forM_ q $ \ case
55
- EndM _ -> return ()
62
+ EndM _ -> return ()
63
+ ForkM forks cont ->
64
+ liftIO $ atomically $ modifyTVar queue ((cont : forks) ++ )
56
65
TaskM io cont -> void . liftIO . forkIO $ do
57
66
a <- io
58
67
atomically $ modifyTVar queue (cont a : )
0 commit comments