module WorkTime.Reporting
( hoursFromText
, hoursFromFile
, hours
)
where
import Data.Void ( Void )
import Text.Megaparsec ( Token
, ParseError
)
import Control.Applicative ( (<$>) )
import WorkTime.WorkTime ( fromText
, workTimeHours
, workTimeNickname
, WorkTime
)
import Data.Text ( Text )
import qualified Data.Text.IO as TIO
import Data.Map.Strict ( Map )
import qualified Data.Map.Strict as Map
hoursFromText :: Text -> Either (ParseError (Token Text) Void) [(Text, Double)]
hoursFromText = (Map.toList . hours <$>) . fromText
hoursFromFile
:: FilePath -> IO (Either (ParseError (Token Text) Void) [(Text, Double)])
hoursFromFile = fmap hoursFromText . TIO.readFile
hours :: [WorkTime] -> Map Text Double
hours = Map.fromListWith (+) . map entryHours
entryHours :: WorkTime -> (Text, Double)
entryHours workTime = (workTimeNickname workTime, workTimeHours workTime)