module StmHamt.ListT where

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


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

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

tVarValue :: TVar a -> ListT STM a
tVarValue :: TVar a -> ListT STM a
tVarValue TVar a
var = STM a -> ListT STM a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (TVar a -> STM a
forall a. TVar a -> STM a
readTVar TVar a
var)