| 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)
- readM :: (Mutable r ix e, PrimMonad m, MonadThrow m) => MArray (PrimState m) r ix e -> ix -> m 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
- writeM :: (Mutable r ix e, PrimMonad m, MonadThrow m) => MArray (PrimState m) r ix e -> ix -> e -> m ()
- 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 -> m e) -> ix -> m (Maybe e)
- modifyM :: (Mutable r ix e, PrimMonad m, MonadThrow m) => MArray (PrimState m) r ix e -> (e -> m e) -> ix -> m e
- modifyM_ :: (Mutable r ix e, PrimMonad m, MonadThrow m) => MArray (PrimState m) r ix e -> (e -> m e) -> ix -> m ()
- 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 (Maybe (e, e))
- swapM :: (Mutable r ix e, PrimMonad m, MonadThrow m) => MArray (PrimState m) r ix e -> ix -> ix -> m (e, e)
- swapM_ :: (Mutable r ix e, PrimMonad m, MonadThrow m) => MArray (PrimState m) r ix e -> ix -> ix -> m ()
- 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) => Sz ix -> (ix -> m e) -> m (Array r ix e)
- generateArrayLinearS :: forall r ix e m. (Mutable r ix e, PrimMonad m) => 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 ()
- forPrimM_ :: (Mutable r ix e, PrimMonad m) => MArray (PrimState m) r ix e -> (e -> m ()) -> m ()
- iforPrimM :: (Mutable r ix e, PrimMonad m) => MArray (PrimState m) r ix e -> (ix -> e -> m e) -> m ()
- iforPrimM_ :: (Mutable r ix e, PrimMonad m) => MArray (PrimState m) r ix e -> (ix -> e -> m ()) -> m ()
- iforLinearPrimM :: (Mutable r ix e, PrimMonad m) => MArray (PrimState m) r ix e -> (Int -> e -> m e) -> m ()
- iforLinearPrimM_ :: (Mutable r ix e, PrimMonad m) => MArray (PrimState m) r ix e -> (Int -> e -> m ()) -> m ()
- withMArray :: (Mutable r ix e, MonadUnliftIO m) => Array r ix e -> (Scheduler 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 (Construct r ix e, 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
readM :: (Mutable r ix e, PrimMonad m, MonadThrow 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.4.0
read' :: (Mutable r ix e, PrimMonad m) => MArray (PrimState m) r ix e -> ix -> m e Source #
Deprecated: In favor of more general readM
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.
Since: 0.1.0
writeM :: (Mutable r ix e, PrimMonad m, MonadThrow m) => MArray (PrimState m) r ix e -> ix -> e -> m () Source #
O(1) - Same as write, but throws IndexOutOfBoundsException on an invalid index.
Since: 0.4.0
write' :: (Mutable r ix e, PrimMonad m) => MArray (PrimState m) r ix e -> ix -> e -> m () Source #
Deprecated: In favor of more general writeM
O(1) - Same as write, but lives in IO and throws IndexOutOfBoundsException on invalid
index.
Since: 0.1.0
Arguments
| :: (Mutable r ix e, PrimMonad m) | |
| => MArray (PrimState m) r ix e | Array to mutate. |
| -> (e -> m e) | Monadic action that modifies the element |
| -> ix | Index at which to perform modification. |
| -> m (Maybe e) |
O(1) - Modify an element in the cell of a mutable array with a supplied action. Returns the previous value, if index was not out of bounds.
Since: 0.1.0
Arguments
| :: (Mutable r ix e, PrimMonad m, MonadThrow m) | |
| => MArray (PrimState m) r ix e | Array to mutate. |
| -> (e -> m e) | Monadic action that modifies the element |
| -> ix | Index at which to perform modification. |
| -> m e |
O(1) - Modify an element in the cell of a mutable array with a supplied
action. Throws an IndexOutOfBoundsException exception for invalid index and returns
the previous value otherwise.
Since: 0.4.0
Arguments
| :: (Mutable r ix e, PrimMonad m, MonadThrow m) | |
| => MArray (PrimState m) r ix e | Array to mutate. |
| -> (e -> m e) | Monadic action that modifies the element |
| -> ix | Index at which to perform modification. |
| -> m () |
O(1) - Same as modifyM, but discard the returned element
Examples
>>>:set -XTypeApplications>>>import Control.Monad.ST>>>import Data.Massiv.Array>>>runST $ new @P @Ix1 @Int (Sz1 3) >>= (\ma -> modifyM_ ma (pure . (+10)) 1 >> freezeS ma)Array P Seq (Sz1 3) [ 0, 10, 0 ]
Since: 0.4.0
modify' :: (Mutable r ix e, PrimMonad m) => MArray (PrimState m) r ix e -> (e -> e) -> ix -> m () Source #
swap :: (Mutable r ix e, PrimMonad m) => MArray (PrimState m) r ix e -> ix -> ix -> m (Maybe (e, e)) Source #
Arguments
| :: (Mutable r ix e, PrimMonad m, MonadThrow m) | |
| => MArray (PrimState m) r ix e | |
| -> ix | Index for the first element, which will be returned as the first element in the tuple. |
| -> ix | Index for the second element, which will be returned as the second element in the tuple. |
| -> m (e, e) |
O(1) - Swap two elements in a mutable array under the supplied indices. Throws an
IndexOutOfBoundsException when either one of the indices is out of bounds and
elements under those indices otherwise.
Since: 0.4.0
swapM_ :: (Mutable r ix e, PrimMonad m, MonadThrow m) => MArray (PrimState m) r ix e -> ix -> ix -> m () Source #
O(1) - Same as swapM, but discard the returned elements
Since: 0.4.0
swap' :: (Mutable r ix e, PrimMonad m) => MArray (PrimState m) r ix e -> ix -> ix -> m () Source #
Deprecated: In favor of more general swapM
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) >>= (`readM` 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 (pure . (+ 10)) (1 :. 0)Just 13.0>>>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]>>>writeM 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 (writeM marr 0 10) >> scheduleWork s (writeM 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) | |
| => 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 set to Seq. Element producing function no longer has to be pure
but is a stateful action, becuase it is restricted to PrimMonad thus allows for sharing
the state between computation of each element.
Examples
>>>import Data.Massiv.Array>>>import Data.IORef>>>ref <- newIORef (0 :: Int)>>>generateArrayS (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) | |
| => Sz ix | Resulting size of the array |
| -> (Int -> m e) | Element producing generator |
| -> m (Array r ix e) |
Same as generateArray but with action that accepts 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.4.0
forPrimM_ :: (Mutable r ix e, PrimMonad m) => MArray (PrimState m) r ix e -> (e -> m ()) -> m () Source #
Sequentially loop over a mutable array while reading each element and applying an action to it. There is no mutation to the array, unless the action itself modifies it.
Since: 0.4.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.4.0
iforPrimM_ :: (Mutable r ix e, PrimMonad m) => MArray (PrimState m) r ix e -> (ix -> e -> m ()) -> m () Source #
Sequentially loop over a mutable array while reading each element and applying an index aware action to it. There is no mutation to the array, unless the action itself modifies it.
Since: 0.4.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.4.0
iforLinearPrimM_ :: (Mutable r ix e, PrimMonad m) => MArray (PrimState m) r ix e -> (Int -> e -> m ()) -> m () Source #
Sequentially loop over a mutable array while reading each element and applying a linear index aware action to it. There is no mutation to the array, unless the action itself modifies it.
Since: 0.4.0
Modify
withMArray :: (Mutable r ix e, MonadUnliftIO m) => Array r ix e -> (Scheduler 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 (Construct r ix e, 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