Monadoro-0.3.5.0: src/Pomodoro.lhs
#!/usr/bin/env stack
> --stack --install-ghc runghc
This is a command-line Pomodoro counter.
> module Pomodoro (session) where
> import Control.Concurrent (threadDelay)
> import Data.Time.Clock.POSIX (posixSecondsToUTCTime)
> import Data.Time.Format (formatTime, defaultTimeLocale)
> import Display (display)
>
> data Pomodoro = First | Second | Third | Fourth
> deriving (Eq, Ord, Show, Read, Bounded, Enum)
> {-| Given an integer number of seconds, secToTimestamp
> returns the corresponding time in MM:SS.
>
> >>> secToTimestamp 0
> "00:00"
> >>> secToTimestamp 1500
> "25:00"
> >>> secToTimestamp 3000
> "50:00"
> -}
>
> secToTimestamp :: Int -> String
> secToTimestamp = formatTime defaultTimeLocale "%M:%S" . posixSecondsToUTCTime . fromIntegral
> -- | Manage Pomodoro sessions
> --
> -- Examples:
> --
> -- >>> putStrLn "Hello world!"
> -- Hello world!
> --
> -- >>> putStrLn "Test complete!"
> -- Test complete!
> -- | Replace a delay with no delay for testing purposes.
> no_del :: Int -> IO()
> no_del _ = do
> return ()
> pom :: Show a => IO () -> a -> IO ()
> pom delay m = do
> let prefix = show m ++ " pomodoro" ++ " | "
> wait_seconds delay prefix $ 25 * 60 + 1
> putStrLn "Finished, take a 5 minute rest."
> rest :: IO () -> Int -> IO ()
> rest delay minutes = do
> let prefix = "Rest time" ++ " | "
> wait_seconds delay prefix $ minutes * 60 + 1
> pomodoro :: IO () -> Pomodoro -> IO ()
> pomodoro delay Fourth = do
> pom delay Fourth
> putStrLn "Take a 30-minute rest now. You just completed 4 pomodoros."
> putStrLn "Congratulations on 4 pomodoros finished in a row!"
> pomodoro delay m = do
> pom delay m
> rest delay 5
> putStrLn "Get back to work." >> delay
> pomodoro delay $ succ m
>
> wait_seconds :: IO () -> String -> Int -> IO()
> wait_seconds delay prefix 0 = display ""
> wait_seconds delay prefix n = do
> display $ prefix ++ (secToTimestamp (n - 1))
> delay
> wait_seconds delay prefix $ n - 1
> session :: IO() -> IO()
> session delay = pomodoro delay First