{-# LANGUAGE TemplateHaskell #-} {-| Print a bar chart of posting activity per day, or other report interval. -} module Hledger.Cli.Commands.Activity where import Data.List (sortOn) import Text.Printf (printf) import Lens.Micro ((^.), set) import Hledger import Hledger.Cli.CliOptions activitymode = hledgerCommandMode $(embedFileRelative "Hledger/Cli/Commands/Activity.txt") [] cligeneralflagsgroups1 hiddenflags ([], Just $ argsFlag "[QUERY]") barchar :: Char barchar = '*' -- | Print a bar chart of number of postings per report interval. activity :: CliOpts -> Journal -> IO () activity CliOpts{reportspec_=rspec} j = putStr $ showHistogram rspec j showHistogram :: ReportSpec -> Journal -> String showHistogram rspec@ReportSpec{_rsQuery=q} j = concatMap (printDayWith countBar) spanps where mspans = snd . reportSpan j $ case rspec ^. interval of NoInterval -> set interval (Days 1) rspec _ -> rspec spanps = case mspans of Nothing -> [] Just x -> map (\spn -> (spn, filter (postingInRange spn) ps)) . snd $ periodDataToList x postingInRange (b, e) p = postingDate p >= b && postingDate p < e -- same as Register -- should count transactions, not postings ? -- ps = sortBy (comparing postingDate) $ filterempties $ filter matchapats $ filterdepth $ journalPostings j ps = sortOn postingDate $ filter (q `matchesPosting`) $ journalPostings j printDayWith f ((b, _), ps) = printf "%s %s\n" (show b) (f ps) countBar ps = replicate (length ps) barchar