| Copyright | (c) Alexey Kuleshevich 2018-2019 |
|---|---|
| License | BSD3 |
| Maintainer | Alexey Kuleshevich <lehins@yandex.ru> |
| Stability | experimental |
| Portability | non-portable |
| Safe Haskell | None |
| Language | Haskell2010 |
Data.Massiv.Array.Mutable
Contents
Description
Synopsis
- msize :: Mutable r ix e => MArray s r ix e -> Sz ix
- read :: (Mutable r ix e, PrimMonad m) => MArray (PrimState m) r ix e -> ix -> m (Maybe e)
- read' :: (Mutable r ix e, PrimMonad m) => MArray (PrimState m) r ix e -> ix -> m e
- write :: (Mutable r ix e, PrimMonad m) => MArray (PrimState m) r ix e -> ix -> e -> m Bool
- write' :: (Mutable r ix e, PrimMonad m) => MArray (PrimState m) r ix e -> ix -> e -> m ()
- modify :: (Mutable r ix e, PrimMonad m) => MArray (PrimState m) r ix e -> (e -> e) -> ix -> m Bool
- modify' :: (Mutable r ix e, PrimMonad m) => MArray (PrimState m) r ix e -> (e -> e) -> ix -> m ()
- swap :: (Mutable r ix e, PrimMonad m) => MArray (PrimState m) r ix e -> ix -> ix -> m Bool
- swap' :: (Mutable r ix e, PrimMonad m) => MArray (PrimState m) r ix e -> ix -> ix -> m ()
- new :: forall r ix e m. (Mutable r ix e, PrimMonad m) => Sz ix -> m (MArray (PrimState m) r ix e)
- thaw :: forall r ix e m. (Mutable r ix e, MonadIO m) => Array r ix e -> m (MArray RealWorld r ix e)
- thawS :: forall r ix e m. (Mutable r ix e, PrimMonad m) => Array r ix e -> m (MArray (PrimState m) r ix e)
- freeze :: forall r ix e m. (Mutable r ix e, MonadIO m) => Comp -> MArray RealWorld r ix e -> m (Array r ix e)
- freezeS :: forall r ix e m. (Mutable r ix e, PrimMonad m) => MArray (PrimState m) r ix e -> m (Array r ix e)
- makeMArray :: forall r ix e m. (PrimMonad m, MonadUnliftIO m, Mutable r ix e) => Comp -> Sz ix -> (ix -> m e) -> m (MArray (PrimState m) r ix e)
- makeMArrayLinear :: forall r ix e m. (PrimMonad m, MonadUnliftIO m, Mutable r ix e) => Comp -> Sz ix -> (Int -> m e) -> m (MArray (PrimState m) r ix e)
- makeMArrayS :: forall r ix e m. (Mutable r ix e, PrimMonad m) => Sz ix -> (ix -> m e) -> m (MArray (PrimState m) r ix e)
- makeMArrayLinearS :: forall r ix e m. (Mutable r ix e, PrimMonad m) => Sz ix -> (Int -> m e) -> m (MArray (PrimState m) r ix e)
- createArray_ :: forall r ix e a m. (Mutable r ix e, PrimMonad m, MonadUnliftIO m) => Comp -> Sz ix -> (Scheduler m () -> MArray (PrimState m) r ix e -> m a) -> m (Array r ix e)
- createArray :: forall r ix e a m b. (Mutable r ix e, PrimMonad m, MonadUnliftIO m) => Comp -> Sz ix -> (Scheduler m a -> MArray (PrimState m) r ix e -> m b) -> m ([a], Array r ix e)
- createArrayS_ :: forall r ix e a m. (Mutable r ix e, PrimMonad m) => Comp -> Sz ix -> (MArray (PrimState m) r ix e -> m a) -> m (Array r ix e)
- createArrayS :: forall r ix e a m. (Mutable r ix e, PrimMonad m) => Comp -> Sz ix -> (MArray (PrimState m) r ix e -> m a) -> m (a, Array r ix e)
- createArrayST_ :: forall r ix e a. Mutable r ix e => Comp -> Sz ix -> (forall s. MArray s r ix e -> ST s a) -> Array r ix e
- createArrayST :: forall r ix e a. Mutable r ix e => Comp -> Sz ix -> (forall s. MArray s r ix e -> ST s a) -> (a, Array r ix e)
- generateArray :: forall r ix e m. (MonadUnliftIO m, PrimMonad m, Mutable r ix e) => Comp -> Sz ix -> (ix -> m e) -> m (Array r ix e)
- generateArrayLinear :: forall r ix e m. (MonadUnliftIO m, PrimMonad m, Mutable r ix e) => Comp -> Sz ix -> (Int -> m e) -> m (Array r ix e)
- generateArrayS :: forall r ix e m. (Mutable r ix e, PrimMonad m) => Comp -> Sz ix -> (ix -> m e) -> m (Array r ix e)
- generateArrayLinearS :: forall r ix e m. (Mutable r ix e, PrimMonad m) => Comp -> Sz ix -> (Int -> m e) -> m (Array r ix e)
- generateArrayWS :: forall r ix e s m. (Mutable r ix e, MonadUnliftIO m, PrimMonad m) => WorkerStates s -> Sz ix -> (ix -> s -> m e) -> m (Array r ix e)
- generateArrayLinearWS :: forall r ix e s m. (Mutable r ix e, MonadUnliftIO m, PrimMonad m) => WorkerStates s -> Sz ix -> (Int -> s -> m e) -> m (Array r ix e)
- unfoldrPrimM_ :: forall r ix e a m. (Mutable r ix e, PrimMonad m) => Comp -> Sz ix -> (a -> m (e, a)) -> a -> m (Array r ix e)
- iunfoldrPrimM_ :: forall r ix e a m. (Mutable r ix e, PrimMonad m) => Comp -> Sz ix -> (a -> ix -> m (e, a)) -> a -> m (Array r ix e)
- unfoldrPrimM :: forall r ix e a m. (Mutable r ix e, PrimMonad m) => Comp -> Sz ix -> (a -> m (e, a)) -> a -> m (a, Array r ix e)
- iunfoldrPrimM :: forall r ix e a m. (Mutable r ix e, PrimMonad m) => Comp -> Sz ix -> (a -> ix -> m (e, a)) -> a -> m (a, Array r ix e)
- unfoldlPrimM_ :: forall r ix e a m. (Mutable r ix e, PrimMonad m) => Comp -> Sz ix -> (a -> m (a, e)) -> a -> m (Array r ix e)
- iunfoldlPrimM_ :: forall r ix e a m. (Mutable r ix e, PrimMonad m) => Comp -> Sz ix -> (a -> ix -> m (a, e)) -> a -> m (Array r ix e)
- unfoldlPrimM :: forall r ix e a m. (Mutable r ix e, PrimMonad m) => Comp -> Sz ix -> (a -> m (a, e)) -> a -> m (a, Array r ix e)
- iunfoldlPrimM :: forall r ix e a m. (Mutable r ix e, PrimMonad m) => Comp -> Sz ix -> (a -> ix -> m (a, e)) -> a -> m (a, Array r ix e)
- forPrimM_ :: (Mutable r ix e, PrimMonad m) => MArray (PrimState m) r ix e -> (e -> m e) -> m ()
- iforPrimM_ :: (Mutable r ix e, PrimMonad m) => MArray (PrimState m) r ix e -> (ix -> e -> m e) -> m ()
- iforLinearPrimM_ :: (Mutable r ix e, PrimMonad m) => MArray (PrimState m) r ix e -> (Int -> e -> m e) -> m ()
- withMArray :: (Mutable r ix e, MonadUnliftIO m) => Array r ix e -> (Int -> (m () -> m ()) -> MArray RealWorld r ix e -> m a) -> m (Array r ix e)
- withMArrayS :: (Mutable r ix e, PrimMonad m) => Array r ix e -> (MArray (PrimState m) r ix e -> m a) -> m (Array r ix e)
- withMArrayST :: Mutable r ix e => Array r ix e -> (forall s. MArray s r ix e -> ST s a) -> Array r ix e
- initialize :: (Mutable r ix e, PrimMonad m) => MArray (PrimState m) r ix e -> m ()
- initializeNew :: (Mutable r ix e, PrimMonad m) => Maybe e -> Sz ix -> m (MArray (PrimState m) r ix e)
- class Manifest r ix e => Mutable r ix e
- data family MArray s r ix e :: *
- data RealWorld :: Type
- computeInto :: (Load r' ix' e, Mutable r ix e, MonadIO m) => MArray RealWorld r ix e -> Array r' ix' e -> m ()
- loadArray :: forall r ix e r' m. (Load r' ix e, Mutable r ix e, MonadIO m) => Array r' ix e -> m (MArray RealWorld r ix e)
- loadArrayS :: forall r ix e r' m. (Load r' ix e, Mutable r ix e, PrimMonad m) => Array r' ix e -> m (MArray (PrimState m) r ix e)
Size
msize :: Mutable r ix e => MArray s r ix e -> Sz ix Source #
Get the size of a mutable array.
Since: 0.1.0
Element-wise mutation
read :: (Mutable r ix e, PrimMonad m) => MArray (PrimState m) r ix e -> ix -> m (Maybe e) Source #
O(1) - Lookup an element in the mutable array. Returns Nothing when index is out of bounds.
Since: 0.1.0
read' :: (Mutable r ix e, PrimMonad m) => MArray (PrimState m) r ix e -> ix -> m e Source #
O(1) - Same as read, but throws IndexOutOfBoundsException on an invalid index.
Since: 0.1.0
write :: (Mutable r ix e, PrimMonad m) => MArray (PrimState m) r ix e -> ix -> e -> m Bool Source #
O(1) - Write an element into the cell of a mutable array. Returns False when index is out
of bounds.
write' :: (Mutable r ix e, PrimMonad m) => MArray (PrimState m) r ix e -> ix -> e -> m () Source #
O(1) - Same as write, but lives in IO and throws IndexOutOfBoundsException on invalid
index.
Since: 0.1.0
modify :: (Mutable r ix e, PrimMonad m) => MArray (PrimState m) r ix e -> (e -> e) -> ix -> m Bool Source #
O(1) - Modify an element in the cell of a mutable array with a supplied function. Returns
False when index is out of bounds.
Since: 0.1.0
modify' :: (Mutable r ix e, PrimMonad m) => MArray (PrimState m) r ix e -> (e -> e) -> ix -> m () Source #
O(1) - Same as modify, but throws an error if index is out of bounds.
Since: 0.1.0
swap :: (Mutable r ix e, PrimMonad m) => MArray (PrimState m) r ix e -> ix -> ix -> m Bool Source #
O(1) - Swap two elements in a mutable array by supplying their indices. Returns False when
either one of the indices is out of bounds.
Since: 0.1.0
swap' :: (Mutable r ix e, PrimMonad m) => MArray (PrimState m) r ix e -> ix -> ix -> m () Source #
O(1) - Same as swap, but throws an IndexOutOfBoundsException on invalid indices.
Since: 0.1.0
Operations on MArray
Immutable conversion
new :: forall r ix e m. (Mutable r ix e, PrimMonad m) => Sz ix -> m (MArray (PrimState m) r ix e) Source #
O(n) - Initialize a new mutable array. All elements will be set to some default value. For
boxed arrays in will be a thunk with Uninitialized exception, while for others it will be
simply zeros.
Examples
>>>import Data.Massiv.Array>>>marr <- new (Sz2 2 6) :: IO (MArray RealWorld P Ix2 Int)>>>freeze Seq marrArray P Seq (Sz (2 :. 6)) [ [ 0, 0, 0, 0, 0, 0 ] , [ 0, 0, 0, 0, 0, 0 ] ]
Or using TypeApplications:
>>>:set -XTypeApplications>>>new @P @Ix2 @Int (Sz2 2 6) >>= freezeSArray P Seq (Sz (2 :. 6)) [ [ 0, 0, 0, 0, 0, 0 ] , [ 0, 0, 0, 0, 0, 0 ] ]>>>new @B @_ @Int (Sz2 2 6) >>= (`read'` 1)*** Exception: Uninitialized
Since: 0.1.0
thaw :: forall r ix e m. (Mutable r ix e, MonadIO m) => Array r ix e -> m (MArray RealWorld r ix e) Source #
O(n) - Make a mutable copy of a pure array. Keep in mind that both freeze and thaw trigger a
copy of the full array.
Example
>>>import Data.Massiv.Array>>>:set -XTypeApplications>>>arr <- fromListsM @U @Ix2 @Double Par [[12,21],[13,31]]>>>marr <- thaw arr>>>modify marr (+ 10) (1 :. 0)True>>>freeze Par marrArray U Par (Sz (2 :. 2)) [ [ 12.0, 21.0 ] , [ 23.0, 31.0 ] ]
Since: 0.1.0
thawS :: forall r ix e m. (Mutable r ix e, PrimMonad m) => Array r ix e -> m (MArray (PrimState m) r ix e) Source #
Same as thaw, but restrict computation to sequential only.
Example
>>>import Data.Massiv.Array>>>:set -XOverloadedLists>>>thawS @P @Ix1 @Double [1..10]>>>marr <- thawS @P @Ix1 @Double [1..10]>>>write' marr 5 100>>>freezeS marrArray P Seq (Sz1 10) [ 1.0, 2.0, 3.0, 4.0, 5.0, 100.0, 7.0, 8.0, 9.0, 10.0 ]
Since: 0.3.0
freeze :: forall r ix e m. (Mutable r ix e, MonadIO m) => Comp -> MArray RealWorld r ix e -> m (Array r ix e) Source #
O(n) - Yield an immutable copy of the mutable array. Note that mutable representations have to be the same.
Example
>>>import Data.Massiv.Array>>>marr <- new @P @_ @Int (Sz2 2 6)>>>forM_ (range Seq 0 (Ix2 1 4)) $ \ix -> write marr ix 9>>>freeze Seq marrArray P Seq (Sz (2 :. 6)) [ [ 9, 9, 9, 9, 0, 0 ] , [ 0, 0, 0, 0, 0, 0 ] ]
Since: 0.1.0
freezeS :: forall r ix e m. (Mutable r ix e, PrimMonad m) => MArray (PrimState m) r ix e -> m (Array r ix e) Source #
Create mutable
makeMArray :: forall r ix e m. (PrimMonad m, MonadUnliftIO m, Mutable r ix e) => Comp -> Sz ix -> (ix -> m e) -> m (MArray (PrimState m) r ix e) Source #
Just like makeMArrayS, but also accepts computation strategy and runs in IO.
Since: 0.3.0
makeMArrayLinear :: forall r ix e m. (PrimMonad m, MonadUnliftIO m, Mutable r ix e) => Comp -> Sz ix -> (Int -> m e) -> m (MArray (PrimState m) r ix e) Source #
Just like makeMArrayLinearS, but also accepts computation strategy and runs in IO.
Since: 0.3.0
Arguments
| :: (Mutable r ix e, PrimMonad m) | |
| => Sz ix | Size of the create array |
| -> (ix -> m e) | Element generating action |
| -> m (MArray (PrimState m) r ix e) |
Create a mutable array using an index aware generating action.
Since: 0.3.0
makeMArrayLinearS :: forall r ix e m. (Mutable r ix e, PrimMonad m) => Sz ix -> (Int -> m e) -> m (MArray (PrimState m) r ix e) Source #
Same as makeMArrayS, but index supplied to the action is row-major linear index.
Since: 0.3.0
Create pure
Arguments
| :: (Mutable r ix e, PrimMonad m, MonadUnliftIO m) | |
| => Comp | Computation strategy to use after |
| -> Sz ix | Size of the newly created array |
| -> (Scheduler m () -> MArray (PrimState m) r ix e -> m a) | An action that should fill all elements of the brand new mutable array |
| -> m (Array r ix e) |
Create a new array by supplying an action that will fill the new blank mutable array. Use
createArray if you'd like to keep the result of the filling function.
Examples
>>>:set -XTypeApplications>>>import Data.Massiv.Array>>>createArray_ @P @_ @Int Seq (Sz1 2) (\ s marr -> scheduleWork s (write' marr 0 10) >> scheduleWork s (write' marr 1 11))Array P Seq (Sz1 2) [ 10, 11 ]
Since: 0.3.0
Arguments
| :: (Mutable r ix e, PrimMonad m, MonadUnliftIO m) | |
| => Comp | Computation strategy to use after |
| -> Sz ix | Size of the newly created array |
| -> (Scheduler m a -> MArray (PrimState m) r ix e -> m b) | An action that should fill all elements of the brand new mutable array |
| -> m ([a], Array r ix e) |
Just like createArray_, but together with Array it returns results of scheduled filling
actions.
Since: 0.3.0
Arguments
| :: (Mutable r ix e, PrimMonad m) | |
| => Comp | Computation strategy to use after |
| -> Sz ix | Size of the newly created array |
| -> (MArray (PrimState m) r ix e -> m a) | An action that should fill all elements of the brand new mutable array |
| -> m (Array r ix e) |
Create a new array by supplying an action that will fill the new blank mutable array. Use
createArrayS if you'd like to keep the result of the filling function.
Examples
>>>:set -XTypeApplications>>>import Data.Massiv.Array>>>createArrayS_ @P @_ @Int Seq (Sz1 2) (\ marr -> write marr 0 10 >> write marr 1 12)Array P Seq (Sz1 2) [ 10, 12 ]
Since: 0.3.0
Arguments
| :: (Mutable r ix e, PrimMonad m) | |
| => Comp | Computation strategy to use after |
| -> Sz ix | Size of the newly created array |
| -> (MArray (PrimState m) r ix e -> m a) | An action that should fill all elements of the brand new mutable array |
| -> m (a, Array r ix e) |
Just like createArray_, but together with Array it returns the result of the filling action.
Since: 0.3.0
createArrayST_ :: forall r ix e a. Mutable r ix e => Comp -> Sz ix -> (forall s. MArray s r ix e -> ST s a) -> Array r ix e Source #
Just like createArrayS_, but restricted to ST.
Since: 0.3.0
createArrayST :: forall r ix e a. Mutable r ix e => Comp -> Sz ix -> (forall s. MArray s r ix e -> ST s a) -> (a, Array r ix e) Source #
Just like createArrayS, but restricted to ST.
Since: 0.2.6
Generate
generateArray :: forall r ix e m. (MonadUnliftIO m, PrimMonad m, Mutable r ix e) => Comp -> Sz ix -> (ix -> m e) -> m (Array r ix e) Source #
Just like generateArrayS, except this generator will respect the supplied computation
strategy, and for that reason it is restricted to IO.
Since: 0.2.6
generateArrayLinear :: forall r ix e m. (MonadUnliftIO m, PrimMonad m, Mutable r ix e) => Comp -> Sz ix -> (Int -> m e) -> m (Array r ix e) Source #
Just like generateArrayIO, but action supplied will receive a row-major linear index.
Since: 0.3.0
Arguments
| :: (Mutable r ix e, PrimMonad m) | |
| => Comp | Computation strategy (ingored during generation) |
| -> Sz ix | Resulting size of the array |
| -> (ix -> m e) | Element producing generator |
| -> m (Array r ix e) |
Sequentially generate a pure array. Much like makeArray creates a pure array this function
will use Mutable interface to generate a pure Array in the end, except that computation
strategy is ignored. Element producing function no longer has to be pure but is a stateful
action, since it is restricted to PrimMonad and allows for sharing the state between
computation of each element, which could be arbitrary effects if that monad is IO.
Examples
>>>import Data.Massiv.Array>>>import Data.IORef>>>ref <- newIORef (0 :: Int)>>>generateArray Seq (Sz1 6) (\ i -> modifyIORef' ref (+i) >> print i >> pure i) :: IO (Array U Ix1 Int)0 1 2 3 4 5 Array U Seq (Sz1 6) [ 0, 1, 2, 3, 4, 5 ]>>>readIORef ref15
Since: 0.2.6
Arguments
| :: (Mutable r ix e, PrimMonad m) | |
| => Comp | Computation strategy (ingored during generation) |
| -> Sz ix | Resulting size of the array |
| -> (Int -> m e) | Element producing generator |
| -> m (Array r ix e) |
Same as generateArray but with action takes row-major linear index.
Since: 0.3.0
Stateful worker threads
generateArrayWS :: forall r ix e s m. (Mutable r ix e, MonadUnliftIO m, PrimMonad m) => WorkerStates s -> Sz ix -> (ix -> s -> m e) -> m (Array r ix e) Source #
Use per worker thread state while generating elements of the array. Very useful for things that are not thread safe.
Since: 0.3.4
generateArrayLinearWS :: forall r ix e s m. (Mutable r ix e, MonadUnliftIO m, PrimMonad m) => WorkerStates s -> Sz ix -> (Int -> s -> m e) -> m (Array r ix e) Source #
Same as generateArrayWS, but use linear indexing instead.
Since: 0.3.4
Unfold
Arguments
| :: (Mutable r ix e, PrimMonad m) | |
| => Comp | Computation strategy (ignored during initial creation) |
| -> Sz ix | Size of the desired array |
| -> (a -> m (e, a)) | Unfolding action |
| -> a | Initial accumulator |
| -> m (Array r ix e) |
Sequentially unfold an array from the left.
Examples
Create an array with Fibonacci numbers while performing and IO action on the accumulator for
each element of the array.
>>>import Data.Massiv.Array>>>unfoldrPrimM_ Seq (Sz1 10) (\a@(f0, f1) -> let fn = f0 + f1 in print a >> return (f0, (f1, fn))) (0, 1) :: IO (Array P Ix1 Int)(0,1) (1,1) (1,2) (2,3) (3,5) (5,8) (8,13) (13,21) (21,34) (34,55) Array P Seq (Sz1 10) [ 0, 1, 1, 2, 3, 5, 8, 13, 21, 34 ]
Since: 0.3.0
Arguments
| :: (Mutable r ix e, PrimMonad m) | |
| => Comp | Computation strategy (ignored during initial creation) |
| -> Sz ix | Size of the desired array |
| -> (a -> ix -> m (e, a)) | Unfolding action |
| -> a | Initial accumulator |
| -> m (Array r ix e) |
Same as unfoldrPrimM_ but do the unfolding with index aware function.
Since: 0.3.0
Arguments
| :: (Mutable r ix e, PrimMonad m) | |
| => Comp | Computation strategy (ignored during initial creation) |
| -> Sz ix | Size of the desired array |
| -> (a -> m (e, a)) | Unfolding action |
| -> a | Initial accumulator |
| -> m (a, Array r ix e) |
Just like iunfoldrPrimM, but do the unfolding with index aware function.
Since: 0.3.0
Arguments
| :: (Mutable r ix e, PrimMonad m) | |
| => Comp | Computation strategy (ignored during initial creation) |
| -> Sz ix | Size of the desired array |
| -> (a -> ix -> m (e, a)) | Unfolding action |
| -> a | Initial accumulator |
| -> m (a, Array r ix e) |
Just like iunfoldrPrimM_, but also returns the final value of the accumulator.
Since: 0.3.0
Arguments
| :: (Mutable r ix e, PrimMonad m) | |
| => Comp | Computation strategy (ignored during initial creation) |
| -> Sz ix | Size of the desired array |
| -> (a -> m (a, e)) | Unfolding action |
| -> a | Initial accumulator |
| -> m (Array r ix e) |
Sequentially unfold an array from the left.
Examples
Create an array with Fibonacci numbers starting at the end while performing and IO action on
the accumulator for each element of the array.
>>>import Data.Massiv.Array>>>unfoldlPrimM_ Seq (Sz1 10) (\a@(f0, f1) -> let fn = f0 + f1 in print a >> return ((f1, fn), f0)) (0, 1) :: IO (Array P Ix1 Int)(0,1) (1,1) (1,2) (2,3) (3,5) (5,8) (8,13) (13,21) (21,34) (34,55) Array P Seq (Sz1 10) [ 34, 21, 13, 8, 5, 3, 2, 1, 1, 0 ]
Since: 0.3.0
Arguments
| :: (Mutable r ix e, PrimMonad m) | |
| => Comp | Computation strategy (ignored during initial creation) |
| -> Sz ix | Size of the desired array |
| -> (a -> ix -> m (a, e)) | Unfolding action |
| -> a | Initial accumulator |
| -> m (Array r ix e) |
Same as unfoldlPrimM_ but do the unfolding with index aware function.
Since: 0.3.0
Arguments
| :: (Mutable r ix e, PrimMonad m) | |
| => Comp | Computation strategy (ignored during initial creation) |
| -> Sz ix | Size of the desired array |
| -> (a -> m (a, e)) | Unfolding action |
| -> a | Initial accumulator |
| -> m (a, Array r ix e) |
Just like iunfoldlPrimM, but do the unfolding with index aware function.
Since: 0.3.0
Arguments
| :: (Mutable r ix e, PrimMonad m) | |
| => Comp | Computation strategy (ignored during initial creation) |
| -> Sz ix | Size of the desired array |
| -> (a -> ix -> m (a, e)) | Unfolding action |
| -> a | Initial accumulator |
| -> m (a, Array r ix e) |
Just like iunfoldlPrimM_, but also returns the final value of the accumulator.
Since: 0.3.0
Mapping
forPrimM_ :: (Mutable r ix e, PrimMonad m) => MArray (PrimState m) r ix e -> (e -> m e) -> m () Source #
Sequentially loop over a mutable array while modifying each element with an action.
Since: 0.3.0
iforPrimM_ :: (Mutable r ix e, PrimMonad m) => MArray (PrimState m) r ix e -> (ix -> e -> m e) -> m () Source #
Sequentially loop over a mutable array while modifying each element with an index aware action.
Since: 0.3.0
iforLinearPrimM_ :: (Mutable r ix e, PrimMonad m) => MArray (PrimState m) r ix e -> (Int -> e -> m e) -> m () Source #
Sequentially loop over a mutable array while modifying each element with an index aware action.
Since: 0.3.0
Modify
withMArray :: (Mutable r ix e, MonadUnliftIO m) => Array r ix e -> (Int -> (m () -> m ()) -> MArray RealWorld r ix e -> m a) -> m (Array r ix e) Source #
Create a copy of a pure array, mutate it in place and return its frozen version. The big
difference between withMArrayS is that it's not only gonna respect the computation strategy
supplied to it while making a copy, but it will also pass extra argumens to the action that
suppose to modify the mutable copy of the source array. These two extra arguments are:
- Number of capabilities derived from the
Computation strategy of the array. - An action that can be used to schedule arbitrary number of jobs that will be executed in parallel.
- And, of course, the mutable array itself.
Since: 0.3.0
withMArrayS :: (Mutable r ix e, PrimMonad m) => Array r ix e -> (MArray (PrimState m) r ix e -> m a) -> m (Array r ix e) Source #
withMArrayST :: Mutable r ix e => Array r ix e -> (forall s. MArray s r ix e -> ST s a) -> Array r ix e Source #
Same as withMArrayS but in ST. This is not only pure, but also the safest way to do
mutation to the array.
Since: 0.2.2
Initialize
initialize :: (Mutable r ix e, PrimMonad m) => MArray (PrimState m) r ix e -> m () Source #
Initialize mutable array to some default value.
Since: 0.3.0
initializeNew :: (Mutable r ix e, PrimMonad m) => Maybe e -> Sz ix -> m (MArray (PrimState m) r ix e) Source #
Create new mutable array while initializing all elements to some default value.
Since: 0.3.0
Computation
class Manifest r ix e => Mutable r ix e Source #
Minimal complete definition
msize, unsafeThaw, unsafeFreeze, unsafeNew, unsafeLinearRead, unsafeLinearWrite, initialize
Instances
RealWorld is deeply magical. It is primitive, but it is not
unlifted (hence ptrArg). We never manipulate values of type
RealWorld; it's only used in the type system, to parameterise State#.
Arguments
| :: (Load r' ix' e, Mutable r ix e, MonadIO m) | |
| => MArray RealWorld r ix e | Target Array |
| -> Array r' ix' e | Array to load |
| -> m () |
Compute an Array while loading the results into the supplied mutable target array. Number of
elements for arrays must agree, otherwise SizeElementsMismatchException exception is thrown.
Since: 0.1.3