{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Data.Massiv.Array.Mutable
(
msize
, read
, readM
, read'
, write
, write_
, writeM
, write'
, modify
, modify_
, modifyM
, modifyM_
, modify'
, swap
, swap_
, swapM
, swapM_
, swap'
, new
, thaw
, thawS
, freeze
, freezeS
, makeMArray
, makeMArrayLinear
, makeMArrayS
, makeMArrayLinearS
, createArray_
, createArray
, createArrayS_
, createArrayS
, createArrayST_
, createArrayST
, generateArray
, generateArrayLinear
, generateArrayS
, generateArrayLinearS
, generateArrayWS
, generateArrayLinearWS
, unfoldrPrimM_
, iunfoldrPrimM_
, unfoldrPrimM
, iunfoldrPrimM
, unfoldlPrimM_
, iunfoldlPrimM_
, unfoldlPrimM
, iunfoldlPrimM
, forPrimM
, forPrimM_
, iforPrimM
, iforPrimM_
, iforLinearPrimM
, iforLinearPrimM_
, withMArray
, withMArray_
, withMArrayS
, withMArrayS_
, withMArrayST
, withMArrayST_
, initialize
, initializeNew
, Mutable
, MArray
, RealWorld
, computeInto
, loadArray
, loadArrayS
) where
import Data.Maybe (fromMaybe)
import Control.Monad (void, when, unless, (>=>))
import Control.Monad.ST
import Control.Scheduler
import Data.Massiv.Core.Common
import Data.Massiv.Array.Mutable.Internal
import Prelude hiding (mapM, read)
new ::
forall r ix e m. (Mutable r ix e, PrimMonad m)
=> Sz ix
-> m (MArray (PrimState m) r ix e)
new :: Sz ix -> m (MArray (PrimState m) r ix e)
new = Maybe e -> Sz ix -> m (MArray (PrimState m) r ix e)
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
Maybe e -> Sz ix -> m (MArray (PrimState m) r ix e)
initializeNew Maybe e
forall a. Maybe a
Nothing
{-# INLINE new #-}
thaw :: forall r ix e m. (Mutable r ix e, MonadIO m) => Array r ix e -> m (MArray RealWorld r ix e)
thaw :: Array r ix e -> m (MArray RealWorld r ix e)
thaw Array r ix e
arr =
IO (MArray RealWorld r ix e) -> m (MArray RealWorld r ix e)
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (MArray RealWorld r ix e) -> m (MArray RealWorld r ix e))
-> IO (MArray RealWorld r ix e) -> m (MArray RealWorld r ix e)
forall a b. (a -> b) -> a -> b
$ do
let sz :: Sz ix
sz = Array r ix e -> Sz ix
forall r ix e. Load r ix e => Array r ix e -> Sz ix
size Array r ix e
arr
totalLength :: Int
totalLength = Sz ix -> Int
forall ix. Index ix => Sz ix -> Int
totalElem Sz ix
sz
MArray RealWorld r ix e
marr <- Sz ix -> IO (MArray (PrimState IO) r ix e)
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
Sz ix -> m (MArray (PrimState m) r ix e)
unsafeNew Sz ix
sz
Comp -> (Scheduler IO () -> IO ()) -> IO ()
withMassivScheduler_ (Array r ix e -> Comp
forall r ix e. Load r ix e => Array r ix e -> Comp
getComp Array r ix e
arr) ((Scheduler IO () -> IO ()) -> IO ())
-> (Scheduler IO () -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \Scheduler IO ()
scheduler ->
Int -> Int -> (Int -> Int -> IO ()) -> IO ()
forall a. Int -> Int -> (Int -> Int -> a) -> a
splitLinearly (Scheduler IO () -> Int
forall (m :: * -> *) a. Scheduler m a -> Int
numWorkers Scheduler IO ()
scheduler) Int
totalLength ((Int -> Int -> IO ()) -> IO ()) -> (Int -> Int -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \Int
chunkLength Int
slackStart -> do
Int -> (Int -> Bool) -> (Int -> Int) -> (Int -> IO ()) -> IO ()
forall (m :: * -> *) a.
Monad m =>
Int -> (Int -> Bool) -> (Int -> Int) -> (Int -> m a) -> m ()
loopM_ Int
0 (Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
slackStart) (Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
chunkLength) ((Int -> IO ()) -> IO ()) -> (Int -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \ !Int
start ->
Scheduler IO () -> IO () -> IO ()
forall (m :: * -> *). Scheduler m () -> m () -> m ()
scheduleWork_ Scheduler IO ()
scheduler (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$ Array r ix e
-> Int -> MArray (PrimState IO) r ix e -> Int -> Sz1 -> IO ()
forall r ix e ix' (m :: * -> *).
(Mutable r ix e, Mutable r ix' e, PrimMonad m) =>
Array r ix' e
-> Int -> MArray (PrimState m) r ix e -> Int -> Sz1 -> m ()
unsafeArrayLinearCopy Array r ix e
arr Int
start MArray RealWorld r ix e
MArray (PrimState IO) r ix e
marr Int
start (Int -> Sz1
forall ix. ix -> Sz ix
SafeSz Int
chunkLength)
let slackLength :: Int
slackLength = Int
totalLength Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
slackStart
Bool -> IO () -> IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Int
slackLength Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
0) (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$
Scheduler IO () -> IO () -> IO ()
forall (m :: * -> *). Scheduler m () -> m () -> m ()
scheduleWork_ Scheduler IO ()
scheduler (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$
Array r ix e
-> Int -> MArray (PrimState IO) r ix e -> Int -> Sz1 -> IO ()
forall r ix e ix' (m :: * -> *).
(Mutable r ix e, Mutable r ix' e, PrimMonad m) =>
Array r ix' e
-> Int -> MArray (PrimState m) r ix e -> Int -> Sz1 -> m ()
unsafeArrayLinearCopy Array r ix e
arr Int
slackStart MArray RealWorld r ix e
MArray (PrimState IO) r ix e
marr Int
slackStart (Int -> Sz1
forall ix. ix -> Sz ix
SafeSz Int
slackLength)
MArray RealWorld r ix e -> IO (MArray RealWorld r ix e)
forall (f :: * -> *) a. Applicative f => a -> f a
pure MArray RealWorld r ix e
marr
{-# INLINE thaw #-}
thawS ::
forall r ix e m. (Mutable r ix e, PrimMonad m)
=> Array r ix e
-> m (MArray (PrimState m) r ix e)
thawS :: Array r ix e -> m (MArray (PrimState m) r ix e)
thawS Array r ix e
arr = do
MArray (PrimState m) r ix e
tmarr <- Sz ix -> m (MArray (PrimState m) r ix e)
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
Sz ix -> m (MArray (PrimState m) r ix e)
unsafeNew (Array r ix e -> Sz ix
forall r ix e. Load r ix e => Array r ix e -> Sz ix
size Array r ix e
arr)
Array r ix e
-> Int -> MArray (PrimState m) r ix e -> Int -> Sz1 -> m ()
forall r ix e ix' (m :: * -> *).
(Mutable r ix e, Mutable r ix' e, PrimMonad m) =>
Array r ix' e
-> Int -> MArray (PrimState m) r ix e -> Int -> Sz1 -> m ()
unsafeArrayLinearCopy Array r ix e
arr Int
0 MArray (PrimState m) r ix e
tmarr Int
0 (Int -> Sz1
forall ix. ix -> Sz ix
SafeSz (Sz ix -> Int
forall ix. Index ix => Sz ix -> Int
totalElem (Array r ix e -> Sz ix
forall r ix e. Load r ix e => Array r ix e -> Sz ix
size Array r ix e
arr)))
MArray (PrimState m) r ix e -> m (MArray (PrimState m) r ix e)
forall (f :: * -> *) a. Applicative f => a -> f a
pure MArray (PrimState m) r ix e
tmarr
{-# INLINE thawS #-}
freeze ::
forall r ix e m. (Mutable r ix e, MonadIO m)
=> Comp
-> MArray RealWorld r ix e
-> m (Array r ix e)
freeze :: Comp -> MArray RealWorld r ix e -> m (Array r ix e)
freeze Comp
comp MArray RealWorld r ix e
smarr =
IO (Array r ix e) -> m (Array r ix e)
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (Array r ix e) -> m (Array r ix e))
-> IO (Array r ix e) -> m (Array r ix e)
forall a b. (a -> b) -> a -> b
$ do
let sz :: Sz ix
sz = MArray RealWorld r ix e -> Sz ix
forall r ix e s. Mutable r ix e => MArray s r ix e -> Sz ix
msize MArray RealWorld r ix e
smarr
totalLength :: Int
totalLength = Sz ix -> Int
forall ix. Index ix => Sz ix -> Int
totalElem Sz ix
sz
MArray RealWorld r ix e
tmarr <- Sz ix -> IO (MArray (PrimState IO) r ix e)
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
Sz ix -> m (MArray (PrimState m) r ix e)
unsafeNew Sz ix
sz
Comp -> (Scheduler IO () -> IO ()) -> IO ()
withMassivScheduler_ Comp
comp ((Scheduler IO () -> IO ()) -> IO ())
-> (Scheduler IO () -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \Scheduler IO ()
scheduler ->
Int -> Int -> (Int -> Int -> IO ()) -> IO ()
forall a. Int -> Int -> (Int -> Int -> a) -> a
splitLinearly (Scheduler IO () -> Int
forall (m :: * -> *) a. Scheduler m a -> Int
numWorkers Scheduler IO ()
scheduler) Int
totalLength ((Int -> Int -> IO ()) -> IO ()) -> (Int -> Int -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \Int
chunkLength Int
slackStart -> do
Int -> (Int -> Bool) -> (Int -> Int) -> (Int -> IO ()) -> IO ()
forall (m :: * -> *) a.
Monad m =>
Int -> (Int -> Bool) -> (Int -> Int) -> (Int -> m a) -> m ()
loopM_ Int
0 (Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
slackStart) (Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
chunkLength) ((Int -> IO ()) -> IO ()) -> (Int -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \ !Int
start ->
Scheduler IO () -> IO () -> IO ()
forall (m :: * -> *). Scheduler m () -> m () -> m ()
scheduleWork_ Scheduler IO ()
scheduler (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$ MArray (PrimState IO) r ix e
-> Int -> MArray (PrimState IO) r ix e -> Int -> Sz1 -> IO ()
forall r ix e ix' (m :: * -> *).
(Mutable r ix e, Mutable r ix' e, PrimMonad m) =>
MArray (PrimState m) r ix' e
-> Int -> MArray (PrimState m) r ix e -> Int -> Sz1 -> m ()
unsafeLinearCopy MArray RealWorld r ix e
MArray (PrimState IO) r ix e
smarr Int
start MArray RealWorld r ix e
MArray (PrimState IO) r ix e
tmarr Int
start (Int -> Sz1
forall ix. ix -> Sz ix
SafeSz Int
chunkLength)
let slackLength :: Int
slackLength = Int
totalLength Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
slackStart
Bool -> IO () -> IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Int
slackLength Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
0) (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$
Scheduler IO () -> IO () -> IO ()
forall (m :: * -> *). Scheduler m () -> m () -> m ()
scheduleWork_ Scheduler IO ()
scheduler (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$
MArray (PrimState IO) r ix e
-> Int -> MArray (PrimState IO) r ix e -> Int -> Sz1 -> IO ()
forall r ix e ix' (m :: * -> *).
(Mutable r ix e, Mutable r ix' e, PrimMonad m) =>
MArray (PrimState m) r ix' e
-> Int -> MArray (PrimState m) r ix e -> Int -> Sz1 -> m ()
unsafeLinearCopy MArray RealWorld r ix e
MArray (PrimState IO) r ix e
smarr Int
slackStart MArray RealWorld r ix e
MArray (PrimState IO) r ix e
tmarr Int
slackStart (Int -> Sz1
forall ix. ix -> Sz ix
SafeSz Int
slackLength)
Comp -> MArray (PrimState IO) r ix e -> IO (Array r ix e)
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
Comp -> MArray (PrimState m) r ix e -> m (Array r ix e)
unsafeFreeze Comp
comp MArray RealWorld r ix e
MArray (PrimState IO) r ix e
tmarr
{-# INLINE freeze #-}
freezeS ::
forall r ix e m. (Mutable r ix e, PrimMonad m)
=> MArray (PrimState m) r ix e
-> m (Array r ix e)
freezeS :: MArray (PrimState m) r ix e -> m (Array r ix e)
freezeS MArray (PrimState m) r ix e
smarr = do
let sz :: Sz ix
sz = MArray (PrimState m) r ix e -> Sz ix
forall r ix e s. Mutable r ix e => MArray s r ix e -> Sz ix
msize MArray (PrimState m) r ix e
smarr
MArray (PrimState m) r ix e
tmarr <- Sz ix -> m (MArray (PrimState m) r ix e)
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
Sz ix -> m (MArray (PrimState m) r ix e)
unsafeNew Sz ix
sz
MArray (PrimState m) r ix e
-> Int -> MArray (PrimState m) r ix e -> Int -> Sz1 -> m ()
forall r ix e ix' (m :: * -> *).
(Mutable r ix e, Mutable r ix' e, PrimMonad m) =>
MArray (PrimState m) r ix' e
-> Int -> MArray (PrimState m) r ix e -> Int -> Sz1 -> m ()
unsafeLinearCopy MArray (PrimState m) r ix e
smarr Int
0 MArray (PrimState m) r ix e
tmarr Int
0 (Int -> Sz1
forall ix. ix -> Sz ix
SafeSz (Sz ix -> Int
forall ix. Index ix => Sz ix -> Int
totalElem Sz ix
sz))
Comp -> MArray (PrimState m) r ix e -> m (Array r ix e)
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
Comp -> MArray (PrimState m) r ix e -> m (Array r ix e)
unsafeFreeze Comp
Seq MArray (PrimState m) r ix e
tmarr
{-# INLINE freezeS #-}
unsafeNewUninitialized ::
(Load r' ix e, Mutable r ix e, PrimMonad m) => Array r' ix e -> m (MArray (PrimState m) r ix e)
unsafeNewUninitialized :: Array r' ix e -> m (MArray (PrimState m) r ix e)
unsafeNewUninitialized !Array r' ix e
arr = Sz ix -> m (MArray (PrimState m) r ix e)
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
Sz ix -> m (MArray (PrimState m) r ix e)
unsafeNew (Sz ix -> Maybe (Sz ix) -> Sz ix
forall a. a -> Maybe a -> a
fromMaybe Sz ix
forall ix. Index ix => Sz ix
zeroSz (Array r' ix e -> Maybe (Sz ix)
forall r ix e. Load r ix e => Array r ix e -> Maybe (Sz ix)
maxSize Array r' ix e
arr))
{-# INLINE unsafeNewUninitialized #-}
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)
loadArrayS :: Array r' ix e -> m (MArray (PrimState m) r ix e)
loadArrayS Array r' ix e
arr = do
MArray (PrimState m) r ix e
marr <- Array r' ix e -> m (MArray (PrimState m) r ix e)
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)
unsafeNewUninitialized Array r' ix e
arr
MArray (PrimState m) r ix e
-> Array r' ix e -> m (MArray (PrimState m) r ix e)
forall r ix e r' (m :: * -> *).
(Load r ix e, Mutable r' ix e, PrimMonad m) =>
MArray (PrimState m) r' ix e
-> Array r ix e -> m (MArray (PrimState m) r' ix e)
unsafeLoadIntoS MArray (PrimState m) r ix e
marr Array r' ix e
arr
{-# INLINE loadArrayS #-}
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)
loadArray :: Array r' ix e -> m (MArray RealWorld r ix e)
loadArray Array r' ix e
arr =
IO (MArray RealWorld r ix e) -> m (MArray RealWorld r ix e)
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (MArray RealWorld r ix e) -> m (MArray RealWorld r ix e))
-> IO (MArray RealWorld r ix e) -> m (MArray RealWorld r ix e)
forall a b. (a -> b) -> a -> b
$ do
MArray RealWorld r ix e
marr <- Array r' ix e -> IO (MArray (PrimState IO) r ix e)
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)
unsafeNewUninitialized Array r' ix e
arr
MArray RealWorld r ix e
-> Array r' ix e -> IO (MArray RealWorld r ix e)
forall r ix e r' (m :: * -> *).
(Load r ix e, Mutable r' ix e, MonadIO m) =>
MArray RealWorld r' ix e
-> Array r ix e -> m (MArray RealWorld r' ix e)
unsafeLoadIntoM MArray RealWorld r ix e
marr Array r' ix e
arr
{-# INLINE loadArray #-}
computeInto ::
(Load r' ix' e, Mutable r ix e, MonadIO m)
=> MArray RealWorld r ix e
-> Array r' ix' e
-> m ()
computeInto :: MArray RealWorld r ix e -> Array r' ix' e -> m ()
computeInto !MArray RealWorld r ix e
mArr !Array r' ix' e
arr =
IO () -> m ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> m ()) -> IO () -> m ()
forall a b. (a -> b) -> a -> b
$ do
Bool -> IO () -> IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (Sz ix -> Int
forall ix. Index ix => Sz ix -> Int
totalElem (MArray RealWorld r ix e -> Sz ix
forall r ix e s. Mutable r ix e => MArray s r ix e -> Sz ix
msize MArray RealWorld r ix e
mArr) Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Sz ix' -> Int
forall ix. Index ix => Sz ix -> Int
totalElem (Array r' ix' e -> Sz ix'
forall r ix e. Load r ix e => Array r ix e -> Sz ix
size Array r' ix' e
arr)) (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$
SizeException -> IO ()
forall (m :: * -> *) e a. (MonadThrow m, Exception e) => e -> m a
throwM (SizeException -> IO ()) -> SizeException -> IO ()
forall a b. (a -> b) -> a -> b
$ Sz ix -> Sz ix' -> SizeException
forall ix ix'.
(Index ix, Index ix') =>
Sz ix -> Sz ix' -> SizeException
SizeElementsMismatchException (MArray RealWorld r ix e -> Sz ix
forall r ix e s. Mutable r ix e => MArray s r ix e -> Sz ix
msize MArray RealWorld r ix e
mArr) (Array r' ix' e -> Sz ix'
forall r ix e. Load r ix e => Array r ix e -> Sz ix
size Array r' ix' e
arr)
Comp -> (Scheduler IO () -> IO ()) -> IO ()
withMassivScheduler_ (Array r' ix' e -> Comp
forall r ix e. Load r ix e => Array r ix e -> Comp
getComp Array r' ix' e
arr) ((Scheduler IO () -> IO ()) -> IO ())
-> (Scheduler IO () -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \Scheduler IO ()
scheduler ->
Scheduler IO () -> Array r' ix' e -> (Int -> e -> IO ()) -> IO ()
forall r ix e (m :: * -> *).
(Load r ix e, Monad m) =>
Scheduler m () -> Array r ix e -> (Int -> e -> m ()) -> m ()
loadArrayM Scheduler IO ()
scheduler Array r' ix' e
arr (MArray (PrimState IO) r ix e -> Int -> e -> IO ()
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
MArray (PrimState m) r ix e -> Int -> e -> m ()
unsafeLinearWrite MArray RealWorld r ix e
MArray (PrimState IO) r ix e
mArr)
{-# INLINE computeInto #-}
makeMArrayS ::
forall r ix e m. (Mutable r ix e, PrimMonad m)
=> Sz ix
-> (ix -> m e)
-> m (MArray (PrimState m) r ix e)
makeMArrayS :: Sz ix -> (ix -> m e) -> m (MArray (PrimState m) r ix e)
makeMArrayS Sz ix
sz ix -> m e
f = Sz ix -> (Int -> m e) -> m (MArray (PrimState m) r ix e)
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
Sz ix -> (Int -> m e) -> m (MArray (PrimState m) r ix e)
makeMArrayLinearS Sz ix
sz (ix -> m e
f (ix -> m e) -> (Int -> ix) -> Int -> m e
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Sz ix -> Int -> ix
forall ix. Index ix => Sz ix -> Int -> ix
fromLinearIndex Sz ix
sz)
{-# INLINE makeMArrayS #-}
makeMArrayLinearS ::
forall r ix e m. (Mutable r ix e, PrimMonad m)
=> Sz ix
-> (Int -> m e)
-> m (MArray (PrimState m) r ix e)
makeMArrayLinearS :: Sz ix -> (Int -> m e) -> m (MArray (PrimState m) r ix e)
makeMArrayLinearS Sz ix
sz Int -> m e
f = do
MArray (PrimState m) r ix e
marr <- Sz ix -> m (MArray (PrimState m) r ix e)
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
Sz ix -> m (MArray (PrimState m) r ix e)
unsafeNew Sz ix
sz
Int -> (Int -> Bool) -> (Int -> Int) -> (Int -> m ()) -> m ()
forall (m :: * -> *) a.
Monad m =>
Int -> (Int -> Bool) -> (Int -> Int) -> (Int -> m a) -> m ()
loopM_ Int
0 (Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Sz ix -> Int
forall ix. Index ix => Sz ix -> Int
totalElem (MArray (PrimState m) r ix e -> Sz ix
forall r ix e s. Mutable r ix e => MArray s r ix e -> Sz ix
msize MArray (PrimState m) r ix e
marr)) (Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) (\ !Int
i -> Int -> m e
f Int
i m e -> (e -> m ()) -> m ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= MArray (PrimState m) r ix e -> Int -> e -> m ()
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
MArray (PrimState m) r ix e -> Int -> e -> m ()
unsafeLinearWrite MArray (PrimState m) r ix e
marr Int
i)
MArray (PrimState m) r ix e -> m (MArray (PrimState m) r ix e)
forall (m :: * -> *) a. Monad m => a -> m a
return MArray (PrimState m) r ix e
marr
{-# INLINE makeMArrayLinearS #-}
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)
makeMArray :: Comp -> Sz ix -> (ix -> m e) -> m (MArray (PrimState m) r ix e)
makeMArray Comp
comp Sz ix
sz ix -> m e
f = Comp -> Sz ix -> (Int -> m e) -> m (MArray (PrimState m) r ix e)
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)
makeMArrayLinear Comp
comp Sz ix
sz (ix -> m e
f (ix -> m e) -> (Int -> ix) -> Int -> m e
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Sz ix -> Int -> ix
forall ix. Index ix => Sz ix -> Int -> ix
fromLinearIndex Sz ix
sz)
{-# INLINE makeMArray #-}
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)
makeMArrayLinear :: Comp -> Sz ix -> (Int -> m e) -> m (MArray (PrimState m) r ix e)
makeMArrayLinear Comp
comp Sz ix
sz Int -> m e
f = do
MArray (PrimState m) r ix e
marr <- Sz ix -> m (MArray (PrimState m) r ix e)
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
Sz ix -> m (MArray (PrimState m) r ix e)
unsafeNew Sz ix
sz
Comp -> (Scheduler m () -> m ()) -> m ()
forall (m :: * -> *) a b.
MonadUnliftIO m =>
Comp -> (Scheduler m a -> m b) -> m ()
withScheduler_ Comp
comp ((Scheduler m () -> m ()) -> m ())
-> (Scheduler m () -> m ()) -> m ()
forall a b. (a -> b) -> a -> b
$ \Scheduler m ()
scheduler ->
Scheduler m () -> Int -> (Int -> m e) -> (Int -> e -> m ()) -> m ()
forall (m :: * -> *) b c.
Monad m =>
Scheduler m () -> Int -> (Int -> m b) -> (Int -> b -> m c) -> m ()
splitLinearlyWithM_ Scheduler m ()
scheduler (Sz ix -> Int
forall ix. Index ix => Sz ix -> Int
totalElem Sz ix
sz) Int -> m e
f (MArray (PrimState m) r ix e -> Int -> e -> m ()
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
MArray (PrimState m) r ix e -> Int -> e -> m ()
unsafeLinearWrite MArray (PrimState m) r ix e
marr)
MArray (PrimState m) r ix e -> m (MArray (PrimState m) r ix e)
forall (m :: * -> *) a. Monad m => a -> m a
return MArray (PrimState m) r ix e
marr
{-# INLINE makeMArrayLinear #-}
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_ :: Comp
-> Sz ix
-> (Scheduler m () -> MArray (PrimState m) r ix e -> m a)
-> m (Array r ix e)
createArray_ Comp
comp Sz ix
sz Scheduler m () -> MArray (PrimState m) r ix e -> m a
action = do
MArray (PrimState m) r ix e
marr <- Sz ix -> m (MArray (PrimState m) r ix e)
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
Sz ix -> m (MArray (PrimState m) r ix e)
new Sz ix
sz
Comp -> (Scheduler m () -> m a) -> m ()
forall (m :: * -> *) a b.
MonadUnliftIO m =>
Comp -> (Scheduler m a -> m b) -> m ()
withScheduler_ Comp
comp (Scheduler m () -> MArray (PrimState m) r ix e -> m a
`action` MArray (PrimState m) r ix e
marr)
Comp -> MArray (PrimState m) r ix e -> m (Array r ix e)
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
Comp -> MArray (PrimState m) r ix e -> m (Array r ix e)
unsafeFreeze Comp
comp MArray (PrimState m) r ix e
marr
{-# INLINE createArray_ #-}
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)
createArray :: Comp
-> Sz ix
-> (Scheduler m a -> MArray (PrimState m) r ix e -> m b)
-> m ([a], Array r ix e)
createArray Comp
comp Sz ix
sz Scheduler m a -> MArray (PrimState m) r ix e -> m b
action = do
MArray (PrimState m) r ix e
marr <- Sz ix -> m (MArray (PrimState m) r ix e)
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
Sz ix -> m (MArray (PrimState m) r ix e)
new Sz ix
sz
[a]
a <- Comp -> (Scheduler m a -> m b) -> m [a]
forall (m :: * -> *) a b.
MonadUnliftIO m =>
Comp -> (Scheduler m a -> m b) -> m [a]
withScheduler Comp
comp (Scheduler m a -> MArray (PrimState m) r ix e -> m b
`action` MArray (PrimState m) r ix e
marr)
Array r ix e
arr <- Comp -> MArray (PrimState m) r ix e -> m (Array r ix e)
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
Comp -> MArray (PrimState m) r ix e -> m (Array r ix e)
unsafeFreeze Comp
comp MArray (PrimState m) r ix e
marr
([a], Array r ix e) -> m ([a], Array r ix e)
forall (m :: * -> *) a. Monad m => a -> m a
return ([a]
a, Array r ix e
arr)
{-# INLINE createArray #-}
createArrayS_ ::
forall r ix e a m. (Mutable r ix e, PrimMonad m)
=> Sz ix
-> (MArray (PrimState m) r ix e -> m a)
-> m (Array r ix e)
createArrayS_ :: Sz ix -> (MArray (PrimState m) r ix e -> m a) -> m (Array r ix e)
createArrayS_ Sz ix
sz MArray (PrimState m) r ix e -> m a
action = (a, Array r ix e) -> Array r ix e
forall a b. (a, b) -> b
snd ((a, Array r ix e) -> Array r ix e)
-> m (a, Array r ix e) -> m (Array r ix e)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Sz ix
-> (MArray (PrimState m) r ix e -> m a) -> m (a, Array r ix e)
forall r ix e a (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
Sz ix
-> (MArray (PrimState m) r ix e -> m a) -> m (a, Array r ix e)
createArrayS Sz ix
sz MArray (PrimState m) r ix e -> m a
action
{-# INLINE createArrayS_ #-}
createArrayS ::
forall r ix e a m. (Mutable r ix e, PrimMonad m)
=> Sz ix
-> (MArray (PrimState m) r ix e -> m a)
-> m (a, Array r ix e)
createArrayS :: Sz ix
-> (MArray (PrimState m) r ix e -> m a) -> m (a, Array r ix e)
createArrayS Sz ix
sz MArray (PrimState m) r ix e -> m a
action = do
MArray (PrimState m) r ix e
marr <- Sz ix -> m (MArray (PrimState m) r ix e)
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
Sz ix -> m (MArray (PrimState m) r ix e)
new Sz ix
sz
a
a <- MArray (PrimState m) r ix e -> m a
action MArray (PrimState m) r ix e
marr
Array r ix e
arr <- Comp -> MArray (PrimState m) r ix e -> m (Array r ix e)
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
Comp -> MArray (PrimState m) r ix e -> m (Array r ix e)
unsafeFreeze Comp
Seq MArray (PrimState m) r ix e
marr
(a, Array r ix e) -> m (a, Array r ix e)
forall (m :: * -> *) a. Monad m => a -> m a
return (a
a, Array r ix e
arr)
{-# INLINE createArrayS #-}
createArrayST_ ::
forall r ix e a. Mutable r ix e
=> Sz ix
-> (forall s. MArray s r ix e -> ST s a)
-> Array r ix e
createArrayST_ :: Sz ix -> (forall s. MArray s r ix e -> ST s a) -> Array r ix e
createArrayST_ Sz ix
sz forall s. MArray s r ix e -> ST s a
action = (forall s. ST s (Array r ix e)) -> Array r ix e
forall a. (forall s. ST s a) -> a
runST ((forall s. ST s (Array r ix e)) -> Array r ix e)
-> (forall s. ST s (Array r ix e)) -> Array r ix e
forall a b. (a -> b) -> a -> b
$ Sz ix
-> (MArray (PrimState (ST s)) r ix e -> ST s a)
-> ST s (Array r ix e)
forall r ix e a (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
Sz ix -> (MArray (PrimState m) r ix e -> m a) -> m (Array r ix e)
createArrayS_ Sz ix
sz MArray (PrimState (ST s)) r ix e -> ST s a
forall s. MArray s r ix e -> ST s a
action
{-# INLINE createArrayST_ #-}
createArrayST ::
forall r ix e a. Mutable r ix e
=> Sz ix
-> (forall s. MArray s r ix e -> ST s a)
-> (a, Array r ix e)
createArrayST :: Sz ix -> (forall s. MArray s r ix e -> ST s a) -> (a, Array r ix e)
createArrayST Sz ix
sz forall s. MArray s r ix e -> ST s a
action = (forall s. ST s (a, Array r ix e)) -> (a, Array r ix e)
forall a. (forall s. ST s a) -> a
runST ((forall s. ST s (a, Array r ix e)) -> (a, Array r ix e))
-> (forall s. ST s (a, Array r ix e)) -> (a, Array r ix e)
forall a b. (a -> b) -> a -> b
$ Sz ix
-> (MArray (PrimState (ST s)) r ix e -> ST s a)
-> ST s (a, Array r ix e)
forall r ix e a (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
Sz ix
-> (MArray (PrimState m) r ix e -> m a) -> m (a, Array r ix e)
createArrayS Sz ix
sz MArray (PrimState (ST s)) r ix e -> ST s a
forall s. MArray s r ix e -> ST s a
action
{-# INLINE createArrayST #-}
generateArrayS ::
forall r ix e m. (Mutable r ix e, PrimMonad m)
=> Sz ix
-> (ix -> m e)
-> m (Array r ix e)
generateArrayS :: Sz ix -> (ix -> m e) -> m (Array r ix e)
generateArrayS Sz ix
sz ix -> m e
gen = Sz ix -> (Int -> m e) -> m (Array r ix e)
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
Sz ix -> (Int -> m e) -> m (Array r ix e)
generateArrayLinearS Sz ix
sz (ix -> m e
gen (ix -> m e) -> (Int -> ix) -> Int -> m e
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Sz ix -> Int -> ix
forall ix. Index ix => Sz ix -> Int -> ix
fromLinearIndex Sz ix
sz)
{-# INLINE generateArrayS #-}
generateArrayLinearS ::
forall r ix e m. (Mutable r ix e, PrimMonad m)
=> Sz ix
-> (Int -> m e)
-> m (Array r ix e)
generateArrayLinearS :: Sz ix -> (Int -> m e) -> m (Array r ix e)
generateArrayLinearS Sz ix
sz Int -> m e
gen = do
MArray (PrimState m) r ix e
marr <- Sz ix -> m (MArray (PrimState m) r ix e)
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
Sz ix -> m (MArray (PrimState m) r ix e)
unsafeNew Sz ix
sz
Int -> (Int -> Bool) -> (Int -> Int) -> (Int -> m ()) -> m ()
forall (m :: * -> *) a.
Monad m =>
Int -> (Int -> Bool) -> (Int -> Int) -> (Int -> m a) -> m ()
loopM_ Int
0 (Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Sz ix -> Int
forall ix. Index ix => Sz ix -> Int
totalElem (MArray (PrimState m) r ix e -> Sz ix
forall r ix e s. Mutable r ix e => MArray s r ix e -> Sz ix
msize MArray (PrimState m) r ix e
marr)) (Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) ((Int -> m ()) -> m ()) -> (Int -> m ()) -> m ()
forall a b. (a -> b) -> a -> b
$ \Int
i -> Int -> m e
gen Int
i m e -> (e -> m ()) -> m ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= MArray (PrimState m) r ix e -> Int -> e -> m ()
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
MArray (PrimState m) r ix e -> Int -> e -> m ()
unsafeLinearWrite MArray (PrimState m) r ix e
marr Int
i
Comp -> MArray (PrimState m) r ix e -> m (Array r ix e)
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
Comp -> MArray (PrimState m) r ix e -> m (Array r ix e)
unsafeFreeze Comp
Seq MArray (PrimState m) r ix e
marr
{-# INLINE generateArrayLinearS #-}
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)
generateArray :: Comp -> Sz ix -> (ix -> m e) -> m (Array r ix e)
generateArray Comp
comp Sz ix
sz ix -> m e
f = Comp -> Sz ix -> (Int -> m e) -> m (Array r ix e)
forall r ix e (m :: * -> *).
(MonadUnliftIO m, PrimMonad m, Mutable r ix e) =>
Comp -> Sz ix -> (Int -> m e) -> m (Array r ix e)
generateArrayLinear Comp
comp Sz ix
sz (ix -> m e
f (ix -> m e) -> (Int -> ix) -> Int -> m e
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Sz ix -> Int -> ix
forall ix. Index ix => Sz ix -> Int -> ix
fromLinearIndex Sz ix
sz)
{-# INLINE generateArray #-}
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)
generateArrayLinear :: Comp -> Sz ix -> (Int -> m e) -> m (Array r ix e)
generateArrayLinear Comp
comp Sz ix
sz Int -> m e
f = Comp -> Sz ix -> (Int -> m e) -> m (MArray (PrimState m) r ix e)
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)
makeMArrayLinear Comp
comp Sz ix
sz Int -> m e
f m (MArray (PrimState m) r ix e)
-> (MArray (PrimState m) r ix e -> m (Array r ix e))
-> m (Array r ix e)
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Comp -> MArray (PrimState m) r ix e -> m (Array r ix e)
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
Comp -> MArray (PrimState m) r ix e -> m (Array r ix e)
unsafeFreeze Comp
comp
{-# INLINE generateArrayLinear #-}
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)
generateArrayLinearWS :: WorkerStates s -> Sz ix -> (Int -> s -> m e) -> m (Array r ix e)
generateArrayLinearWS WorkerStates s
states Sz ix
sz Int -> s -> m e
make = do
MArray (PrimState m) r ix e
marr <- Sz ix -> m (MArray (PrimState m) r ix e)
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
Sz ix -> m (MArray (PrimState m) r ix e)
unsafeNew Sz ix
sz
WorkerStates s -> (SchedulerWS s m () -> m ()) -> m ()
forall (m :: * -> *) s b.
MonadUnliftIO m =>
WorkerStates s -> (SchedulerWS s m () -> m b) -> m ()
withSchedulerWS_ WorkerStates s
states ((SchedulerWS s m () -> m ()) -> m ())
-> (SchedulerWS s m () -> m ()) -> m ()
forall a b. (a -> b) -> a -> b
$ \SchedulerWS s m ()
schedulerWS ->
SchedulerWS s m ()
-> Int -> (Int -> s -> m e) -> (Int -> e -> m ()) -> m ()
forall (m :: * -> *) s b c.
Monad m =>
SchedulerWS s m ()
-> Int -> (Int -> s -> m b) -> (Int -> b -> m c) -> m ()
splitLinearlyWithStatefulM_
SchedulerWS s m ()
schedulerWS
(Sz ix -> Int
forall ix. Index ix => Sz ix -> Int
totalElem Sz ix
sz)
Int -> s -> m e
make
(MArray (PrimState m) r ix e -> Int -> e -> m ()
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
MArray (PrimState m) r ix e -> Int -> e -> m ()
unsafeLinearWrite MArray (PrimState m) r ix e
marr)
Comp -> MArray (PrimState m) r ix e -> m (Array r ix e)
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
Comp -> MArray (PrimState m) r ix e -> m (Array r ix e)
unsafeFreeze (WorkerStates s -> Comp
forall s. WorkerStates s -> Comp
workerStatesComp WorkerStates s
states) MArray (PrimState m) r ix e
marr
{-# INLINE generateArrayLinearWS #-}
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)
generateArrayWS :: WorkerStates s -> Sz ix -> (ix -> s -> m e) -> m (Array r ix e)
generateArrayWS WorkerStates s
states Sz ix
sz ix -> s -> m e
make = WorkerStates s -> Sz ix -> (Int -> s -> m e) -> m (Array r ix e)
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)
generateArrayLinearWS WorkerStates s
states Sz ix
sz (ix -> s -> m e
make (ix -> s -> m e) -> (Int -> ix) -> Int -> s -> m e
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Sz ix -> Int -> ix
forall ix. Index ix => Sz ix -> Int -> ix
fromLinearIndex Sz ix
sz)
{-# INLINE generateArrayWS #-}
unfoldrPrimM_ ::
forall r ix e a m. (Mutable r ix e, PrimMonad m)
=> Sz ix
-> (a -> m (e, a))
-> a
-> m (Array r ix e)
unfoldrPrimM_ :: Sz ix -> (a -> m (e, a)) -> a -> m (Array r ix e)
unfoldrPrimM_ Sz ix
sz a -> m (e, a)
gen a
acc0 = (a, Array r ix e) -> Array r ix e
forall a b. (a, b) -> b
snd ((a, Array r ix e) -> Array r ix e)
-> m (a, Array r ix e) -> m (Array r ix e)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Sz ix -> (a -> m (e, a)) -> a -> m (a, Array r ix e)
forall r ix e a (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
Sz ix -> (a -> m (e, a)) -> a -> m (a, Array r ix e)
unfoldrPrimM Sz ix
sz a -> m (e, a)
gen a
acc0
{-# INLINE unfoldrPrimM_ #-}
iunfoldrPrimM_ ::
forall r ix e a m. (Mutable r ix e, PrimMonad m)
=> Sz ix
-> (a -> ix -> m (e, a))
-> a
-> m (Array r ix e)
iunfoldrPrimM_ :: Sz ix -> (a -> ix -> m (e, a)) -> a -> m (Array r ix e)
iunfoldrPrimM_ Sz ix
sz a -> ix -> m (e, a)
gen a
acc0 = (a, Array r ix e) -> Array r ix e
forall a b. (a, b) -> b
snd ((a, Array r ix e) -> Array r ix e)
-> m (a, Array r ix e) -> m (Array r ix e)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Sz ix -> (a -> ix -> m (e, a)) -> a -> m (a, Array r ix e)
forall r ix e a (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
Sz ix -> (a -> ix -> m (e, a)) -> a -> m (a, Array r ix e)
iunfoldrPrimM Sz ix
sz a -> ix -> m (e, a)
gen a
acc0
{-# INLINE iunfoldrPrimM_ #-}
iunfoldrPrimM ::
forall r ix e a m. (Mutable r ix e, PrimMonad m)
=> Sz ix
-> (a -> ix -> m (e, a))
-> a
-> m (a, Array r ix e)
iunfoldrPrimM :: Sz ix -> (a -> ix -> m (e, a)) -> a -> m (a, Array r ix e)
iunfoldrPrimM Sz ix
sz a -> ix -> m (e, a)
gen a
acc0 =
Sz ix
-> (MArray (PrimState m) r ix e -> m a) -> m (a, Array r ix e)
forall r ix e a (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
Sz ix
-> (MArray (PrimState m) r ix e -> m a) -> m (a, Array r ix e)
unsafeCreateArrayS Sz ix
sz ((MArray (PrimState m) r ix e -> m a) -> m (a, Array r ix e))
-> (MArray (PrimState m) r ix e -> m a) -> m (a, Array r ix e)
forall a b. (a -> b) -> a -> b
$ \MArray (PrimState m) r ix e
marr ->
let sz' :: Sz ix
sz' = MArray (PrimState m) r ix e -> Sz ix
forall r ix e s. Mutable r ix e => MArray s r ix e -> Sz ix
msize MArray (PrimState m) r ix e
marr
in Sz ix
-> Int
-> Int
-> Int
-> (Int -> Int -> Bool)
-> a
-> (Int -> ix -> a -> m a)
-> m a
forall ix (m :: * -> *) a.
(Index ix, Monad m) =>
Sz ix
-> Int
-> Int
-> Int
-> (Int -> Int -> Bool)
-> a
-> (Int -> ix -> a -> m a)
-> m a
iterLinearM Sz ix
sz' Int
0 (Sz ix -> Int
forall ix. Index ix => Sz ix -> Int
totalElem Sz ix
sz') Int
1 Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
(<) a
acc0 ((Int -> ix -> a -> m a) -> m a) -> (Int -> ix -> a -> m a) -> m a
forall a b. (a -> b) -> a -> b
$ \ !Int
i ix
ix !a
acc -> do
(e
e, a
acc') <- a -> ix -> m (e, a)
gen a
acc ix
ix
MArray (PrimState m) r ix e -> Int -> e -> m ()
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
MArray (PrimState m) r ix e -> Int -> e -> m ()
unsafeLinearWrite MArray (PrimState m) r ix e
marr Int
i e
e
a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure a
acc'
{-# INLINE iunfoldrPrimM #-}
unfoldrPrimM ::
forall r ix e a m. (Mutable r ix e, PrimMonad m)
=> Sz ix
-> (a -> m (e, a))
-> a
-> m (a, Array r ix e)
unfoldrPrimM :: Sz ix -> (a -> m (e, a)) -> a -> m (a, Array r ix e)
unfoldrPrimM Sz ix
sz a -> m (e, a)
gen a
acc0 =
Sz ix
-> (MArray (PrimState m) r ix e -> m a) -> m (a, Array r ix e)
forall r ix e a (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
Sz ix
-> (MArray (PrimState m) r ix e -> m a) -> m (a, Array r ix e)
unsafeCreateArrayS Sz ix
sz ((MArray (PrimState m) r ix e -> m a) -> m (a, Array r ix e))
-> (MArray (PrimState m) r ix e -> m a) -> m (a, Array r ix e)
forall a b. (a -> b) -> a -> b
$ \MArray (PrimState m) r ix e
marr ->
let sz' :: Sz ix
sz' = MArray (PrimState m) r ix e -> Sz ix
forall r ix e s. Mutable r ix e => MArray s r ix e -> Sz ix
msize MArray (PrimState m) r ix e
marr
in Int
-> (Int -> Bool) -> (Int -> Int) -> a -> (Int -> a -> m a) -> m a
forall (m :: * -> *) a.
Monad m =>
Int
-> (Int -> Bool) -> (Int -> Int) -> a -> (Int -> a -> m a) -> m a
loopM Int
0 (Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Sz ix -> Int
forall ix. Index ix => Sz ix -> Int
totalElem Sz ix
sz') (Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) a
acc0 ((Int -> a -> m a) -> m a) -> (Int -> a -> m a) -> m a
forall a b. (a -> b) -> a -> b
$ \ !Int
i !a
acc -> do
(e
e, a
acc') <- a -> m (e, a)
gen a
acc
MArray (PrimState m) r ix e -> Int -> e -> m ()
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
MArray (PrimState m) r ix e -> Int -> e -> m ()
unsafeLinearWrite MArray (PrimState m) r ix e
marr Int
i e
e
a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure a
acc'
{-# INLINE unfoldrPrimM #-}
unfoldlPrimM_ ::
forall r ix e a m. (Mutable r ix e, PrimMonad m)
=> Sz ix
-> (a -> m (a, e))
-> a
-> m (Array r ix e)
unfoldlPrimM_ :: Sz ix -> (a -> m (a, e)) -> a -> m (Array r ix e)
unfoldlPrimM_ Sz ix
sz a -> m (a, e)
gen a
acc0 = (a, Array r ix e) -> Array r ix e
forall a b. (a, b) -> b
snd ((a, Array r ix e) -> Array r ix e)
-> m (a, Array r ix e) -> m (Array r ix e)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Sz ix -> (a -> m (a, e)) -> a -> m (a, Array r ix e)
forall r ix e a (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
Sz ix -> (a -> m (a, e)) -> a -> m (a, Array r ix e)
unfoldlPrimM Sz ix
sz a -> m (a, e)
gen a
acc0
{-# INLINE unfoldlPrimM_ #-}
iunfoldlPrimM_ ::
forall r ix e a m. (Mutable r ix e, PrimMonad m)
=> Sz ix
-> (a -> ix -> m (a, e))
-> a
-> m (Array r ix e)
iunfoldlPrimM_ :: Sz ix -> (a -> ix -> m (a, e)) -> a -> m (Array r ix e)
iunfoldlPrimM_ Sz ix
sz a -> ix -> m (a, e)
gen a
acc0 = (a, Array r ix e) -> Array r ix e
forall a b. (a, b) -> b
snd ((a, Array r ix e) -> Array r ix e)
-> m (a, Array r ix e) -> m (Array r ix e)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Sz ix -> (a -> ix -> m (a, e)) -> a -> m (a, Array r ix e)
forall r ix e a (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
Sz ix -> (a -> ix -> m (a, e)) -> a -> m (a, Array r ix e)
iunfoldlPrimM Sz ix
sz a -> ix -> m (a, e)
gen a
acc0
{-# INLINE iunfoldlPrimM_ #-}
iunfoldlPrimM ::
forall r ix e a m. (Mutable r ix e, PrimMonad m)
=> Sz ix
-> (a -> ix -> m (a, e))
-> a
-> m (a, Array r ix e)
iunfoldlPrimM :: Sz ix -> (a -> ix -> m (a, e)) -> a -> m (a, Array r ix e)
iunfoldlPrimM Sz ix
sz a -> ix -> m (a, e)
gen a
acc0 =
Sz ix
-> (MArray (PrimState m) r ix e -> m a) -> m (a, Array r ix e)
forall r ix e a (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
Sz ix
-> (MArray (PrimState m) r ix e -> m a) -> m (a, Array r ix e)
unsafeCreateArrayS Sz ix
sz ((MArray (PrimState m) r ix e -> m a) -> m (a, Array r ix e))
-> (MArray (PrimState m) r ix e -> m a) -> m (a, Array r ix e)
forall a b. (a -> b) -> a -> b
$ \MArray (PrimState m) r ix e
marr ->
let sz' :: Sz ix
sz' = MArray (PrimState m) r ix e -> Sz ix
forall r ix e s. Mutable r ix e => MArray s r ix e -> Sz ix
msize MArray (PrimState m) r ix e
marr
in Sz ix
-> Int
-> Int
-> Int
-> (Int -> Int -> Bool)
-> a
-> (Int -> ix -> a -> m a)
-> m a
forall ix (m :: * -> *) a.
(Index ix, Monad m) =>
Sz ix
-> Int
-> Int
-> Int
-> (Int -> Int -> Bool)
-> a
-> (Int -> ix -> a -> m a)
-> m a
iterLinearM Sz ix
sz' (Sz ix -> Int
forall ix. Index ix => Sz ix -> Int
totalElem Sz ix
sz' Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) Int
0 (Int -> Int
forall a. Num a => a -> a
negate Int
1) Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
(>=) a
acc0 ((Int -> ix -> a -> m a) -> m a) -> (Int -> ix -> a -> m a) -> m a
forall a b. (a -> b) -> a -> b
$ \ !Int
i ix
ix !a
acc -> do
(a
acc', e
e) <- a -> ix -> m (a, e)
gen a
acc ix
ix
MArray (PrimState m) r ix e -> Int -> e -> m ()
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
MArray (PrimState m) r ix e -> Int -> e -> m ()
unsafeLinearWrite MArray (PrimState m) r ix e
marr Int
i e
e
a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure a
acc'
{-# INLINE iunfoldlPrimM #-}
unfoldlPrimM ::
forall r ix e a m. (Mutable r ix e, PrimMonad m)
=> Sz ix
-> (a -> m (a, e))
-> a
-> m (a, Array r ix e)
unfoldlPrimM :: Sz ix -> (a -> m (a, e)) -> a -> m (a, Array r ix e)
unfoldlPrimM Sz ix
sz a -> m (a, e)
gen a
acc0 =
Sz ix
-> (MArray (PrimState m) r ix e -> m a) -> m (a, Array r ix e)
forall r ix e a (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
Sz ix
-> (MArray (PrimState m) r ix e -> m a) -> m (a, Array r ix e)
unsafeCreateArrayS Sz ix
sz ((MArray (PrimState m) r ix e -> m a) -> m (a, Array r ix e))
-> (MArray (PrimState m) r ix e -> m a) -> m (a, Array r ix e)
forall a b. (a -> b) -> a -> b
$ \MArray (PrimState m) r ix e
marr ->
let sz' :: Sz ix
sz' = MArray (PrimState m) r ix e -> Sz ix
forall r ix e s. Mutable r ix e => MArray s r ix e -> Sz ix
msize MArray (PrimState m) r ix e
marr
in Int
-> (Int -> Bool) -> (Int -> Int) -> a -> (Int -> a -> m a) -> m a
forall (m :: * -> *) a.
Monad m =>
Int
-> (Int -> Bool) -> (Int -> Int) -> a -> (Int -> a -> m a) -> m a
loopDeepM Int
0 (Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Sz ix -> Int
forall ix. Index ix => Sz ix -> Int
totalElem Sz ix
sz') (Int -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1) a
acc0 ((Int -> a -> m a) -> m a) -> (Int -> a -> m a) -> m a
forall a b. (a -> b) -> a -> b
$ \ !Int
i !a
acc -> do
(a
acc', e
e) <- a -> m (a, e)
gen a
acc
MArray (PrimState m) r ix e -> Int -> e -> m ()
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
MArray (PrimState m) r ix e -> Int -> e -> m ()
unsafeLinearWrite MArray (PrimState m) r ix e
marr Int
i e
e
a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure a
acc'
{-# INLINE unfoldlPrimM #-}
forPrimM_ :: (Mutable r ix e, PrimMonad m) => MArray (PrimState m) r ix e -> (e -> m ()) -> m ()
forPrimM_ :: MArray (PrimState m) r ix e -> (e -> m ()) -> m ()
forPrimM_ MArray (PrimState m) r ix e
marr e -> m ()
f =
Int -> (Int -> Bool) -> (Int -> Int) -> (Int -> m ()) -> m ()
forall (m :: * -> *) a.
Monad m =>
Int -> (Int -> Bool) -> (Int -> Int) -> (Int -> m a) -> m ()
loopM_ Int
0 (Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Sz ix -> Int
forall ix. Index ix => Sz ix -> Int
totalElem (MArray (PrimState m) r ix e -> Sz ix
forall r ix e s. Mutable r ix e => MArray s r ix e -> Sz ix
msize MArray (PrimState m) r ix e
marr)) (Int -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1) (MArray (PrimState m) r ix e -> Int -> m e
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
MArray (PrimState m) r ix e -> Int -> m e
unsafeLinearRead MArray (PrimState m) r ix e
marr (Int -> m e) -> (e -> m ()) -> Int -> m ()
forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> e -> m ()
f)
{-# INLINE forPrimM_ #-}
forPrimM :: (Mutable r ix e, PrimMonad m) => MArray (PrimState m) r ix e -> (e -> m e) -> m ()
forPrimM :: MArray (PrimState m) r ix e -> (e -> m e) -> m ()
forPrimM MArray (PrimState m) r ix e
marr e -> m e
f =
Int -> (Int -> Bool) -> (Int -> Int) -> (Int -> m e) -> m ()
forall (m :: * -> *) a.
Monad m =>
Int -> (Int -> Bool) -> (Int -> Int) -> (Int -> m a) -> m ()
loopM_ Int
0 (Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Sz ix -> Int
forall ix. Index ix => Sz ix -> Int
totalElem (MArray (PrimState m) r ix e -> Sz ix
forall r ix e s. Mutable r ix e => MArray s r ix e -> Sz ix
msize MArray (PrimState m) r ix e
marr)) (Int -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1) (MArray (PrimState m) r ix e -> (e -> m e) -> Int -> m e
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
MArray (PrimState m) r ix e -> (e -> m e) -> Int -> m e
unsafeLinearModify MArray (PrimState m) r ix e
marr e -> m e
f)
{-# INLINE forPrimM #-}
iforPrimM_ ::
(Mutable r ix e, PrimMonad m) => MArray (PrimState m) r ix e -> (ix -> e -> m ()) -> m ()
iforPrimM_ :: MArray (PrimState m) r ix e -> (ix -> e -> m ()) -> m ()
iforPrimM_ MArray (PrimState m) r ix e
marr ix -> e -> m ()
f = MArray (PrimState m) r ix e -> (Int -> e -> m ()) -> m ()
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
MArray (PrimState m) r ix e -> (Int -> e -> m ()) -> m ()
iforLinearPrimM_ MArray (PrimState m) r ix e
marr (ix -> e -> m ()
f (ix -> e -> m ()) -> (Int -> ix) -> Int -> e -> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Sz ix -> Int -> ix
forall ix. Index ix => Sz ix -> Int -> ix
fromLinearIndex (MArray (PrimState m) r ix e -> Sz ix
forall r ix e s. Mutable r ix e => MArray s r ix e -> Sz ix
msize MArray (PrimState m) r ix e
marr))
{-# INLINE iforPrimM_ #-}
iforPrimM ::
(Mutable r ix e, PrimMonad m) => MArray (PrimState m) r ix e -> (ix -> e -> m e) -> m ()
iforPrimM :: MArray (PrimState m) r ix e -> (ix -> e -> m e) -> m ()
iforPrimM MArray (PrimState m) r ix e
marr ix -> e -> m e
f = MArray (PrimState m) r ix e -> (Int -> e -> m e) -> m ()
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
MArray (PrimState m) r ix e -> (Int -> e -> m e) -> m ()
iforLinearPrimM MArray (PrimState m) r ix e
marr (ix -> e -> m e
f (ix -> e -> m e) -> (Int -> ix) -> Int -> e -> m e
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Sz ix -> Int -> ix
forall ix. Index ix => Sz ix -> Int -> ix
fromLinearIndex (MArray (PrimState m) r ix e -> Sz ix
forall r ix e s. Mutable r ix e => MArray s r ix e -> Sz ix
msize MArray (PrimState m) r ix e
marr))
{-# INLINE iforPrimM #-}
iforLinearPrimM_ ::
(Mutable r ix e, PrimMonad m) => MArray (PrimState m) r ix e -> (Int -> e -> m ()) -> m ()
iforLinearPrimM_ :: MArray (PrimState m) r ix e -> (Int -> e -> m ()) -> m ()
iforLinearPrimM_ MArray (PrimState m) r ix e
marr Int -> e -> m ()
f =
Int -> (Int -> Bool) -> (Int -> Int) -> (Int -> m ()) -> m ()
forall (m :: * -> *) a.
Monad m =>
Int -> (Int -> Bool) -> (Int -> Int) -> (Int -> m a) -> m ()
loopM_ Int
0 (Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Sz ix -> Int
forall ix. Index ix => Sz ix -> Int
totalElem (MArray (PrimState m) r ix e -> Sz ix
forall r ix e s. Mutable r ix e => MArray s r ix e -> Sz ix
msize MArray (PrimState m) r ix e
marr)) (Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) (\Int
i -> MArray (PrimState m) r ix e -> Int -> m e
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
MArray (PrimState m) r ix e -> Int -> m e
unsafeLinearRead MArray (PrimState m) r ix e
marr Int
i m e -> (e -> m ()) -> m ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Int -> e -> m ()
f Int
i)
{-# INLINE iforLinearPrimM_ #-}
iforLinearPrimM ::
(Mutable r ix e, PrimMonad m) => MArray (PrimState m) r ix e -> (Int -> e -> m e) -> m ()
iforLinearPrimM :: MArray (PrimState m) r ix e -> (Int -> e -> m e) -> m ()
iforLinearPrimM MArray (PrimState m) r ix e
marr Int -> e -> m e
f =
Int -> (Int -> Bool) -> (Int -> Int) -> (Int -> m e) -> m ()
forall (m :: * -> *) a.
Monad m =>
Int -> (Int -> Bool) -> (Int -> Int) -> (Int -> m a) -> m ()
loopM_ Int
0 (Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Sz ix -> Int
forall ix. Index ix => Sz ix -> Int
totalElem (MArray (PrimState m) r ix e -> Sz ix
forall r ix e s. Mutable r ix e => MArray s r ix e -> Sz ix
msize MArray (PrimState m) r ix e
marr)) (Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) (\Int
i -> MArray (PrimState m) r ix e -> (e -> m e) -> Int -> m e
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
MArray (PrimState m) r ix e -> (e -> m e) -> Int -> m e
unsafeLinearModify MArray (PrimState m) r ix e
marr (Int -> e -> m e
f Int
i) Int
i)
{-# INLINE iforLinearPrimM #-}
withMArray ::
(Mutable r ix e, MonadUnliftIO m)
=> Array r ix e
-> (Scheduler m a -> MArray RealWorld r ix e -> m b)
-> m ([a], Array r ix e)
withMArray :: Array r ix e
-> (Scheduler m a -> MArray RealWorld r ix e -> m b)
-> m ([a], Array r ix e)
withMArray Array r ix e
arr Scheduler m a -> MArray RealWorld r ix e -> m b
action = do
MArray RealWorld r ix e
marr <- Array r ix e -> m (MArray RealWorld r ix e)
forall r ix e (m :: * -> *).
(Mutable r ix e, MonadIO m) =>
Array r ix e -> m (MArray RealWorld r ix e)
thaw Array r ix e
arr
[a]
xs <- Comp -> (Scheduler m a -> m b) -> m [a]
forall (m :: * -> *) a b.
MonadUnliftIO m =>
Comp -> (Scheduler m a -> m b) -> m [a]
withScheduler (Array r ix e -> Comp
forall r ix e. Load r ix e => Array r ix e -> Comp
getComp Array r ix e
arr) (Scheduler m a -> MArray RealWorld r ix e -> m b
`action` MArray RealWorld r ix e
marr)
IO ([a], Array r ix e) -> m ([a], Array r ix e)
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO ((,) [a]
xs (Array r ix e -> ([a], Array r ix e))
-> IO (Array r ix e) -> IO ([a], Array r ix e)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Comp -> MArray (PrimState IO) r ix e -> IO (Array r ix e)
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
Comp -> MArray (PrimState m) r ix e -> m (Array r ix e)
unsafeFreeze (Array r ix e -> Comp
forall r ix e. Load r ix e => Array r ix e -> Comp
getComp Array r ix e
arr) MArray RealWorld r ix e
MArray (PrimState IO) r ix e
marr)
{-# INLINE withMArray #-}
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)
withMArray_ :: Array r ix e
-> (Scheduler m () -> MArray RealWorld r ix e -> m a)
-> m (Array r ix e)
withMArray_ Array r ix e
arr Scheduler m () -> MArray RealWorld r ix e -> m a
action = do
MArray RealWorld r ix e
marr <- Array r ix e -> m (MArray RealWorld r ix e)
forall r ix e (m :: * -> *).
(Mutable r ix e, MonadIO m) =>
Array r ix e -> m (MArray RealWorld r ix e)
thaw Array r ix e
arr
Comp -> (Scheduler m () -> m a) -> m ()
forall (m :: * -> *) a b.
MonadUnliftIO m =>
Comp -> (Scheduler m a -> m b) -> m ()
withScheduler_ (Array r ix e -> Comp
forall r ix e. Load r ix e => Array r ix e -> Comp
getComp Array r ix e
arr) (Scheduler m () -> MArray RealWorld r ix e -> m a
`action` MArray RealWorld r ix e
marr)
IO (Array r ix e) -> m (Array r ix e)
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (Array r ix e) -> m (Array r ix e))
-> IO (Array r ix e) -> m (Array r ix e)
forall a b. (a -> b) -> a -> b
$ Comp -> MArray (PrimState IO) r ix e -> IO (Array r ix e)
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
Comp -> MArray (PrimState m) r ix e -> m (Array r ix e)
unsafeFreeze (Array r ix e -> Comp
forall r ix e. Load r ix e => Array r ix e -> Comp
getComp Array r ix e
arr) MArray RealWorld r ix e
MArray (PrimState IO) r ix e
marr
{-# INLINE withMArray_ #-}
withMArrayS ::
(Mutable r ix e, PrimMonad m)
=> Array r ix e
-> (MArray (PrimState m) r ix e -> m a)
-> m (a, Array r ix e)
withMArrayS :: Array r ix e
-> (MArray (PrimState m) r ix e -> m a) -> m (a, Array r ix e)
withMArrayS Array r ix e
arr MArray (PrimState m) r ix e -> m a
action = do
MArray (PrimState m) r ix e
marr <- Array r ix e -> m (MArray (PrimState m) r ix e)
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
Array r ix e -> m (MArray (PrimState m) r ix e)
thawS Array r ix e
arr
a
a <- MArray (PrimState m) r ix e -> m a
action MArray (PrimState m) r ix e
marr
(,) a
a (Array r ix e -> (a, Array r ix e))
-> m (Array r ix e) -> m (a, Array r ix e)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Comp -> MArray (PrimState m) r ix e -> m (Array r ix e)
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
Comp -> MArray (PrimState m) r ix e -> m (Array r ix e)
unsafeFreeze (Array r ix e -> Comp
forall r ix e. Load r ix e => Array r ix e -> Comp
getComp Array r ix e
arr) MArray (PrimState m) r ix e
marr
{-# INLINE withMArrayS #-}
withMArrayS_ ::
(Mutable r ix e, PrimMonad m)
=> Array r ix e
-> (MArray (PrimState m) r ix e -> m a)
-> m (Array r ix e)
withMArrayS_ :: Array r ix e
-> (MArray (PrimState m) r ix e -> m a) -> m (Array r ix e)
withMArrayS_ Array r ix e
arr MArray (PrimState m) r ix e -> m a
action = (a, Array r ix e) -> Array r ix e
forall a b. (a, b) -> b
snd ((a, Array r ix e) -> Array r ix e)
-> m (a, Array r ix e) -> m (Array r ix e)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Array r ix e
-> (MArray (PrimState m) r ix e -> m a) -> m (a, Array r ix e)
forall r ix e (m :: * -> *) a.
(Mutable r ix e, PrimMonad m) =>
Array r ix e
-> (MArray (PrimState m) r ix e -> m a) -> m (a, Array r ix e)
withMArrayS Array r ix e
arr MArray (PrimState m) r ix e -> m a
action
{-# INLINE withMArrayS_ #-}
withMArrayST ::
Mutable r ix e
=> Array r ix e
-> (forall s . MArray s r ix e -> ST s a)
-> (a, Array r ix e)
withMArrayST :: Array r ix e
-> (forall s. MArray s r ix e -> ST s a) -> (a, Array r ix e)
withMArrayST Array r ix e
arr forall s. MArray s r ix e -> ST s a
f = (forall s. ST s (a, Array r ix e)) -> (a, Array r ix e)
forall a. (forall s. ST s a) -> a
runST ((forall s. ST s (a, Array r ix e)) -> (a, Array r ix e))
-> (forall s. ST s (a, Array r ix e)) -> (a, Array r ix e)
forall a b. (a -> b) -> a -> b
$ Array r ix e
-> (MArray (PrimState (ST s)) r ix e -> ST s a)
-> ST s (a, Array r ix e)
forall r ix e (m :: * -> *) a.
(Mutable r ix e, PrimMonad m) =>
Array r ix e
-> (MArray (PrimState m) r ix e -> m a) -> m (a, Array r ix e)
withMArrayS Array r ix e
arr MArray (PrimState (ST s)) r ix e -> ST s a
forall s. MArray s r ix e -> ST s a
f
{-# INLINE withMArrayST #-}
withMArrayST_ ::
Mutable r ix e => Array r ix e -> (forall s. MArray s r ix e -> ST s a) -> Array r ix e
withMArrayST_ :: Array r ix e
-> (forall s. MArray s r ix e -> ST s a) -> Array r ix e
withMArrayST_ Array r ix e
arr forall s. MArray s r ix e -> ST s a
f = (forall s. ST s (Array r ix e)) -> Array r ix e
forall a. (forall s. ST s a) -> a
runST ((forall s. ST s (Array r ix e)) -> Array r ix e)
-> (forall s. ST s (Array r ix e)) -> Array r ix e
forall a b. (a -> b) -> a -> b
$ Array r ix e
-> (MArray (PrimState (ST s)) r ix e -> ST s a)
-> ST s (Array r ix e)
forall r ix e (m :: * -> *) a.
(Mutable r ix e, PrimMonad m) =>
Array r ix e
-> (MArray (PrimState m) r ix e -> m a) -> m (Array r ix e)
withMArrayS_ Array r ix e
arr MArray (PrimState (ST s)) r ix e -> ST s a
forall s. MArray s r ix e -> ST s a
f
{-# INLINE withMArrayST_ #-}
read :: (Mutable r ix e, PrimMonad m) =>
MArray (PrimState m) r ix e -> ix -> m (Maybe e)
read :: MArray (PrimState m) r ix e -> ix -> m (Maybe e)
read MArray (PrimState m) r ix e
marr ix
ix =
if Sz ix -> ix -> Bool
forall ix. Index ix => Sz ix -> ix -> Bool
isSafeIndex (MArray (PrimState m) r ix e -> Sz ix
forall r ix e s. Mutable r ix e => MArray s r ix e -> Sz ix
msize MArray (PrimState m) r ix e
marr) ix
ix
then e -> Maybe e
forall a. a -> Maybe a
Just (e -> Maybe e) -> m e -> m (Maybe e)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> MArray (PrimState m) r ix e -> ix -> m e
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
MArray (PrimState m) r ix e -> ix -> m e
unsafeRead MArray (PrimState m) r ix e
marr ix
ix
else Maybe e -> m (Maybe e)
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe e
forall a. Maybe a
Nothing
{-# INLINE read #-}
readM :: (Mutable r ix e, PrimMonad m, MonadThrow m) =>
MArray (PrimState m) r ix e -> ix -> m e
readM :: MArray (PrimState m) r ix e -> ix -> m e
readM MArray (PrimState m) r ix e
marr ix
ix =
MArray (PrimState m) r ix e -> ix -> m (Maybe e)
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
MArray (PrimState m) r ix e -> ix -> m (Maybe e)
read MArray (PrimState m) r ix e
marr ix
ix m (Maybe e) -> (Maybe e -> m e) -> m e
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
Just e
e -> e -> m e
forall (f :: * -> *) a. Applicative f => a -> f a
pure e
e
Maybe e
Nothing -> IndexException -> m e
forall (m :: * -> *) e a. (MonadThrow m, Exception e) => e -> m a
throwM (IndexException -> m e) -> IndexException -> m e
forall a b. (a -> b) -> a -> b
$ Sz ix -> ix -> IndexException
forall ix. Index ix => Sz ix -> ix -> IndexException
IndexOutOfBoundsException (MArray (PrimState m) r ix e -> Sz ix
forall r ix e s. Mutable r ix e => MArray s r ix e -> Sz ix
msize MArray (PrimState m) r ix e
marr) ix
ix
{-# INLINE readM #-}
read' :: (Mutable r ix e, PrimMonad m) => MArray (PrimState m) r ix e -> ix -> m e
read' :: MArray (PrimState m) r ix e -> ix -> m e
read' MArray (PrimState m) r ix e
marr ix
ix =
MArray (PrimState m) r ix e -> ix -> m (Maybe e)
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
MArray (PrimState m) r ix e -> ix -> m (Maybe e)
read MArray (PrimState m) r ix e
marr ix
ix m (Maybe e) -> (Maybe e -> m e) -> m e
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
Just e
e -> e -> m e
forall (f :: * -> *) a. Applicative f => a -> f a
pure e
e
Maybe e
Nothing -> IndexException -> m e
forall a e. Exception e => e -> a
throw (IndexException -> m e) -> IndexException -> m e
forall a b. (a -> b) -> a -> b
$ Sz ix -> ix -> IndexException
forall ix. Index ix => Sz ix -> ix -> IndexException
IndexOutOfBoundsException (MArray (PrimState m) r ix e -> Sz ix
forall r ix e s. Mutable r ix e => MArray s r ix e -> Sz ix
msize MArray (PrimState m) r ix e
marr) ix
ix
{-# INLINE read' #-}
{-# DEPRECATED read' "In favor of more general `readM`" #-}
write :: (Mutable r ix e, PrimMonad m) => MArray (PrimState m) r ix e -> ix -> e -> m Bool
write :: MArray (PrimState m) r ix e -> ix -> e -> m Bool
write MArray (PrimState m) r ix e
marr ix
ix e
e =
if Sz ix -> ix -> Bool
forall ix. Index ix => Sz ix -> ix -> Bool
isSafeIndex (MArray (PrimState m) r ix e -> Sz ix
forall r ix e s. Mutable r ix e => MArray s r ix e -> Sz ix
msize MArray (PrimState m) r ix e
marr) ix
ix
then MArray (PrimState m) r ix e -> ix -> e -> m ()
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
MArray (PrimState m) r ix e -> ix -> e -> m ()
unsafeWrite MArray (PrimState m) r ix e
marr ix
ix e
e m () -> m Bool -> m Bool
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Bool -> m Bool
forall (f :: * -> *) a. Applicative f => a -> f a
pure Bool
True
else Bool -> m Bool
forall (f :: * -> *) a. Applicative f => a -> f a
pure Bool
False
{-# INLINE write #-}
write_ :: (Mutable r ix e, PrimMonad m) => MArray (PrimState m) r ix e -> ix -> e -> m ()
write_ :: MArray (PrimState m) r ix e -> ix -> e -> m ()
write_ MArray (PrimState m) r ix e
marr ix
ix = Bool -> m () -> m ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Sz ix -> ix -> Bool
forall ix. Index ix => Sz ix -> ix -> Bool
isSafeIndex (MArray (PrimState m) r ix e -> Sz ix
forall r ix e s. Mutable r ix e => MArray s r ix e -> Sz ix
msize MArray (PrimState m) r ix e
marr) ix
ix) (m () -> m ()) -> (e -> m ()) -> e -> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MArray (PrimState m) r ix e -> ix -> e -> m ()
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
MArray (PrimState m) r ix e -> ix -> e -> m ()
unsafeWrite MArray (PrimState m) r ix e
marr ix
ix
{-# INLINE write_ #-}
writeM ::
(Mutable r ix e, PrimMonad m, MonadThrow m) => MArray (PrimState m) r ix e -> ix -> e -> m ()
writeM :: MArray (PrimState m) r ix e -> ix -> e -> m ()
writeM MArray (PrimState m) r ix e
marr ix
ix e
e =
MArray (PrimState m) r ix e -> ix -> e -> m Bool
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
MArray (PrimState m) r ix e -> ix -> e -> m Bool
write MArray (PrimState m) r ix e
marr ix
ix e
e m Bool -> (Bool -> m ()) -> m ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (Bool -> m () -> m ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
`unless` IndexException -> m ()
forall (m :: * -> *) e a. (MonadThrow m, Exception e) => e -> m a
throwM (Sz ix -> ix -> IndexException
forall ix. Index ix => Sz ix -> ix -> IndexException
IndexOutOfBoundsException (MArray (PrimState m) r ix e -> Sz ix
forall r ix e s. Mutable r ix e => MArray s r ix e -> Sz ix
msize MArray (PrimState m) r ix e
marr) ix
ix))
{-# INLINE writeM #-}
write' ::
(Mutable r ix e, PrimMonad m) => MArray (PrimState m) r ix e -> ix -> e -> m ()
write' :: MArray (PrimState m) r ix e -> ix -> e -> m ()
write' MArray (PrimState m) r ix e
marr ix
ix e
e = MArray (PrimState m) r ix e -> ix -> e -> m Bool
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
MArray (PrimState m) r ix e -> ix -> e -> m Bool
write MArray (PrimState m) r ix e
marr ix
ix e
e m Bool -> (Bool -> m ()) -> m ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (Bool -> m () -> m ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
`unless` IndexException -> m ()
forall a e. Exception e => e -> a
throw (Sz ix -> ix -> IndexException
forall ix. Index ix => Sz ix -> ix -> IndexException
IndexOutOfBoundsException (MArray (PrimState m) r ix e -> Sz ix
forall r ix e s. Mutable r ix e => MArray s r ix e -> Sz ix
msize MArray (PrimState m) r ix e
marr) ix
ix))
{-# INLINE write' #-}
{-# DEPRECATED write' "In favor of more general `writeM`" #-}
modify ::
(Mutable r ix e, PrimMonad m)
=> MArray (PrimState m) r ix e
-> (e -> m e)
-> ix
-> m (Maybe e)
modify :: MArray (PrimState m) r ix e -> (e -> m e) -> ix -> m (Maybe e)
modify MArray (PrimState m) r ix e
marr e -> m e
f ix
ix =
if Sz ix -> ix -> Bool
forall ix. Index ix => Sz ix -> ix -> Bool
isSafeIndex (MArray (PrimState m) r ix e -> Sz ix
forall r ix e s. Mutable r ix e => MArray s r ix e -> Sz ix
msize MArray (PrimState m) r ix e
marr) ix
ix
then e -> Maybe e
forall a. a -> Maybe a
Just (e -> Maybe e) -> m e -> m (Maybe e)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> MArray (PrimState m) r ix e -> (e -> m e) -> ix -> m e
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
MArray (PrimState m) r ix e -> (e -> m e) -> ix -> m e
unsafeModify MArray (PrimState m) r ix e
marr e -> m e
f ix
ix
else Maybe e -> m (Maybe e)
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe e
forall a. Maybe a
Nothing
{-# INLINE modify #-}
modify_ ::
(Mutable r ix e, PrimMonad m)
=> MArray (PrimState m) r ix e
-> (e -> m e)
-> ix
-> m ()
modify_ :: MArray (PrimState m) r ix e -> (e -> m e) -> ix -> m ()
modify_ MArray (PrimState m) r ix e
marr e -> m e
f ix
ix = Bool -> m () -> m ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Sz ix -> ix -> Bool
forall ix. Index ix => Sz ix -> ix -> Bool
isSafeIndex (MArray (PrimState m) r ix e -> Sz ix
forall r ix e s. Mutable r ix e => MArray s r ix e -> Sz ix
msize MArray (PrimState m) r ix e
marr) ix
ix) (m () -> m ()) -> m () -> m ()
forall a b. (a -> b) -> a -> b
$ m e -> m ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (m e -> m ()) -> m e -> m ()
forall a b. (a -> b) -> a -> b
$ MArray (PrimState m) r ix e -> (e -> m e) -> ix -> m e
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
MArray (PrimState m) r ix e -> (e -> m e) -> ix -> m e
unsafeModify MArray (PrimState m) r ix e
marr e -> m e
f ix
ix
{-# INLINE modify_ #-}
modifyM ::
(Mutable r ix e, PrimMonad m, MonadThrow m)
=> MArray (PrimState m) r ix e
-> (e -> m e)
-> ix
-> m e
modifyM :: MArray (PrimState m) r ix e -> (e -> m e) -> ix -> m e
modifyM MArray (PrimState m) r ix e
marr e -> m e
f ix
ix
| Sz ix -> ix -> Bool
forall ix. Index ix => Sz ix -> ix -> Bool
isSafeIndex (MArray (PrimState m) r ix e -> Sz ix
forall r ix e s. Mutable r ix e => MArray s r ix e -> Sz ix
msize MArray (PrimState m) r ix e
marr) ix
ix = MArray (PrimState m) r ix e -> (e -> m e) -> ix -> m e
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
MArray (PrimState m) r ix e -> (e -> m e) -> ix -> m e
unsafeModify MArray (PrimState m) r ix e
marr e -> m e
f ix
ix
| Bool
otherwise = IndexException -> m e
forall (m :: * -> *) e a. (MonadThrow m, Exception e) => e -> m a
throwM (Sz ix -> ix -> IndexException
forall ix. Index ix => Sz ix -> ix -> IndexException
IndexOutOfBoundsException (MArray (PrimState m) r ix e -> Sz ix
forall r ix e s. Mutable r ix e => MArray s r ix e -> Sz ix
msize MArray (PrimState m) r ix e
marr) ix
ix)
{-# INLINE modifyM #-}
modifyM_ ::
(Mutable r ix e, PrimMonad m, MonadThrow m)
=> MArray (PrimState m) r ix e
-> (e -> m e)
-> ix
-> m ()
modifyM_ :: MArray (PrimState m) r ix e -> (e -> m e) -> ix -> m ()
modifyM_ MArray (PrimState m) r ix e
marr e -> m e
f ix
ix = m e -> m ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (m e -> m ()) -> m e -> m ()
forall a b. (a -> b) -> a -> b
$ MArray (PrimState m) r ix e -> (e -> m e) -> ix -> m e
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m, MonadThrow m) =>
MArray (PrimState m) r ix e -> (e -> m e) -> ix -> m e
modifyM MArray (PrimState m) r ix e
marr e -> m e
f ix
ix
{-# INLINE modifyM_ #-}
modify' :: (Mutable r ix e, PrimMonad m) =>
MArray (PrimState m) r ix e -> (e -> e) -> ix -> m ()
modify' :: MArray (PrimState m) r ix e -> (e -> e) -> ix -> m ()
modify' MArray (PrimState m) r ix e
marr e -> e
f ix
ix =
MArray (PrimState m) r ix e -> (e -> m e) -> ix -> m (Maybe e)
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
MArray (PrimState m) r ix e -> (e -> m e) -> ix -> m (Maybe e)
modify MArray (PrimState m) r ix e
marr (e -> m e
forall (f :: * -> *) a. Applicative f => a -> f a
pure (e -> m e) -> (e -> e) -> e -> m e
forall b c a. (b -> c) -> (a -> b) -> a -> c
. e -> e
f) ix
ix m (Maybe e) -> (Maybe e -> m ()) -> m ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
Just e
_ -> () -> m ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
Maybe e
Nothing -> IndexException -> m ()
forall a e. Exception e => e -> a
throw (Sz ix -> ix -> IndexException
forall ix. Index ix => Sz ix -> ix -> IndexException
IndexOutOfBoundsException (MArray (PrimState m) r ix e -> Sz ix
forall r ix e s. Mutable r ix e => MArray s r ix e -> Sz ix
msize MArray (PrimState m) r ix e
marr) ix
ix)
{-# INLINE modify' #-}
{-# DEPRECATED modify' "In favor of more general `modifyM`" #-}
swap :: (Mutable r ix e, PrimMonad m) => MArray (PrimState m) r ix e -> ix -> ix -> m (Maybe (e, e))
swap :: MArray (PrimState m) r ix e -> ix -> ix -> m (Maybe (e, e))
swap MArray (PrimState m) r ix e
marr ix
ix1 ix
ix2 =
let !sz :: Sz ix
sz = MArray (PrimState m) r ix e -> Sz ix
forall r ix e s. Mutable r ix e => MArray s r ix e -> Sz ix
msize MArray (PrimState m) r ix e
marr
in if Sz ix -> ix -> Bool
forall ix. Index ix => Sz ix -> ix -> Bool
isSafeIndex Sz ix
sz ix
ix1 Bool -> Bool -> Bool
&& Sz ix -> ix -> Bool
forall ix. Index ix => Sz ix -> ix -> Bool
isSafeIndex Sz ix
sz ix
ix2
then (e, e) -> Maybe (e, e)
forall a. a -> Maybe a
Just ((e, e) -> Maybe (e, e)) -> m (e, e) -> m (Maybe (e, e))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> MArray (PrimState m) r ix e -> ix -> ix -> m (e, e)
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
MArray (PrimState m) r ix e -> ix -> ix -> m (e, e)
unsafeSwap MArray (PrimState m) r ix e
marr ix
ix1 ix
ix2
else Maybe (e, e) -> m (Maybe (e, e))
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe (e, e)
forall a. Maybe a
Nothing
{-# INLINE swap #-}
swap_ :: (Mutable r ix e, PrimMonad m) => MArray (PrimState m) r ix e -> ix -> ix -> m ()
swap_ :: MArray (PrimState m) r ix e -> ix -> ix -> m ()
swap_ MArray (PrimState m) r ix e
marr ix
ix1 ix
ix2 =
let !sz :: Sz ix
sz = MArray (PrimState m) r ix e -> Sz ix
forall r ix e s. Mutable r ix e => MArray s r ix e -> Sz ix
msize MArray (PrimState m) r ix e
marr
in Bool -> m () -> m ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Sz ix -> ix -> Bool
forall ix. Index ix => Sz ix -> ix -> Bool
isSafeIndex Sz ix
sz ix
ix1 Bool -> Bool -> Bool
&& Sz ix -> ix -> Bool
forall ix. Index ix => Sz ix -> ix -> Bool
isSafeIndex Sz ix
sz ix
ix2) (m () -> m ()) -> m () -> m ()
forall a b. (a -> b) -> a -> b
$ m (e, e) -> m ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (m (e, e) -> m ()) -> m (e, e) -> m ()
forall a b. (a -> b) -> a -> b
$ MArray (PrimState m) r ix e -> ix -> ix -> m (e, e)
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
MArray (PrimState m) r ix e -> ix -> ix -> m (e, e)
unsafeSwap MArray (PrimState m) r ix e
marr ix
ix1 ix
ix2
{-# INLINE swap_ #-}
swapM ::
(Mutable r ix e, PrimMonad m, MonadThrow m)
=> MArray (PrimState m) r ix e
-> ix
-> ix
-> m (e, e)
swapM :: MArray (PrimState m) r ix e -> ix -> ix -> m (e, e)
swapM MArray (PrimState m) r ix e
marr ix
ix1 ix
ix2
| Bool -> Bool
not (Sz ix -> ix -> Bool
forall ix. Index ix => Sz ix -> ix -> Bool
isSafeIndex Sz ix
sz ix
ix1) = IndexException -> m (e, e)
forall (m :: * -> *) e a. (MonadThrow m, Exception e) => e -> m a
throwM (IndexException -> m (e, e)) -> IndexException -> m (e, e)
forall a b. (a -> b) -> a -> b
$ Sz ix -> ix -> IndexException
forall ix. Index ix => Sz ix -> ix -> IndexException
IndexOutOfBoundsException (MArray (PrimState m) r ix e -> Sz ix
forall r ix e s. Mutable r ix e => MArray s r ix e -> Sz ix
msize MArray (PrimState m) r ix e
marr) ix
ix1
| Bool -> Bool
not (Sz ix -> ix -> Bool
forall ix. Index ix => Sz ix -> ix -> Bool
isSafeIndex Sz ix
sz ix
ix2) = IndexException -> m (e, e)
forall (m :: * -> *) e a. (MonadThrow m, Exception e) => e -> m a
throwM (IndexException -> m (e, e)) -> IndexException -> m (e, e)
forall a b. (a -> b) -> a -> b
$ Sz ix -> ix -> IndexException
forall ix. Index ix => Sz ix -> ix -> IndexException
IndexOutOfBoundsException (MArray (PrimState m) r ix e -> Sz ix
forall r ix e s. Mutable r ix e => MArray s r ix e -> Sz ix
msize MArray (PrimState m) r ix e
marr) ix
ix2
| Bool
otherwise = MArray (PrimState m) r ix e -> ix -> ix -> m (e, e)
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
MArray (PrimState m) r ix e -> ix -> ix -> m (e, e)
unsafeSwap MArray (PrimState m) r ix e
marr ix
ix1 ix
ix2
where
!sz :: Sz ix
sz = MArray (PrimState m) r ix e -> Sz ix
forall r ix e s. Mutable r ix e => MArray s r ix e -> Sz ix
msize MArray (PrimState m) r ix e
marr
{-# INLINE swapM #-}
swapM_ ::
(Mutable r ix e, PrimMonad m, MonadThrow m) => MArray (PrimState m) r ix e -> ix -> ix -> m ()
swapM_ :: MArray (PrimState m) r ix e -> ix -> ix -> m ()
swapM_ MArray (PrimState m) r ix e
marr ix
ix1 ix
ix2 = m (e, e) -> m ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (m (e, e) -> m ()) -> m (e, e) -> m ()
forall a b. (a -> b) -> a -> b
$ MArray (PrimState m) r ix e -> ix -> ix -> m (e, e)
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m, MonadThrow m) =>
MArray (PrimState m) r ix e -> ix -> ix -> m (e, e)
swapM MArray (PrimState m) r ix e
marr ix
ix1 ix
ix2
{-# INLINE swapM_ #-}
swap' ::
(Mutable r ix e, PrimMonad m) => MArray (PrimState m) r ix e -> ix -> ix -> m ()
swap' :: MArray (PrimState m) r ix e -> ix -> ix -> m ()
swap' MArray (PrimState m) r ix e
marr ix
ix1 ix
ix2 =
MArray (PrimState m) r ix e -> ix -> ix -> m (Maybe (e, e))
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
MArray (PrimState m) r ix e -> ix -> ix -> m (Maybe (e, e))
swap MArray (PrimState m) r ix e
marr ix
ix1 ix
ix2 m (Maybe (e, e)) -> (Maybe (e, e) -> m ()) -> m ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
Just (e, e)
_ -> () -> m ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
Maybe (e, e)
Nothing ->
if Sz ix -> ix -> Bool
forall ix. Index ix => Sz ix -> ix -> Bool
isSafeIndex (MArray (PrimState m) r ix e -> Sz ix
forall r ix e s. Mutable r ix e => MArray s r ix e -> Sz ix
msize MArray (PrimState m) r ix e
marr) ix
ix1
then IndexException -> m ()
forall a e. Exception e => e -> a
throw (IndexException -> m ()) -> IndexException -> m ()
forall a b. (a -> b) -> a -> b
$ Sz ix -> ix -> IndexException
forall ix. Index ix => Sz ix -> ix -> IndexException
IndexOutOfBoundsException (MArray (PrimState m) r ix e -> Sz ix
forall r ix e s. Mutable r ix e => MArray s r ix e -> Sz ix
msize MArray (PrimState m) r ix e
marr) ix
ix2
else IndexException -> m ()
forall a e. Exception e => e -> a
throw (IndexException -> m ()) -> IndexException -> m ()
forall a b. (a -> b) -> a -> b
$ Sz ix -> ix -> IndexException
forall ix. Index ix => Sz ix -> ix -> IndexException
IndexOutOfBoundsException (MArray (PrimState m) r ix e -> Sz ix
forall r ix e s. Mutable r ix e => MArray s r ix e -> Sz ix
msize MArray (PrimState m) r ix e
marr) ix
ix1
{-# INLINE swap' #-}
{-# DEPRECATED swap' "In favor of more general `swapM`" #-}