module StmHamt.UnfoldlM where

import DeferredFolds.UnfoldlM
import qualified PrimitiveExtras.By6Bits as By6Bits
import qualified PrimitiveExtras.SmallArray as SmallArray
import StmHamt.Prelude hiding (all, filter)
import StmHamt.Types

hamtElements :: Hamt a -> UnfoldlM STM a
hamtElements :: forall a. Hamt a -> UnfoldlM STM a
hamtElements (Hamt TVar (By6Bits (Branch a))
var) = TVar (By6Bits (Branch a)) -> UnfoldlM STM (By6Bits (Branch a))
forall a. TVar a -> UnfoldlM STM a
tVarValue TVar (By6Bits (Branch a))
var UnfoldlM STM (By6Bits (Branch a))
-> (By6Bits (Branch a) -> UnfoldlM STM (Branch a))
-> UnfoldlM STM (Branch a)
forall a b.
UnfoldlM STM a -> (a -> UnfoldlM STM b) -> UnfoldlM STM b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= By6Bits (Branch a) -> UnfoldlM STM (Branch a)
forall (m :: * -> *) a. Monad m => By6Bits a -> UnfoldlM m a
By6Bits.elementsUnfoldlM UnfoldlM STM (Branch a)
-> (Branch a -> UnfoldlM STM a) -> UnfoldlM STM a
forall a b.
UnfoldlM STM a -> (a -> UnfoldlM STM b) -> UnfoldlM STM b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Branch a -> UnfoldlM STM a
forall a. Branch a -> UnfoldlM STM a
branchElements

branchElements :: Branch a -> UnfoldlM STM a
branchElements :: forall a. Branch a -> UnfoldlM STM a
branchElements = \case
  LeavesBranch Int
_ SmallArray a
array -> SmallArray a -> UnfoldlM STM a
forall (m :: * -> *) e. Monad m => SmallArray e -> UnfoldlM m e
SmallArray.elementsUnfoldlM SmallArray a
array
  BranchesBranch Hamt a
hamt -> Hamt a -> UnfoldlM STM a
forall a. Hamt a -> UnfoldlM STM a
hamtElements Hamt a
hamt