The first of several conversions from String to (strict) Text, hopefully reducing space and time usage. This one shows a small improvement, with GHC 7.10.3 and text-1.2.2.1: hledger -f data/100x100x10.journal stats string: <<ghc: 39471064 bytes, 77 GCs, 198421/275048 avg/max bytes residency (3 samples), 2M in use, 0.000 INIT (0.001 elapsed), 0.015 MUT (0.020 elapsed), 0.010 GC (0.014 elapsed) :ghc>> text: <<ghc: 39268024 bytes, 77 GCs, 197018/270840 avg/max bytes residency (3 samples), 2M in use, 0.000 INIT (0.002 elapsed), 0.016 MUT (0.022 elapsed), 0.009 GC (0.011 elapsed) :ghc>> hledger -f data/1000x100x10.journal stats string: <<ghc: 318555920 bytes, 617 GCs, 2178997/7134472 avg/max bytes residency (7 samples), 16M in use, 0.000 INIT (0.001 elapsed), 0.129 MUT (0.136 elapsed), 0.067 GC (0.077 elapsed) :ghc>> text: <<ghc: 314248496 bytes, 612 GCs, 2074045/6617960 avg/max bytes residency (7 samples), 16M in use, 0.000 INIT (0.003 elapsed), 0.137 MUT (0.145 elapsed), 0.067 GC (0.079 elapsed) :ghc>> hledger -f data/10000x100x10.journal stats string: <<ghc: 3114763608 bytes, 6026 GCs, 18858950/75552024 avg/max bytes residency (11 samples), 201M in use, 0.000 INIT (0.000 elapsed), 1.331 MUT (1.372 elapsed), 0.699 GC (0.812 elapsed) :ghc>> text: <<ghc: 3071468920 bytes, 5968 GCs, 14120344/62951360 avg/max bytes residency (9 samples), 124M in use, 0.000 INIT (0.003 elapsed), 1.272 MUT (1.349 elapsed), 0.513 GC (0.578 elapsed) :ghc>> hledger -f data/100000x100x10.journal stats string: <<ghc: 31186579432 bytes, 60278 GCs, 135332581/740228992 avg/max bytes residency (13 samples), 1697M in use, 0.000 INIT (0.008 elapsed), 14.677 MUT (15.508 elapsed), 7.081 GC (8.074 elapsed) :ghc>> text: <<ghc: 30753427672 bytes, 59763 GCs, 117595958/666457240 avg/max bytes residency (14 samples), 1588M in use, 0.000 INIT (0.008 elapsed), 13.713 MUT (13.966 elapsed), 6.220 GC (7.108 elapsed) :ghc>>
68 lines
2.4 KiB
Haskell
68 lines
2.4 KiB
Haskell
{-|
|
|
|
|
The @accounts@ command lists account names:
|
|
|
|
- in flat mode (default), it lists the full names of accounts posted to by matched postings,
|
|
clipped to the specified depth, possibly with leading components dropped.
|
|
|
|
- in tree mode, it shows the indented short names of accounts posted to by matched postings,
|
|
and their parents, to the specified depth.
|
|
|
|
-}
|
|
|
|
{-# LANGUAGE OverloadedStrings #-}
|
|
|
|
module Hledger.Cli.Accounts (
|
|
accountsmode
|
|
,accounts
|
|
,tests_Hledger_Cli_Accounts
|
|
) where
|
|
|
|
import Data.List
|
|
import Data.Monoid
|
|
-- import Data.Text (Text)
|
|
import qualified Data.Text as T
|
|
import System.Console.CmdArgs.Explicit as C
|
|
import Test.HUnit
|
|
|
|
import Hledger
|
|
import Prelude hiding (putStrLn)
|
|
import Hledger.Utils.UTF8IOCompat (putStrLn)
|
|
import Hledger.Cli.CliOptions
|
|
|
|
|
|
-- | Command line options for this command.
|
|
accountsmode = (defCommandMode $ ["accounts"] ++ aliases) {
|
|
modeHelp = "show account names" `withAliases` aliases
|
|
,modeHelpSuffix = [
|
|
"This command lists the accounts referenced by matched postings (and in tree mode, their parents as well). The accounts can be depth-clipped (--depth N) or have their leading parts trimmed (--drop N)."
|
|
]
|
|
,modeGroupFlags = C.Group {
|
|
groupUnnamed = [
|
|
flagNone ["tree"] (\opts -> setboolopt "tree" opts) "show short account names, as a tree"
|
|
,flagNone ["flat"] (\opts -> setboolopt "flat" opts) "show full account names, as a list (default)"
|
|
,flagReq ["drop"] (\s opts -> Right $ setopt "drop" s opts) "N" "flat mode: omit N leading account name parts"
|
|
]
|
|
,groupHidden = []
|
|
,groupNamed = [generalflagsgroup1]
|
|
}
|
|
}
|
|
where aliases = []
|
|
|
|
-- | The accounts command.
|
|
accounts :: CliOpts -> Journal -> IO ()
|
|
accounts CliOpts{reportopts_=ropts} j = do
|
|
d <- getCurrentDay
|
|
let q = queryFromOpts d ropts
|
|
nodepthq = dbg1 "nodepthq" $ filterQuery (not . queryIsDepth) q
|
|
depth = dbg1 "depth" $ queryDepth $ filterQuery queryIsDepth q
|
|
ps = dbg1 "ps" $ journalPostings $ filterJournalPostings nodepthq j
|
|
as = dbg1 "as" $ nub $ filter (not . T.null) $ map (clipAccountName depth) $ sort $ map paccount ps
|
|
as' | tree_ ropts = expandAccountNames as
|
|
| otherwise = as
|
|
render a | tree_ ropts = T.replicate (2 * (accountNameLevel a - 1)) " " <> accountLeafName a
|
|
| otherwise = maybeAccountNameDrop ropts a
|
|
mapM_ (putStrLn . T.unpack . render) as'
|
|
|
|
tests_Hledger_Cli_Accounts = TestList []
|