packages feed

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