Skip to content

Commit f4044c8

Browse files
committed
forking ConcM
1 parent 820d308 commit f4044c8

File tree

2 files changed

+20
-11
lines changed

2 files changed

+20
-11
lines changed

src/Bot/Irc.hs

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,11 @@ listenM :: ConcM App ()
2323
listenM = do
2424
handle <- pureM $ asks (botSocket . bot)
2525
line <- taskM $ T.hGetLine handle
26+
forkM [listenM]
2627
let
2728
message =
2829
Message (T.words . T.strip . clean $ line) (User 1 "test_user_name")
2930
if "PING :" `T.isPrefixOf` line
3031
then pureM $ pong line
3132
else runCommandM message
32-
listenM
3333

src/Conc.hs

+19-10
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,15 @@ import Control.Monad.IO.Class
1212

1313
data ConcM m c
1414
= EndM c
15+
| ForkM [ConcM m ()] (ConcM m c)
1516
| forall b. TaskM (IO b) (b -> ConcM m c)
1617
| forall b. PureM (m b) (b -> ConcM m c)
1718

1819
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)
2224

2325
instance (Monad m) => Applicative (ConcM m) where
2426
pure = EndM
@@ -27,14 +29,19 @@ instance (Monad m) => Applicative (ConcM m) where
2729
-- (EndM f ) <*> (EndM c ) = EndM (f c)
2830
-- (TaskM io cont) <*> (EndM c ) = TaskM io ((<*> EndM c) . cont)
2931
-- (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)
3336

3437
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 ())
3845

3946
pureM :: m c -> ConcM m c
4047
pureM x = PureM x EndM
@@ -52,7 +59,9 @@ runConcM q_ = do
5259
case q of
5360
[] -> liftIO $ threadDelay 100000
5461
_ -> forM_ q $ \case
55-
EndM _ -> return ()
62+
EndM _ -> return ()
63+
ForkM forks cont ->
64+
liftIO $ atomically $ modifyTVar queue ((cont : forks) ++)
5665
TaskM io cont -> void . liftIO . forkIO $ do
5766
a <- io
5867
atomically $ modifyTVar queue (cont a :)

0 commit comments

Comments
 (0)