Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import Control.Concurrent
- import Control.Concurrent.MVar
- import Control.Monad
- data ExtendableThread = ExtendableThread {
- toDo :: MVar (IO ()),
- threadId :: ThreadId
- }
- forkIOExtendable t
- = do var <- newEmptyMVar
- let cleanup = takeMVar var >>= (>> cleanup)
- id <- forkIO (t >> cleanup)
- return $ ExtendableThread {toDo = var, threadId = id}
- --blocking
- addAction thread act = putMVar (toDo thread) act
- --non blocking
- addAction' t a = (forkIO (addAction t a)) >> return ()
- --demonstration
- main = do t <- forkIOExtendable $ putStrLn "hello"
- addAction' t $ putStrLn "world"
- addAction' t $ putStrLn "another line"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement