module Penny.Cabin.Posts.Meta
( M.VisibleNum(M.unVisibleNum)
, PostMeta(filteredNum, sortedNum, visibleNum, balance)
, toBoxList
) where
import Data.List (mapAccumL)
import qualified Penny.Lincoln as L
import qualified Penny.Lincoln.Queries as Q
import qualified Penny.Liberty as Ly
import qualified Penny.Cabin.Meta as M
import qualified Penny.Cabin.Options as CO
import qualified Data.Prednote as Pe
import Data.Monoid (mempty, mappend)
data PostMeta = PostMeta
{ filteredNum :: Ly.FilteredNum
, sortedNum :: Ly.SortedNum
, visibleNum :: M.VisibleNum
, balance :: L.Balance }
deriving Show
addMetadata
:: [(L.Balance, (Ly.LibertyMeta, L.Posting))]
-> [(PostMeta, L.Posting)]
addMetadata = L.serialItems f where
f ser (bal, (lm, p)) = (pm, p)
where
pm = PostMeta
{ filteredNum = Ly.filteredNum lm
, sortedNum = Ly.sortedNum lm
, visibleNum = M.VisibleNum ser
, balance = bal
}
toBoxList
:: CO.ShowZeroBalances
-> Pe.Predbox (Ly.LibertyMeta, L.Posting)
-> [Ly.PostFilterFn]
-> [(Ly.LibertyMeta, L.Posting)]
-> [(PostMeta, L.Posting)]
toBoxList szb pdct pff
= addMetadata
. Ly.processPostFilters pff
. filter (Pe.rBool . Pe.evaluate pdct . snd)
. addBalances szb
addBalances
:: CO.ShowZeroBalances
-> [(a, L.Posting)]
-> [(L.Balance, (a, L.Posting))]
addBalances szb = snd . mapAccumL (balanceAccum szb) mempty
balanceAccum
:: CO.ShowZeroBalances
-> L.Balance
-> (a, L.Posting)
-> (L.Balance, (L.Balance, (a, L.Posting)))
balanceAccum (CO.ShowZeroBalances szb) balOld (x, po) =
let balThis = either L.entryToBalance L.entryToBalance
. Q.entry $ po
balNew = mappend balOld balThis
balNoZeroes = L.removeZeroCommodities balNew
bal' = if szb then balNew else balNoZeroes
po' = (bal', (x, po))
in (bal', po')