packages feed

nptools-0.2.1: what-I-have-done-today.hs

{-# LANGUAGE PatternGuards #-}
import System.Locale (defaultTimeLocale)
import System.Environment (getEnv)
import Data.Time.Clock (DiffTime, UTCTime(..), getCurrentTime)
import Data.Time.LocalTime
import Data.Time.Format (readTime, formatTime)
import Control.Monad
import Control.Applicative
import Control.Arrow
import Data.Maybe
import Data.List
import Data.Function
import Data.Ord

readMyTime :: String -> UTCTime
readMyTime = readTime defaultTimeLocale "%T%Q"

splitEvent :: String -> String -> Maybe (String, UTCTime)
splitEvent today event =
   case words event of
     date : time : _ : "tags:" : tags | [tag] <- tags ->
                                          guard (date == today) >> Just (tag, readMyTime time)
                                      | otherwise -> Nothing
     _ -> error ("splitEvent: " ++ event)

formatDiffTime :: DiffTime -> String
formatDiffTime = formatTime defaultTimeLocale "%T%Q" . timeToTimeOfDay

pack :: (Ord a) => [(a, b)] -> [(a, [b])]
pack = map ((fst . head) &&& map snd)
     . groupBy ((==) `on` fst)
     . sortBy (comparing fst)


work :: String -> [String] -> String
work today = unlines . map (uncurry (++) . second ((": "++) . formatDiffTime))
           . sortBy (comparing snd)
           . map (second sum) . pack . uncurry zip
           . second ((map (uncurry (flip (-)))) . (zip`ap`tail) . map utctDayTime)
           . unzip . catMaybes . map (splitEvent today)

main :: IO ()
main =
  do now <- getCurrentTime
     eventsFile <- getEnv "EVENTS_LOG"
     let today = formatTime defaultTimeLocale "%Y-%m-%d" now
     events <- lines <$> readFile eventsFile
     putStr $ work today events