Logging in Threads

Sign in to test your solution.
import Control.Concurrent (MVar, newEmptyMVar, putMVar, takeMVar, forkIO) data Logger = Logger (MVar LogCommand) data LogCommand = Message String | Stop (MVar ()) -- Create a Logger mkLogger :: IO Logger mkLogger = do m <- newEmptyMVar let l = Logger m _ <- forkIO (runLogger l) return l -- Given a logger, read the logcommand and execute it. -- Message => print the message and wait for the next command -- Stop => print "logger: stop" runLogger :: Logger -> IO () runLogger (Logger m) = undefined -- Send a `Message` command to the logger. logMessage :: Logger -> String -> IO () logMessage (Logger m) s = putMVar m (Message s) -- Send a `Stop` command to the logger. logStop :: Logger -> IO () logStop (Logger m) = undefined -- Test, should print: -- hello -- bye -- logger: stop main :: IO () main = do l <- mkLogger logMessage l "hello" logMessage l "bye" logStop l
You can submit as many times as you like. Only your latest submission will be taken into account.
Sign in to test your solution.