more code cleanups
This commit is contained in:
parent
628c4241f3
commit
a1d10691a3
@ -164,21 +164,22 @@ showBalanceReport opts args l = acctsstr ++ totalstr
|
||||
-- eliding boring parent accounts. Requires a list of the account names we
|
||||
-- are interested in to help with that.
|
||||
showAccountTreeWithBalances :: [AccountName] -> Tree Account -> String
|
||||
showAccountTreeWithBalances matchedacctnames =
|
||||
showAccountTreeWithBalances' matchedacctnames 0 ""
|
||||
showAccountTreeWithBalances matchednames =
|
||||
showAccountTreeWithBalances' matchednames 0 ""
|
||||
where
|
||||
showAccountTreeWithBalances' :: [AccountName] -> Int -> String -> Tree Account -> String
|
||||
showAccountTreeWithBalances' matchedacctnames indentlevel prefix (Node (Account fullname _ bal) subs) =
|
||||
if isboringparent then showsubswithprefix else showacct ++ showsubswithindent
|
||||
showAccountTreeWithBalances' matchednames indent prefix (Node (Account fullname _ bal) subs)
|
||||
| not isboringparent = this ++ subswithindent
|
||||
| otherwise = subswithprefix
|
||||
where
|
||||
showsubswithprefix = showsubs indentlevel (prefix++leafname++":")
|
||||
showsubswithindent = showsubs (indentlevel+1) ""
|
||||
showsubs i p = concatMap (showAccountTreeWithBalances' matchedacctnames i p) subs
|
||||
showacct = showbal ++ " " ++ indent ++ prefix ++ leafname ++ "\n"
|
||||
subswithindent = showsubs (indent+1) ""
|
||||
subswithprefix = showsubs indent (prefix++leafname++":")
|
||||
showsubs i p = concatMap (showAccountTreeWithBalances' matchednames i p) subs
|
||||
this = showbal ++ spaces ++ prefix ++ leafname ++ "\n"
|
||||
showbal = printf "%20s" $ show bal
|
||||
indent = replicate (indentlevel * 2) ' '
|
||||
spaces = " " ++ replicate (indent * 2) ' '
|
||||
leafname = accountLeafName fullname
|
||||
isboringparent = numsubs >= 1 && (bal == subbal || not matched)
|
||||
numsubs = length subs
|
||||
subbal = abalance $ root $ head subs
|
||||
matched = fullname `elem` matchedacctnames
|
||||
isboringparent = numsubs >= 1 && (bal == subbal || not matched)
|
||||
matched = fullname `elem` matchednames
|
||||
|
||||
@ -15,24 +15,6 @@ import Ledger.Amount
|
||||
|
||||
instance Show Entry where show = showEntry
|
||||
|
||||
{-
|
||||
Helpers for the register report. A register entry is displayed as two
|
||||
or more lines like this:
|
||||
|
||||
@
|
||||
date description account amount balance
|
||||
DDDDDDDDDD dddddddddddddddddddd aaaaaaaaaaaaaaaaaaaaaa AAAAAAAAAAA AAAAAAAAAAAA
|
||||
aaaaaaaaaaaaaaaaaaaaaa AAAAAAAAAAA AAAAAAAAAAAA
|
||||
... ... ...
|
||||
|
||||
datewidth = 10
|
||||
descwidth = 20
|
||||
acctwidth = 22
|
||||
amtwidth = 11
|
||||
balwidth = 12
|
||||
@
|
||||
-}
|
||||
|
||||
showEntryDescription e =
|
||||
(showDate $ edate e) ++ " " ++ (showDescription $ edescription e) ++ " "
|
||||
showDate d = printf "%-10s" d
|
||||
|
||||
@ -12,27 +12,36 @@ import Options
|
||||
|
||||
-- | Print a register report.
|
||||
register :: [Opt] -> [String] -> Ledger -> IO ()
|
||||
register opts args l = putStr $ showTransactionsWithBalances opts args l
|
||||
register opts args l = putStr $ showRegisterReport opts args l
|
||||
|
||||
showTransactionsWithBalances :: [Opt] -> [String] -> Ledger -> String
|
||||
showTransactionsWithBalances opts args l =
|
||||
unlines $ showTransactionsWithBalances' ts nulltxn startingbalance
|
||||
where
|
||||
ts = filter matchtxn $ ledgerTransactions l
|
||||
matchtxn (Transaction _ _ desc acct _ _) = matchLedgerPatterns False apats acct
|
||||
apats = fst $ parseAccountDescriptionArgs args
|
||||
startingbalance = nullamt
|
||||
showTransactionsWithBalances' :: [Transaction] -> Transaction -> Amount -> [String]
|
||||
showTransactionsWithBalances' [] _ _ = []
|
||||
showTransactionsWithBalances' (t@Transaction{amount=a}:ts) tprev b =
|
||||
(if isZeroAmount a then [] else this) ++ rest
|
||||
where
|
||||
b' = b + (amount t)
|
||||
sameentry (Transaction {entryno=e1}) (Transaction {entryno=e2}) = e1 == e2
|
||||
this = if sameentry t tprev
|
||||
then [showTransactionWithoutDescription t b']
|
||||
else [showTransactionWithDescription t b']
|
||||
rest = showTransactionsWithBalances' ts t b'
|
||||
{- |
|
||||
Generate the register report. Each ledger entry is displayed as two or
|
||||
more lines like this:
|
||||
|
||||
@
|
||||
date (10) description (20) account (22) amount (11) balance (12)
|
||||
DDDDDDDDDD dddddddddddddddddddd aaaaaaaaaaaaaaaaaaaaaa AAAAAAAAAAA AAAAAAAAAAAA
|
||||
aaaaaaaaaaaaaaaaaaaaaa AAAAAAAAAAA AAAAAAAAAAAA
|
||||
... ... ...
|
||||
@
|
||||
-}
|
||||
showRegisterReport :: [Opt] -> [String] -> Ledger -> String
|
||||
showRegisterReport opts args l = showtxns ts nulltxn nullamt
|
||||
where
|
||||
ts = filter matchtxn $ ledgerTransactions l
|
||||
matchtxn Transaction{account=a} = matchLedgerPatterns False apats a
|
||||
apats = fst $ parseAccountDescriptionArgs args
|
||||
|
||||
-- show transactions, one per line, keeping a running balance
|
||||
showtxns [] _ _ = ""
|
||||
showtxns (t@Transaction{amount=a}:ts) tprev bal =
|
||||
(if isZeroAmount a then "" else this) ++ showtxns ts t bal'
|
||||
where
|
||||
this = if t `issame` tprev
|
||||
then showTransactionWithoutDescription t bal'
|
||||
else showTransactionWithDescription t bal'
|
||||
issame t1 t2 = entryno t1 == entryno t2
|
||||
bal' = bal + amount t
|
||||
|
||||
showTransactionWithDescription :: Transaction -> Amount -> String
|
||||
showTransactionWithDescription t b =
|
||||
|
||||
2
Tests.hs
2
Tests.hs
@ -218,7 +218,7 @@ registercommandtests = TestList [
|
||||
"register does something" ~:
|
||||
do
|
||||
l <- ledgerfromfile "sample.ledger"
|
||||
assertnotequal "" $ showTransactionsWithBalances [] [] l
|
||||
assertnotequal "" $ showRegisterReport [] [] l
|
||||
]
|
||||
|
||||
-- | Assert a parsed thing equals some expected thing, or print a parse error.
|
||||
|
||||
Loading…
Reference in New Issue
Block a user