#!/usr/bin/env stack > --stack --install-ghc runghc --package markdown-unlit -- "-pgmL markdown-unlit" > {-# LANGUAGE OverloadedStrings #-} This is a command-line Pomodoro counter. > module Pomodoro (worker) where > import Control.Concurrent (threadDelay) > import System.Process (system, rawSystem) > 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) > > 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 Haskomodoro." > 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