penny-lib-0.6.0.0: Penny/Cabin/Meta.hs
-- | Metadata that is specific to Cabin.
module Penny.Cabin.Meta (VisibleNum, unVisibleNum,
visibleNumBoxes, visibleNums ) where
import Control.Applicative ((*>))
import qualified Data.Traversable as Tr
import qualified Penny.Lincoln as L
-- | Each row that is visible on screen is assigned a VisibleNum. This
-- is used to number the rows in the report for the user's benefit. It
-- is also used to determine whether the row is even or odd for the
-- purpose of assigning the background color (this way the background
-- colors can alternate, like a checkbook register.)
newtype VisibleNum = VisibleNum { unVisibleNum :: L.Serial }
deriving (Eq, Show)
-- | Assigns VisibleNum to a list of boxes.
visibleNumBoxes ::
(VisibleNum -> a -> b)
-> [L.Box a]
-> [L.Box b]
visibleNumBoxes f bs = L.makeSerials k
where
k = Tr.sequenceA (replicate (length bs) L.incrementBack)
*> mapM assign bs
assign (L.Box m pf) = fmap g L.getSerial
where
g ser = L.Box (f (VisibleNum ser) m) pf
-- | Assigns VisibleNum to a list.
visibleNums :: (VisibleNum -> a -> b) -> [a] -> [b]
visibleNums f as = L.makeSerials k
where
k = Tr.sequenceA (replicate (length as) L.incrementBack)
*> mapM assign as
assign a = fmap (\ser -> f (VisibleNum ser) a) L.getSerial