module Data.TTask.Analysis ( DailyStatuses(..) , dailyGroup , summaryPointBy ) where import Control.Lens import Data.List import Data.Maybe import Data.Time import Data.TTask.Types data DailyStatuses = DailyStatuses { dayStDay :: Day , dayStPoint :: Point , dayStStatuses :: [StatusLogRec] } dailyGroup :: [StatusLogRec] -> [DailyStatuses] dailyGroup = catMaybes . map sr2ds . dailyGrouping where sr2ds :: [StatusLogRec] -> Maybe DailyStatuses sr2ds srs = do (d, p) <- calcDaylyPoint srs return $ DailyStatuses { dayStDay = d , dayStPoint = p , dayStStatuses = srs } ---- calcDaylyPoint :: [StatusLogRec] -> Maybe (Day, Point) calcDaylyPoint [] = Nothing calcDaylyPoint xs@(x:_) = Just . (,) (getDay x) $ summaryPointBy isFinishedTask xs where isFinishedTask :: StatusLogRec -> Bool isFinishedTask r = r^.getLogStatus.isFinished && r^.getLogContents.isTask dailyGrouping :: [StatusLogRec] -> [[StatusLogRec]] dailyGrouping = groupBy (\l r -> getDay l == getDay r) . sortRecord where sortRecord :: [StatusLogRec] -> [StatusLogRec] sortRecord = sortBy (\l r -> getTime l `compare` getTime r) ---- summaryPointBy :: (StatusLogRec -> Bool) -> [StatusLogRec] -> Point summaryPointBy f = foldl (+) 0 . map getPoint . filter f getDay :: StatusLogRec -> Day getDay = localDay . getTime getTime :: StatusLogRec -> LocalTime getTime = (^.getLogStatus.getStatusTime) getPoint :: StatusLogRec -> Point getPoint = (^.getLogContents.point)