{-# LANGUAGE ExplicitForAll #-}
module Data.Massiv.Array.Mutable.Internal (
unsafeCreateArray,
unsafeCreateArray_,
unsafeCreateArrayS,
) where
import Control.Scheduler
import Data.Massiv.Core.Common
unsafeCreateArrayS
:: forall r ix e a m
. (Manifest r e, Index ix, PrimMonad m)
=> Sz ix
-> (MArray (PrimState m) r ix e -> m a)
-> m (a, Array r ix e)
unsafeCreateArrayS :: forall r ix e a (m :: * -> *).
(Manifest r e, Index ix, 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
action = do
marr <- Sz ix -> m (MArray (PrimState m) r ix e)
forall r e ix (m :: * -> *).
(Manifest r e, Index ix, PrimMonad m) =>
Sz ix -> m (MArray (PrimState m) r ix e)
forall ix (m :: * -> *).
(Index ix, PrimMonad m) =>
Sz ix -> m (MArray (PrimState m) r ix e)
unsafeNew Sz ix
sz
a <- action marr
arr <- unsafeFreeze Seq marr
return (a, arr)
{-# INLINE unsafeCreateArrayS #-}
unsafeCreateArray
:: forall r ix e a m b
. (Manifest r e, Index ix, MonadUnliftIO m)
=> Comp
-> Sz ix
-> (Scheduler RealWorld a -> MArray RealWorld r ix e -> m b)
-> m ([a], Array r ix e)
unsafeCreateArray :: forall r ix e a (m :: * -> *) b.
(Manifest r e, Index ix, MonadUnliftIO m) =>
Comp
-> Sz ix
-> (Scheduler RealWorld a -> MArray RealWorld r ix e -> m b)
-> m ([a], Array r ix e)
unsafeCreateArray Comp
comp Sz ix
sz Scheduler RealWorld a -> MArray RealWorld r ix e -> m b
action = do
marr <- IO (MArray RealWorld r ix e) -> m (MArray RealWorld r ix e)
forall a. IO a -> m a
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
$ Sz ix -> IO (MArray (PrimState IO) r ix e)
forall r e ix (m :: * -> *).
(Manifest r e, Index ix, PrimMonad m) =>
Sz ix -> m (MArray (PrimState m) r ix e)
forall ix (m :: * -> *).
(Index ix, PrimMonad m) =>
Sz ix -> m (MArray (PrimState m) r ix e)
unsafeNew Sz ix
sz
a <- withScheduler comp (`action` marr)
arr <- liftIO $ unsafeFreeze comp marr
return (a, arr)
{-# INLINE unsafeCreateArray #-}
unsafeCreateArray_
:: forall r ix e a m b
. (Manifest r e, Index ix, MonadUnliftIO m)
=> Comp
-> Sz ix
-> (Scheduler RealWorld a -> MArray RealWorld r ix e -> m b)
-> m (Array r ix e)
unsafeCreateArray_ :: forall r ix e a (m :: * -> *) b.
(Manifest r e, Index ix, MonadUnliftIO m) =>
Comp
-> Sz ix
-> (Scheduler RealWorld a -> MArray RealWorld r ix e -> m b)
-> m (Array r ix e)
unsafeCreateArray_ Comp
comp Sz ix
sz Scheduler RealWorld a -> MArray RealWorld r ix e -> m b
action = do
marr <- IO (MArray RealWorld r ix e) -> m (MArray RealWorld r ix e)
forall a. IO a -> m a
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
$ Sz ix -> IO (MArray (PrimState IO) r ix e)
forall r e ix (m :: * -> *).
(Manifest r e, Index ix, PrimMonad m) =>
Sz ix -> m (MArray (PrimState m) r ix e)
forall ix (m :: * -> *).
(Index ix, PrimMonad m) =>
Sz ix -> m (MArray (PrimState m) r ix e)
unsafeNew Sz ix
sz
withScheduler_ comp (`action` marr)
arr <- liftIO $ unsafeFreeze comp marr
return arr
{-# INLINE unsafeCreateArray_ #-}