module T4.Report where

import T4.Data
import Util
import Data.List
import qualified Data.Set as S
import Data.Map
import Data.Time

categoryDurations :: Clocks -> Map Category NominalDiffTime
categoryDurations :: Clocks -> Map [Char] NominalDiffTime
categoryDurations = (Clock -> (Set [Char], LocalTime))
-> Clocks -> Map [Char] NominalDiffTime
forall a (f :: * -> *) entry.
(Ord a, Show a, Foldable f) =>
(entry -> (Set a, LocalTime)) -> f entry -> Map a NominalDiffTime
durations Clock -> (Set [Char], LocalTime)
select
  where select :: Clock -> (Set [Char], LocalTime)
select (In SimpleLocalTime
t (Just [Char]
c) Set [Char]
_)  = ([Char] -> Set [Char]
forall a. a -> Set a
S.singleton [Char]
c, SimpleLocalTime -> LocalTime
getLocalTime SimpleLocalTime
t)
        select Clock
c                  = (Set [Char]
forall a. Set a
S.empty,       SimpleLocalTime -> LocalTime
getLocalTime (SimpleLocalTime -> LocalTime) -> SimpleLocalTime -> LocalTime
forall a b. (a -> b) -> a -> b
$ Clock -> SimpleLocalTime
time Clock
c)

tagDurations :: Clocks -> Map Tag NominalDiffTime
tagDurations :: Clocks -> Map [Char] NominalDiffTime
tagDurations = (Clock -> (Set [Char], LocalTime))
-> Clocks -> Map [Char] NominalDiffTime
forall a (f :: * -> *) entry.
(Ord a, Show a, Foldable f) =>
(entry -> (Set a, LocalTime)) -> f entry -> Map a NominalDiffTime
durations Clock -> (Set [Char], LocalTime)
select
  where select :: Clock -> (Set [Char], LocalTime)
select (In SimpleLocalTime
t Maybe [Char]
_ Set [Char]
ts)  = (Set [Char]
ts,      SimpleLocalTime -> LocalTime
getLocalTime SimpleLocalTime
t)
        select Clock
c            = (Set [Char]
forall a. Set a
S.empty, SimpleLocalTime -> LocalTime
getLocalTime (SimpleLocalTime -> LocalTime) -> SimpleLocalTime -> LocalTime
forall a b. (a -> b) -> a -> b
$ Clock -> SimpleLocalTime
time Clock
c)

showDurMap :: Bool -> Bool -> Bool -> Map String NominalDiffTime -> [String]
showDurMap :: Bool -> Bool -> Bool -> Map [Char] NominalDiffTime -> [[Char]]
showDurMap Bool
bySnd Bool
natural Bool
secs Map [Char] NominalDiffTime
m =
  (([Char], NominalDiffTime) -> [Char])
-> [([Char], NominalDiffTime)] -> [[Char]]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\([Char]
x, NominalDiffTime
ndt) -> [Char]
x [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
": " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ DurationConfig -> NominalDiffTime -> [Char]
showDT DurationConfig
durConf NominalDiffTime
ndt) ([([Char], NominalDiffTime)] -> [([Char], NominalDiffTime)]
ordPairs ([([Char], NominalDiffTime)] -> [([Char], NominalDiffTime)])
-> [([Char], NominalDiffTime)] -> [([Char], NominalDiffTime)]
forall a b. (a -> b) -> a -> b
$ Map [Char] NominalDiffTime -> [([Char], NominalDiffTime)]
forall k a. Map k a -> [(k, a)]
toList Map [Char] NominalDiffTime
m)
  where ordPairs :: [([Char], NominalDiffTime)] -> [([Char], NominalDiffTime)]
ordPairs  = if Bool
bySnd    then (([Char], NominalDiffTime) -> NominalDiffTime)
-> [([Char], NominalDiffTime)] -> [([Char], NominalDiffTime)]
forall b a. Ord b => (a -> b) -> [a] -> [a]
sortOn ([Char], NominalDiffTime) -> NominalDiffTime
forall a b. (a, b) -> b
snd else (([Char], NominalDiffTime) -> [Char])
-> [([Char], NominalDiffTime)] -> [([Char], NominalDiffTime)]
forall b a. Ord b => (a -> b) -> [a] -> [a]
sortOn ([Char], NominalDiffTime) -> [Char]
forall a b. (a, b) -> a
fst
        showDT :: DurationConfig -> NominalDiffTime -> [Char]
showDT    = if Bool
secs     then DurationConfig -> NominalDiffTime -> [Char]
showDiffTime else DurationConfig -> NominalDiffTime -> [Char]
showRoughDiffTime
        durConf :: DurationConfig
durConf   = if Bool
natural  then DurationConfig
naturalDurationConfig
                                else DurationConfig
manDurationConfig