module StmHamt.ListT where

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

hamtElements :: Hamt a -> ListT STM a
hamtElements :: forall a. 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 a b. ListT STM a -> (a -> ListT STM b) -> ListT STM b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= By6Bits (Branch a) -> ListT STM (Branch a)
forall (m :: * -> *) a. Monad m => By6Bits a -> ListT m a
By6Bits.elementsListT ListT STM (Branch a) -> (Branch a -> ListT STM a) -> ListT STM a
forall a b. ListT STM a -> (a -> ListT STM b) -> ListT STM b
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

hamtElementsNonAtomic :: Hamt a -> ListT IO a
hamtElementsNonAtomic :: forall a. Hamt a -> ListT IO a
hamtElementsNonAtomic (Hamt TVar (By6Bits (Branch a))
var) = TVar (By6Bits (Branch a)) -> ListT IO (By6Bits (Branch a))
forall a. TVar a -> ListT IO a
tVarValueIO TVar (By6Bits (Branch a))
var ListT IO (By6Bits (Branch a))
-> (By6Bits (Branch a) -> ListT IO (Branch a))
-> ListT IO (Branch a)
forall a b. ListT IO a -> (a -> ListT IO b) -> ListT IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= By6Bits (Branch a) -> ListT IO (Branch a)
forall (m :: * -> *) a. Monad m => By6Bits a -> ListT m a
By6Bits.elementsListT ListT IO (Branch a) -> (Branch a -> ListT IO a) -> ListT IO a
forall a b. ListT IO a -> (a -> ListT IO b) -> ListT IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Branch a -> ListT IO a
forall a. Branch a -> ListT IO a
branchElementsNonAtomic

branchElements :: Branch a -> ListT STM a
branchElements :: forall a. 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

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

tVarValue :: TVar a -> ListT STM a
tVarValue :: forall a. TVar a -> ListT STM a
tVarValue TVar a
var = STM a -> ListT STM a
forall (m :: * -> *) a. Monad m => m a -> ListT m 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)

tVarValueIO :: TVar a -> ListT IO a
tVarValueIO :: forall a. TVar a -> ListT IO a
tVarValueIO TVar a
var = IO a -> ListT IO a
forall (m :: * -> *) a. Monad m => m a -> ListT m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (TVar a -> IO a
forall a. TVar a -> IO a
readTVarIO TVar a
var)