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