module PrimitiveExtras.Unfold
where

import PrimitiveExtras.Prelude hiding (fold)
import PrimitiveExtras.Types
import DeferredFolds.Unfold
import qualified PrimitiveExtras.Fold as A
import qualified PrimitiveExtras.UnliftedArray as B


primMultiArrayIndices :: PrimMultiArray a -> Unfold Int
primMultiArrayIndices (PrimMultiArray ua) =
  intsInRange 0 (pred (sizeofUnliftedArray ua))

primMultiArrayAt :: Prim prim => PrimMultiArray prim -> Int -> Unfold prim
primMultiArrayAt (PrimMultiArray ua) index =
  B.at ua index empty primArray

primArray :: Prim prim => PrimArray prim -> Unfold prim
primArray ba = Unfold $ \f z -> foldlPrimArray' f z ba