2
2
{-# LANGUAGE MultiParamTypeClasses #-}
3
3
{-# LANGUAGE LambdaCase #-}
4
4
{-# LANGUAGE ExistentialQuantification #-}
5
- {-# LANGUAGE InstanceSigs #-}
6
5
7
6
module Conc where
8
7
9
8
import Control.Concurrent
10
9
import Control.Concurrent.STM
11
10
import Control.Monad
12
11
import Control.Monad.IO.Class
13
- import qualified Control.Category as C
14
- import Control.Arrow
15
12
16
13
data ConcM m c
17
14
= EndM c
18
- | forall b . IOtaskM (IO b ) (b -> ConcM m c )
15
+ | forall b . TaskM (IO b ) (b -> ConcM m c )
19
16
| forall b . PureM (m b ) (b -> ConcM m c )
20
17
21
18
instance (Monad m ) => Functor (ConcM m ) where
22
- fmap f (EndM c ) = EndM $ f c
23
- fmap f (IOtaskM io cont) = IOtaskM io (fmap f . cont)
24
- fmap f (PureM p cont) = PureM p (fmap f . cont)
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)
25
22
26
23
instance (Monad m ) => Applicative (ConcM m ) where
27
24
pure = EndM
28
- t <*> (IOtaskM io cont) = IOtaskM io (\ c -> t <*> cont c)
29
- t <*> (PureM p cont) = PureM p (\ c -> t <*> cont c)
30
- (EndM f ) <*> (EndM c ) = EndM (f c)
31
- (IOtaskM io cont) <*> (EndM c) = IOtaskM io (\ c2 -> cont c2 <*> EndM c)
32
- (PureM p cont) <*> (EndM c ) = PureM p (\ c2 -> cont c2 <*> EndM c)
25
+ -- t <*> (TaskM io cont) = TaskM io ((t <*>) . cont)
26
+ -- t <*> (PureM p cont) = PureM p ((t <*>) . cont)
27
+ -- (EndM f ) <*> (EndM c ) = EndM (f c)
28
+ -- (TaskM io cont) <*> (EndM c ) = TaskM io ((<*> EndM c) . cont)
29
+ -- (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)
33
33
34
34
instance (Monad m ) => Monad (ConcM m ) where
35
- (EndM a ) >>= cont = PureM (pure a) cont
36
- (IOtaskM io cont1) >>= cont2 = IOtaskM io (\ a -> cont1 a >> = cont2)
37
- (PureM p cont1) >>= cont2 = PureM p (\ a -> cont1 a >> = cont2)
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
38
39
39
pureM :: m c -> ConcM m c
40
40
pureM x = PureM x EndM
41
41
42
42
taskM :: IO c -> ConcM m c
43
- taskM x = IOtaskM x EndM
43
+ taskM x = TaskM x EndM
44
44
45
45
runConcM :: (Monad a , MonadIO a ) => [ConcM a () ] -> a ()
46
46
runConcM q_ = do
@@ -52,8 +52,8 @@ runConcM q_ = do
52
52
case q of
53
53
[] -> liftIO $ threadDelay 100000
54
54
_ -> forM_ q $ \ case
55
- EndM _ -> return ()
56
- IOtaskM io cont -> void . liftIO . forkIO $ do
55
+ EndM _ -> return ()
56
+ TaskM io cont -> void . liftIO . forkIO $ do
57
57
a <- io
58
58
atomically $ modifyTVar queue (cont a : )
59
59
PureM p cont -> do
0 commit comments