diff --git a/Makefile b/Makefile index 9a01fed..02fde8f 100644 --- a/Makefile +++ b/Makefile @@ -18,8 +18,11 @@ SAMPLES = \ sudoku4 \ sudoku5 \ fork \ + reminders \ + reminders2 \ mvar1 \ mvar2 \ + mvar3 \ logger \ geturls \ geturlscancel \ diff --git a/logger.hs b/logger.hs index f3aa93b..2db29cd 100644 --- a/logger.hs +++ b/logger.hs @@ -3,38 +3,47 @@ import Control.Monad -- ----------------------------------------------------------------------------- --- <> + +-- <> +-- < IO () logger (Logger m) = forever $ do cmd <- takeMVar m case cmd of - Message msg -> do - threadDelay 10000 + Message msg -> putStrLn msg Stop s -> do putStrLn "logger: stop" putMVar s () +-- >> +-- < String -> IO () logMessage (Logger m) s = putMVar m (Message s) +-- >> +-- < IO () logStop (Logger m) = do s <- newEmptyMVar putMVar m (Stop s) takeMVar s +-- >> +-- <
> diff --git a/reminders.hs b/reminders.hs index e8bad21..a1fc2ed 100644 --- a/reminders.hs +++ b/reminders.hs @@ -5,13 +5,13 @@ import Control.Monad main = forever $ do - l <- getLine -- <1> - forkIO $ setReminder (read l) -- <2> + s <- getLine -- <1> + forkIO $ setReminder s -- <2> -setReminder :: Int -> IO () -setReminder t = do +setReminder :: String -> IO () +setReminder s = do + let t = read s :: Int printf "Ok, I'll remind you in %d seconds\n" t threadDelay (10^6 * t) -- <3> printf "%d seconds is up! BING!\BEL\n" t -- <4> -- >> - diff --git a/reminders2.hs b/reminders2.hs new file mode 100644 index 0000000..048bdc7 --- /dev/null +++ b/reminders2.hs @@ -0,0 +1,21 @@ +import Control.Concurrent +import Text.Printf +import Control.Monad + +-- <
+ if s == "exit" + then return () + else do forkIO $ setReminder s -- <2> + loop +-- >> + +setReminder :: String -> IO () +setReminder s = do + let t = read s :: Int + printf "Ok, I'll remind you in %d seconds\n" t + threadDelay (10^6 * t) -- <3> + printf "%d seconds is up! BING!\BEL\n" t -- <4>