module Database.Perdure.Incrementer (
incr
) where
import Prelude ()
import Cgm.Prelude
import Cgm.Data.Structured
import Cgm.Data.Word
import Cgm.Data.Len
import Database.Perdure.Persistent
import Database.Perdure.Space
import Cgm.Data.Multiset as MS
import Database.Perdure.SpaceBook
import Database.Perdure.Deref
import Database.Perdure.StoreFile
incr :: Persister a -> a -> SpaceBook -> SpaceBook
incr !p !a !s = case p of
PartialWordPersister _ -> s
PairPersister pb pc -> case a of (b, c) -> incr pc c $ incr pb b s
EitherPersister pb pc -> either (incr pb) (incr pc) a s
ViewPersister i pb -> incr pb (apply i a) s
SummationPersister pi' _ f -> f (\i pb _ b -> incr pb b $ incr pi' i s) a
DRefPersister' -> case a of (DRef _ _ warr) ->
let referenced = incr persister $ deref a
in either (\(WordNArrayRef _ r _) -> incrRef r referenced) (\(WordNArrayRef _ r _) -> incrRef r referenced) (unwrap warr) s
CRefPersister' _ pra -> onCRef (incr pra) (incr persister) a s
incrRef :: forall w. LgMultiple Word64 w =>
BasicRef w -> (SpaceBook -> SpaceBook) -> SpaceBook -> SpaceBook
incrRef r children cs@(SpaceBook c s) = let rs = refStart r in
if isFreeSpace (getLen rs) s
then (\(SpaceBook c' s') -> SpaceBook c' $ removeSpan (refSpan r) s') $ children cs
else SpaceBook (MS.insert rs c) s