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)