module PrimitiveExtras.UnfoldM where import PrimitiveExtras.Prelude hiding (fold) import PrimitiveExtras.Types import DeferredFolds.UnfoldM import qualified PrimitiveExtras.Fold as A import qualified PrimitiveExtras.UnliftedArray as B primMultiArrayIndices :: Monad m => PrimMultiArray a -> UnfoldM m Int primMultiArrayIndices (PrimMultiArray ua) = intsInRange 0 (pred (sizeofUnliftedArray ua)) primMultiArrayAt :: (Monad m, Prim prim) => PrimMultiArray prim -> Int -> UnfoldM m prim primMultiArrayAt (PrimMultiArray ua) index = B.at ua index empty primArray primArray :: (Monad m, Prim prim) => PrimArray prim -> UnfoldM m prim primArray ba = UnfoldM $ \f z -> foldlPrimArrayM' f z ba