This is a command-line Pomodoro counter. > module Pomodoro (worker) where > import Control.Concurrent (threadDelay) > import System.Console.ANSI (clearLine, > clearFromCursorToScreenEnd, > setCursorColumn, > hideCursor, > showCursor, > saveCursor, > restoreCursor) > import System.Environment (getArgs) > import System.IO (hFlush, > stdout) > import Timer (secToTimestamp) > > data Pomodoro = First | Second | Third | Fourth > deriving (Eq, Ord, Show, Read, Bounded, Enum) > -- | Manage Pomodoro sessions > -- Examples: > -- > -- >>> putStrLn "Hello world!" > -- Hello world! > -- > -- >>> putStrLn "Test complete!" > -- Test complete! > pom m = do > putStr $ show m ++ " pomodoro" ++ " | " > saveCursor > wait_seconds $ 25 * 60 + 1 > restoreCursor > putStrLn "Finished, take a 5 minute rest." > to_work = do > saveCursor > putStr "Get back to work" > delay 2 > restoreCursor > clearLine > pomodoro Fourth = do > pom Fourth > putStrLn "Take a 30-minute rest now. You just completed 4 pomodoros." > putStrLn "Thank you for tracking your time with Monadoro." > pomodoro m = do > pom m > delay $ 5 * 60 > to_work > pomodoro $ succ m > > wait_seconds :: Int -> IO() > wait_seconds 0 = do > putStr "" > wait_seconds n = do > restoreCursor > putStr $ secToTimestamp $ n - 1 > hFlush stdout > delay 1 > wait_seconds $ n - 1 > delay :: Int -> IO() > delay n = del n > > del :: Int -> IO() > del n = do > threadDelay $ n * 1000 * 1000 > > no_del :: Int -> IO() > no_del n = do > return () > > worker :: IO() > worker = do > pomodoro First > > main :: IO() > main = do > worker