#!/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