module Data.Massiv.Array.Mutable
( Mutable
, MArray
, msize
, new
, thaw
, freeze
, read
, read'
, write
, write'
, modify
, modify'
, swap
, swap'
) where
import Prelude hiding (read)
import Control.Monad (unless)
import Control.Monad.Primitive (PrimMonad (..))
import Data.Massiv.Array.Manifest.Internal
import Data.Massiv.Array.Unsafe
import Data.Massiv.Core.Common
new :: (Mutable r ix e, PrimMonad m) => ix -> m (MArray (PrimState m) r ix e)
new sz = unsafeNewZero (liftIndex (max 0) sz)
thaw :: (Mutable r ix e, PrimMonad m) => Array r ix e -> m (MArray (PrimState m) r ix e)
thaw = unsafeThaw . clone
freeze :: (Mutable r ix e, PrimMonad m) => Comp -> MArray (PrimState m) r ix e -> m (Array r ix e)
freeze comp marr = unsafeFreeze comp marr >>= (return . clone)
read :: (Mutable r ix e, PrimMonad m) =>
MArray (PrimState m) r ix e -> ix -> m (Maybe e)
read marr ix =
if isSafeIndex (msize marr) ix
then Just <$> unsafeRead marr ix
else return Nothing
read' :: (Mutable r ix e, PrimMonad m) =>
MArray (PrimState m) r ix e -> ix -> m e
read' marr ix = do
mval <- read marr ix
case mval of
Just e -> return e
Nothing -> errorIx "Data.Massiv.Array.Mutable.read'" (msize marr) ix
write :: (Mutable r ix e, PrimMonad m) =>
MArray (PrimState m) r ix e -> ix -> e -> m Bool
write marr ix e =
if isSafeIndex (msize marr) ix
then unsafeWrite marr ix e >> return True
else return False
write' :: (Mutable r ix e, PrimMonad m) =>
MArray (PrimState m) r ix e -> ix -> e -> m ()
write' marr ix e =
write marr ix e >>= (`unless` errorIx "Data.Massiv.Array.Mutable.write'" (msize marr) ix)
modify :: (Mutable r ix e, PrimMonad m) =>
MArray (PrimState m) r ix e -> (e -> e) -> ix -> m Bool
modify marr f ix =
if isSafeIndex (msize marr) ix
then do
val <- unsafeRead marr ix
unsafeWrite marr ix $ f val
return True
else return False
modify' :: (Mutable r ix e, PrimMonad m) =>
MArray (PrimState m) r ix e -> (e -> e) -> ix -> m ()
modify' marr f ix =
modify marr f ix >>= (`unless` errorIx "Data.Massiv.Array.Mutable.modify'" (msize marr) ix)
swap :: (Mutable r ix e, PrimMonad m) =>
MArray (PrimState m) r ix e -> ix -> ix -> m Bool
swap marr ix1 ix2 = do
let sz = msize marr
if isSafeIndex sz ix1 && isSafeIndex sz ix2
then do
val1 <- unsafeRead marr ix1
val2 <- unsafeRead marr ix2
unsafeWrite marr ix1 val2
unsafeWrite marr ix2 val1
return True
else return False
swap' :: (Mutable r ix e, PrimMonad m) =>
MArray (PrimState m) r ix e -> ix -> ix -> m ()
swap' marr ix1 ix2 = do
success <- swap marr ix1 ix2
unless success $
errorIx "Data.Massiv.Array.Mutable.swap'" (msize marr) $
if isSafeIndex (msize marr) ix1
then ix2
else ix1