primitive icon indicating copy to clipboard operation
primitive copied to clipboard

add more functions that operate on MutablePrimArray

Open chessai opened this issue 7 years ago • 0 comments

I would like to see primitive have more functions that work on MutablePrimArray. Below are some of the ones I've thought might be useful.

EDIT: I have made this list more concise, leaving only type signatures to make it easier to read (especially since the implementation of all these functions is rather trivial).

-- | Create a MutablePrimArray with exactly one element
singletonMutablePrimArray
  :: forall m a. (Prim a, PrimMonad m)
  => a
  -> m (MutablePrimArray (PrimState m) a)

-- | Create a MutablePrimArray of the given length with the same value in each position
replicateMutablePrimArray
  :: forall m a. (Prim a, PrimMonad m)
  => Int
  -> a
  -> m (MutablePrimArray (PrimState m) a)

-- | Modify everything in the MutablePrimArray.
modifyMutablePrimArray
  :: forall m a. (Prim a, PrimMonad m)
  => (a -> a)
  -> MutablePrimArray (PrimState m) a
  -> m ()

-- | Map a function over a MutablePrimArray.
mapMutablePrimArray
  :: forall m a b. (Prim a, Prim b, PrimMonad m)
  => (a -> b)
  -> MutablePrimArray (PrimState m) a
  -> m (MutablePrimArray (PrimState m) b)

-- | Indexed map over the elements of a mutable primitive array.
imapMutablePrimArray
  :: forall m a b. (Prim a, Prim b, PrimMonad m)
  => (Int -> a -> b)
  -> MutablePrimArray (PrimState m) a
  -> m (MutablePrimArray (PrimState m) b)

-- | Generate a mutable prim array by evaluating the monadic generator function
-- at each index.
generateMutablePrimArray
  :: forall m a. (Prim a, PrimMonad m)
  => Int -- ^ length
  -> (Int -> m a) -- ^ generator
  -> m (MutablePrimArray (PrimState m) a)

-- | Filter elements of a mutable primitive array according to a predicate.
filterMutablePrimArray
  :: forall m a. (Prim a, PrimMonad m)
  => (a -> Bool)
  -> MutablePrimArray (PrimState m) a
  -> m (MutablePrimArray (PrimState m) a)

-- | Apply the monadic action to all elements of the MutablePrimArray, yielding a MutablePrimArray of results
mapMMutablePrimArray
  :: forall m a b. (Prim a, Prim b, PrimMonad m)
  => (a -> m b)
  -> MutablePrimArray (PrimState m) a
  -> m (MutablePrimArray (PrimState m) b)

-- | Apply the monadic action to all elements of the mutable prim array, yielding a mutable primitive array of results. Equivalent to 'flip' 'mapM'.
forMMutablePrimArray :: forall m a b. (Prim a, Prim b, PrimMonad m)
  => MutablePrimArray (PrimState m) a
  -> (a -> m b)
  -> m (MutablePrimArray (PrimState m) b)

-- swap the values at the given index
swap
  :: forall m a. (Prim a, PrimMonad m)
  => MutablePrimArray (PrimState m) a
  -> Int
  -> Int
  -> m ()

cc @andrewthad

chessai avatar May 10 '18 16:05 chessai