module Blockchain.Database.MerklePatricia.Map (
map
) where
import Prelude hiding (map)
import Control.Monad
import qualified Data.NibbleString as N
import qualified Database.LevelDB as LDB
import Blockchain.Data.RLP
import Blockchain.Database.MerklePatricia
import Blockchain.Database.MerklePatricia.Internal
import Blockchain.Database.MerklePatricia.NodeData
map::LDB.MonadResource m=>(Key->RLPObject->m ())->MPDB->m ()
map f mpdb = do
mapNodeRef (ldb mpdb) "" f (PtrRef $ stateRoot mpdb)
mapNodeData::LDB.MonadResource m=>LDB.DB->Key->(Key->RLPObject->m ())->NodeData->m ()
mapNodeData _ _ _ EmptyNodeData = return ()
mapNodeData db partialKey f FullNodeData {choices=choices', nodeVal = maybeV} = do
forM_ (zip [0..] choices') $ \(k, ch) -> do
mapNodeRef db (partialKey `N.append` N.singleton k) f ch
case maybeV of
Nothing -> return ()
Just v -> f partialKey v
mapNodeData db partialKey f ShortcutNodeData {nextNibbleString=remainingKey, nextVal=nv} =
case nv of
Left nr -> mapNodeRef db (partialKey `N.append` remainingKey) f nr
Right v -> f (partialKey `N.append` remainingKey) v
mapNodeRef::LDB.MonadResource m=>LDB.DB->Key->(Key->RLPObject->m ())->NodeRef->m ()
mapNodeRef db partialKey f (PtrRef sr) = do
nodeData <- getNodeData (MPDB db sr) $ PtrRef sr
mapNodeData db partialKey f nodeData
mapNodeRef _ _ _ (SmallRef _) = return ()