Warning! It seems that you are using Dodona within another webpage, so not everything may work properly. Let your teacher know so that he can solve the problem by adjusting a setting in the learning environment. In the meantime, you can click this link to open Dodona in a new window.
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.