#!/usr/bin/env stack
>
> {-# 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