module Penny.Cabin.Meta (VisibleNum, unVisibleNum,
visibleNumBoxes, visibleNums ) where
import Control.Applicative ((*>))
import qualified Data.Traversable as Tr
import qualified Penny.Lincoln as L
newtype VisibleNum = VisibleNum { unVisibleNum :: L.Serial }
deriving (Eq, Show)
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
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