module Penny.Cabin.Posts.Meta (
M.VisibleNum(M.unVisibleNum)
, PostMeta(filteredNum, sortedNum, visibleNum, balance)
, Box
, 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
type Box = L.Box PostMeta
data PostMeta =
PostMeta { filteredNum :: Ly.FilteredNum
, sortedNum :: Ly.SortedNum
, visibleNum :: M.VisibleNum
, balance :: Maybe L.Balance }
deriving Show
addMetadata ::
[(L.Box (Ly.LibertyMeta, Maybe L.Balance))]
-> [Box]
addMetadata = M.visibleNums f where
f vn (lm, mb) =
PostMeta (Ly.filteredNum lm) (Ly.sortedNum lm) vn mb
toBoxList ::
CO.ShowZeroBalances
-> (L.Box Ly.LibertyMeta -> Bool)
-> [Ly.PostFilterFn]
-> [L.Box Ly.LibertyMeta]
-> [Box]
toBoxList szb pdct pff =
addMetadata
. Ly.processPostFilters pff
. filter (pdct . fmap fst)
. addBalances szb
addBalances ::
CO.ShowZeroBalances
-> [L.Box Ly.LibertyMeta]
-> [(L.Box (Ly.LibertyMeta, Maybe L.Balance))]
addBalances szb = snd . mapAccumL (balanceAccum szb) Nothing
balanceAccum ::
CO.ShowZeroBalances
-> Maybe L.Balance
-> L.Box Ly.LibertyMeta
-> (Maybe L.Balance, (L.Box (Ly.LibertyMeta, Maybe L.Balance)))
balanceAccum (CO.ShowZeroBalances szb) mb po =
let balThis = L.entryToBalance . Q.entry . L.boxPostFam $ po
balNew = case mb of
Nothing -> balThis
Just balOld -> L.addBalances balOld balThis
balNoZeroes = L.removeZeroCommodities balNew
bal' = if szb then Just balNew else balNoZeroes
po' = L.Box (L.boxMeta po, bal') (L.boxPostFam po)
in (bal', po')