{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE CPP #-}
{-# LANGUAGE DefaultSignatures #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UndecidableInstances #-}
module Data.Massiv.Core.Common
( Array
, Vector
, MVector
, Matrix
, MMatrix
, Elt
, Steps(..)
, Stream(..)
, Construct(..)
, Source(..)
, Load(..)
, StrideLoad(..)
, Resize(..)
, Extract(..)
, Slice(..)
, OuterSlice(..)
, InnerSlice(..)
, Manifest(..)
, Mutable(..)
, Comp(..)
, Scheduler
, numWorkers
, scheduleWork
, scheduleWork_
, withMassivScheduler_
, WorkerStates
, unsafeRead
, unsafeWrite
, unsafeModify
, unsafeLinearModify
, unsafeSwap
, unsafeLinearSwap
, unsafeDefaultLinearShrink
, Ragged(..)
, Nested(..)
, NestedStruct
, empty
, singleton
, elemsCount
, isNotEmpty
, Sz(SafeSz)
, Size(..)
, (!?)
, index
, indexM
, (!)
, index'
, (??)
, defaultIndex
, borderIndex
, evaluateM
, evaluate'
, module Data.Massiv.Core.Index
, imapM_
, Semigroup((<>))
, MonadThrow(..)
, throw
, IndexException(..)
, SizeException(..)
, ShapeException(..)
, module Data.Massiv.Core.Exception
, Proxy(..)
, Id(..)
, MonadUnliftIO
, MonadIO(liftIO)
, PrimMonad(PrimState)
) where
#if !MIN_VERSION_base(4,11,0)
import Data.Semigroup
#endif
import Control.Exception (throw)
import Control.Monad.Catch (MonadThrow(..))
import Control.Monad.IO.Unlift (MonadIO(liftIO), MonadUnliftIO)
import Control.Monad.Primitive
import Control.Scheduler (Comp(..), Scheduler, WorkerStates, numWorkers,
scheduleWork, scheduleWork_, withScheduler_, trivialScheduler_)
import Control.Scheduler.Global
import Data.Massiv.Core.Exception
import Data.Massiv.Core.Index
import Data.Massiv.Core.Index.Internal (Sz(SafeSz))
import Data.Typeable
import Data.Vector.Fusion.Bundle.Size
import qualified Data.Vector.Fusion.Stream.Monadic as S (Stream)
import Data.Vector.Fusion.Util
#include "massiv.h"
data family Array r ix e :: *
type Vector r e = Array r Ix1 e
type MVector s r e = MArray s r Ix1 e
type Matrix r e = Array r Ix2 e
type MMatrix s r e = MArray s r Ix2 e
type family Elt r ix e :: * where
Elt r Ix1 e = e
Elt r ix e = Array (R r) (Lower ix) e
type family NestedStruct r ix e :: *
class Load r ix e => Stream r ix e where
toStream :: Array r ix e -> Steps Id e
toStreamIx :: Array r ix e -> Steps Id (ix, e)
data Steps m e = Steps
{ Steps m e -> Stream m e
stepsStream :: S.Stream m e
, Steps m e -> Size
stepsSize :: Size
}
class (Typeable r, Index ix) => Construct r ix e where
{-# MINIMAL setComp,(makeArray|makeArrayLinear) #-}
setComp :: Comp -> Array r ix e -> Array r ix e
makeArray ::
Comp
-> Sz ix
-> (ix -> e)
-> Array r ix e
makeArray Comp
comp Sz ix
sz ix -> e
f = Comp -> Sz ix -> (Int -> e) -> Array r ix e
forall r ix e.
Construct r ix e =>
Comp -> Sz ix -> (Int -> e) -> Array r ix e
makeArrayLinear Comp
comp Sz ix
sz (ix -> e
f (ix -> e) -> (Int -> ix) -> Int -> 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 makeArray #-}
makeArrayLinear :: Comp -> Sz ix -> (Int -> e) -> Array r ix e
makeArrayLinear Comp
comp Sz ix
sz Int -> e
f = Comp -> Sz ix -> (ix -> e) -> Array r ix e
forall r ix e.
Construct r ix e =>
Comp -> Sz ix -> (ix -> e) -> Array r ix e
makeArray Comp
comp Sz ix
sz (Int -> e
f (Int -> e) -> (ix -> Int) -> ix -> e
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Sz ix -> ix -> Int
forall ix. Index ix => Sz ix -> ix -> Int
toLinearIndex Sz ix
sz)
{-# INLINE makeArrayLinear #-}
class Index ix => Resize r ix where
unsafeResize :: Index ix' => Sz ix' -> Array r ix e -> Array r ix' e
class Load r ix e => r ix e where
:: ix -> Sz ix -> Array r ix e -> Array (R r) ix e
class (Resize r ix, Load r ix e) => Source r ix e where
{-# MINIMAL (unsafeIndex|unsafeLinearIndex), unsafeLinearSlice #-}
unsafeIndex :: Array r ix e -> ix -> e
unsafeIndex =
INDEX_CHECK("(Source r ix e).unsafeIndex",
size, \ !arr -> unsafeLinearIndex arr . toLinearIndex (size arr))
{-# INLINE unsafeIndex #-}
unsafeLinearIndex :: Array r ix e -> Int -> e
unsafeLinearIndex !Array r ix e
arr = Array r ix e -> ix -> e
forall r ix e. Source r ix e => Array r ix e -> ix -> e
unsafeIndex Array r ix e
arr (ix -> e) -> (Int -> ix) -> Int -> e
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Sz ix -> Int -> ix
forall ix. Index ix => Sz ix -> Int -> ix
fromLinearIndex (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)
{-# INLINE unsafeLinearIndex #-}
unsafeLinearSlice :: Ix1 -> Sz1 -> Array r ix e -> Array r Ix1 e
class (Typeable r, Index ix) => Load r ix e where
type family R r :: *
type instance R r = r
getComp :: Array r ix e -> Comp
size :: Array r ix e -> Sz ix
loadArrayM
:: Monad m =>
Scheduler m ()
-> Array r ix e
-> (Int -> e -> m ())
-> m ()
defaultElement :: Array r ix e -> Maybe e
defaultElement Array r ix e
_ = Maybe e
forall a. Maybe a
Nothing
{-# INLINE defaultElement #-}
maxSize :: Array r ix e -> Maybe (Sz ix)
maxSize = Sz ix -> Maybe (Sz ix)
forall a. a -> Maybe a
Just (Sz ix -> Maybe (Sz ix))
-> (Array r ix e -> Sz ix) -> Array r ix e -> Maybe (Sz ix)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Array r ix e -> Sz ix
forall r ix e. Load r ix e => Array r ix e -> Sz ix
size
{-# INLINE maxSize #-}
isEmpty :: Array r ix e -> Bool
isEmpty !Array r ix e
arr = Int
0 Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Array r ix e -> Int
forall r ix e. Load r ix e => Array r ix e -> Int
elemsCount Array r ix e
arr
{-# INLINE isEmpty #-}
unsafeLoadIntoS ::
(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 =
MArray (PrimState m) r' ix e
marr MArray (PrimState m) r' ix e
-> m () -> m (MArray (PrimState m) r' ix e)
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Scheduler m () -> Array r ix e -> (Int -> e -> m ()) -> m ()
forall r ix e (m :: * -> *).
(Load r ix e, Monad m) =>
Scheduler m () -> Array r ix e -> (Int -> e -> m ()) -> m ()
loadArrayM Scheduler m ()
forall (f :: * -> *). Applicative f => Scheduler f ()
trivialScheduler_ Array r ix e
arr (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)
{-# INLINE unsafeLoadIntoS #-}
unsafeLoadInto ::
(Mutable r' ix e, MonadIO m)
=> MArray RealWorld r' ix e
-> Array r ix e
-> m (MArray RealWorld r' ix e)
unsafeLoadInto MArray RealWorld r' ix e
marr Array r ix e
arr = do
IO () -> m ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> m ()) -> IO () -> m ()
forall a b. (a -> b) -> a -> b
$ 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)
MArray RealWorld r' ix e -> m (MArray RealWorld r' ix e)
forall (f :: * -> *) a. Applicative f => a -> f a
pure MArray RealWorld r' ix e
marr
{-# INLINE unsafeLoadInto #-}
withMassivScheduler_ :: Comp -> (Scheduler IO () -> IO ()) -> IO ()
withMassivScheduler_ :: Comp -> (Scheduler IO () -> IO ()) -> IO ()
withMassivScheduler_ Comp
comp Scheduler IO () -> IO ()
f =
case Comp
comp of
Comp
Par -> GlobalScheduler IO -> (Scheduler IO () -> IO ()) -> IO ()
forall (m :: * -> *) a.
MonadUnliftIO m =>
GlobalScheduler m -> (Scheduler m () -> m a) -> m ()
withGlobalScheduler_ GlobalScheduler IO
globalScheduler Scheduler IO () -> IO ()
f
Comp
Seq -> Scheduler IO () -> IO ()
f Scheduler IO ()
forall (f :: * -> *). Applicative f => Scheduler f ()
trivialScheduler_
Comp
_ -> Comp -> (Scheduler IO () -> IO ()) -> IO ()
forall (m :: * -> *) a b.
MonadUnliftIO m =>
Comp -> (Scheduler m a -> m b) -> m ()
withScheduler_ Comp
comp Scheduler IO () -> IO ()
f
class Load r ix e => StrideLoad r ix e where
loadArrayWithStrideM
:: Monad m =>
Scheduler m ()
-> Stride ix
-> Sz ix
-> Array r ix e
-> (Int -> e -> m ())
-> m ()
default loadArrayWithStrideM
:: (Source r ix e, Monad m) =>
Scheduler m ()
-> Stride ix
-> Sz ix
-> Array r ix e
-> (Int -> e -> m ())
-> m ()
loadArrayWithStrideM Scheduler m ()
scheduler Stride ix
stride Sz ix
resultSize Array r ix e
arr =
Scheduler m () -> Int -> (Int -> e) -> (Int -> e -> m ()) -> m ()
forall (m :: * -> *) b.
Monad m =>
Scheduler m () -> Int -> (Int -> b) -> (Int -> b -> m ()) -> m ()
splitLinearlyWith_ Scheduler m ()
scheduler (Sz ix -> Int
forall ix. Index ix => Sz ix -> Int
totalElem Sz ix
resultSize) Int -> e
unsafeLinearWriteWithStride
where
!strideIx :: ix
strideIx = Stride ix -> ix
forall ix. Stride ix -> ix
unStride Stride ix
stride
unsafeLinearWriteWithStride :: Int -> e
unsafeLinearWriteWithStride =
Array r ix e -> ix -> e
forall r ix e. Source r ix e => Array r ix e -> ix -> e
unsafeIndex Array r ix e
arr (ix -> e) -> (Int -> ix) -> Int -> e
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Int -> Int -> Int) -> ix -> ix -> ix
forall ix. Index ix => (Int -> Int -> Int) -> ix -> ix -> ix
liftIndex2 Int -> Int -> Int
forall a. Num a => a -> a -> a
(*) ix
strideIx (ix -> ix) -> (Int -> ix) -> Int -> ix
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
resultSize
{-# INLINE unsafeLinearWriteWithStride #-}
{-# INLINE loadArrayWithStrideM #-}
class Load r ix e => OuterSlice r ix e where
unsafeOuterSlice :: Array r ix e -> Int -> Elt r ix e
class Load r ix e => InnerSlice r ix e where
unsafeInnerSlice :: Array r ix e -> (Sz (Lower ix), Sz Int) -> Int -> Elt r ix e
class Load r ix e => Slice r ix e where
unsafeSlice :: MonadThrow m => Array r ix e -> ix -> Sz ix -> Dim -> m (Elt r ix e)
class Source r ix e => Manifest r ix e where
unsafeLinearIndexM :: Array r ix e -> Int -> e
class (Construct r ix e, Manifest r ix e) => Mutable r ix e where
data MArray s r ix e :: *
msize :: MArray s r ix e -> Sz ix
unsafeThaw :: PrimMonad m => Array r ix e -> m (MArray (PrimState m) r ix e)
unsafeFreeze :: PrimMonad m => Comp -> MArray (PrimState m) r ix e -> m (Array r ix e)
unsafeNew :: PrimMonad m => Sz ix -> m (MArray (PrimState m) r ix e)
unsafeLinearRead :: PrimMonad m => MArray (PrimState m) r ix e -> Int -> m e
unsafeLinearWrite :: PrimMonad m => MArray (PrimState m) r ix e -> Int -> e -> m ()
initialize :: PrimMonad m => MArray (PrimState m) r ix e -> m ()
initializeNew :: PrimMonad m => Maybe e -> Sz ix -> m (MArray (PrimState m) r ix e)
initializeNew Maybe e
mdef Sz ix
sz = 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
case Maybe e
mdef of
Just e
val -> MArray (PrimState m) r ix e -> Int -> Sz1 -> e -> m ()
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
MArray (PrimState m) r ix e -> Int -> Sz1 -> e -> m ()
unsafeLinearSet MArray (PrimState m) r ix e
marr Int
0 (Int -> Sz1
forall ix. ix -> Sz ix
SafeSz (Sz ix -> Int
forall ix. Index ix => Sz ix -> Int
totalElem Sz ix
sz)) e
val
Maybe e
Nothing -> MArray (PrimState m) r ix e -> m ()
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
MArray (PrimState m) r ix e -> m ()
initialize 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 initializeNew #-}
unsafeLinearSet :: PrimMonad m =>
MArray (PrimState m) r ix e -> Ix1 -> Sz1 -> e -> m ()
unsafeLinearSet MArray (PrimState m) r ix e
marr Int
offset Sz1
len e
e =
Int -> (Int -> Bool) -> (Int -> Int) -> (Int -> m ()) -> m ()
forall (m :: * -> *) a.
Monad m =>
Int -> (Int -> Bool) -> (Int -> Int) -> (Int -> m a) -> m ()
loopM_ Int
offset (Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< (Int
offset Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Sz1 -> Int
forall ix. Sz ix -> ix
unSz Sz1
len)) (Int -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1) (\Int
i -> 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)
{-# INLINE unsafeLinearSet #-}
unsafeLinearCopy :: (Mutable r ix' e, PrimMonad m) =>
MArray (PrimState m) r ix' e
-> Ix1
-> MArray (PrimState m) r ix e
-> Ix1
-> Sz1
-> m ()
unsafeLinearCopy MArray (PrimState m) r ix' e
marrFrom Int
iFrom MArray (PrimState m) r ix e
marrTo Int
iTo (SafeSz Int
k) = do
let delta :: Int
delta = Int
iTo Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
iFrom
Int -> (Int -> Bool) -> (Int -> Int) -> (Int -> m ()) -> m ()
forall (m :: * -> *) a.
Monad m =>
Int -> (Int -> Bool) -> (Int -> Int) -> (Int -> m a) -> m ()
loopM_ Int
iFrom (Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
k Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
iFrom) (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 ->
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
marrFrom 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
marrTo (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
delta)
{-# INLINE unsafeLinearCopy #-}
unsafeArrayLinearCopy :: (Mutable r ix' e, PrimMonad m) =>
Array r ix' e
-> Ix1
-> MArray (PrimState m) r ix e
-> Ix1
-> Sz1
-> m ()
unsafeArrayLinearCopy Array r ix' e
arrFrom Int
iFrom MArray (PrimState m) r ix e
marrTo Int
iTo (SafeSz Int
k) = do
let delta :: Int
delta = Int
iTo Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
iFrom
Int -> (Int -> Bool) -> (Int -> Int) -> (Int -> m ()) -> m ()
forall (m :: * -> *) a.
Monad m =>
Int -> (Int -> Bool) -> (Int -> Int) -> (Int -> m a) -> m ()
loopM_ Int
iFrom (Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
k Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
iFrom) (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 ->
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
marrTo (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
delta) (Array r ix' e -> Int -> e
forall r ix e. Source r ix e => Array r ix e -> Int -> e
unsafeLinearIndex Array r ix' e
arrFrom Int
i)
{-# INLINE unsafeArrayLinearCopy #-}
unsafeLinearShrink :: PrimMonad m =>
MArray (PrimState m) r ix e -> Sz ix -> m (MArray (PrimState m) r ix e)
unsafeLinearShrink = MArray (PrimState m) r ix e
-> Sz ix -> m (MArray (PrimState m) r ix e)
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
MArray (PrimState m) r ix e
-> Sz ix -> m (MArray (PrimState m) r ix e)
unsafeDefaultLinearShrink
{-# INLINE unsafeLinearShrink #-}
unsafeLinearGrow :: PrimMonad m =>
MArray (PrimState m) r ix e -> Sz ix -> m (MArray (PrimState m) r ix e)
unsafeLinearGrow MArray (PrimState m) r ix e
marr Sz ix
sz = 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
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
marr Int
0 MArray (PrimState m) r ix e
marr' Int
0 (Sz1 -> m ()) -> Sz1 -> m ()
forall a b. (a -> b) -> a -> b
$ Int -> Sz1
forall ix. ix -> Sz ix
SafeSz (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))
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
marr'
{-# INLINE unsafeLinearGrow #-}
unsafeDefaultLinearShrink ::
(Mutable r ix e, PrimMonad m)
=> MArray (PrimState m) r ix e
-> Sz ix
-> m (MArray (PrimState m) r ix e)
unsafeDefaultLinearShrink :: MArray (PrimState m) r ix e
-> Sz ix -> m (MArray (PrimState m) r ix e)
unsafeDefaultLinearShrink MArray (PrimState m) r ix e
marr Sz ix
sz = 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
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
marr Int
0 MArray (PrimState m) r ix e
marr' Int
0 (Sz1 -> m ()) -> Sz1 -> m ()
forall a b. (a -> b) -> a -> b
$ Int -> Sz1
forall ix. ix -> Sz ix
SafeSz (Sz ix -> Int
forall ix. Index ix => Sz ix -> Int
totalElem Sz ix
sz)
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
marr'
{-# INLINE unsafeDefaultLinearShrink #-}
unsafeRead :: (Mutable r ix e, PrimMonad m) =>
MArray (PrimState m) r ix e -> ix -> m e
unsafeRead :: MArray (PrimState m) r ix e -> ix -> m e
unsafeRead !MArray (PrimState m) r ix e
marr !ix
ix = 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 (Sz ix -> ix -> Int
forall ix. Index ix => Sz ix -> ix -> Int
toLinearIndex (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 unsafeRead #-}
unsafeWrite :: (Mutable r ix e, PrimMonad m) =>
MArray (PrimState m) r ix e -> ix -> e -> m ()
unsafeWrite :: MArray (PrimState m) r ix e -> ix -> e -> m ()
unsafeWrite !MArray (PrimState m) r ix e
marr !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 (Sz ix -> ix -> Int
forall ix. Index ix => Sz ix -> ix -> Int
toLinearIndex (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 unsafeWrite #-}
unsafeLinearModify :: (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 -> (e -> m e) -> Int -> m e
unsafeLinearModify !MArray (PrimState m) r ix e
marr e -> m e
f !Int
i = do
e
v <- 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
e
v' <- e -> m e
f e
v
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
v'
e -> m e
forall (f :: * -> *) a. Applicative f => a -> f a
pure e
v
{-# INLINE unsafeLinearModify #-}
unsafeModify :: (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 -> (e -> m e) -> ix -> m e
unsafeModify MArray (PrimState m) r ix e
marr e -> m e
f ix
ix = 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 (Sz ix -> ix -> Int
forall ix. Index ix => Sz ix -> ix -> Int
toLinearIndex (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 unsafeModify #-}
unsafeSwap :: (Mutable r ix e, PrimMonad m) =>
MArray (PrimState m) r ix e -> ix -> ix -> m (e, e)
unsafeSwap :: MArray (PrimState m) r ix e -> ix -> ix -> m (e, e)
unsafeSwap !MArray (PrimState m) r ix e
marr !ix
ix1 !ix
ix2 = MArray (PrimState m) r ix e -> Int -> Int -> m (e, e)
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
MArray (PrimState m) r ix e -> Int -> Int -> m (e, e)
unsafeLinearSwap MArray (PrimState m) r ix e
marr (Sz ix -> ix -> Int
forall ix. Index ix => Sz ix -> ix -> Int
toLinearIndex Sz ix
sz ix
ix1) (Sz ix -> ix -> Int
forall ix. Index ix => Sz ix -> ix -> Int
toLinearIndex Sz ix
sz 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 unsafeSwap #-}
unsafeLinearSwap :: (Mutable r ix e, PrimMonad m) =>
MArray (PrimState m) r ix e -> Int -> Int -> m (e, e)
unsafeLinearSwap :: MArray (PrimState m) r ix e -> Int -> Int -> m (e, e)
unsafeLinearSwap !MArray (PrimState m) r ix e
marr !Int
i1 !Int
i2 = do
e
val1 <- 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
i1
e
val2 <- 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
i2
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
i1 e
val2
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
i2 e
val1
(e, e) -> m (e, e)
forall (m :: * -> *) a. Monad m => a -> m a
return (e
val1, e
val2)
{-# INLINE unsafeLinearSwap #-}
class Nested r ix e where
fromNested :: NestedStruct r ix e -> Array r ix e
toNested :: Array r ix e -> NestedStruct r ix e
class Construct r ix e => Ragged r ix e where
emptyR :: Comp -> Array r ix e
isNull :: Array r ix e -> Bool
consR :: Elt r ix e -> Array r ix e -> Array r ix e
unconsR :: Array r ix e -> Maybe (Elt r ix e, Array r ix e)
generateRaggedM :: Monad m => Comp -> Sz ix -> (ix -> m e) -> m (Array r ix e)
edgeSize :: Array r ix e -> Sz ix
flattenRagged :: Array r ix e -> Array r Ix1 e
loadRagged ::
Monad m => (m () -> m ()) -> (Int -> e -> m a) -> Int -> Int -> Sz ix -> Array r ix e -> m ()
raggedFormat :: (e -> String) -> String -> Array r ix e -> String
empty ::
forall r ix e. Construct r ix e
=> Array r ix e
empty :: Array r ix e
empty = Comp -> Sz ix -> (ix -> e) -> Array r ix e
forall r ix e.
Construct r ix e =>
Comp -> Sz ix -> (ix -> e) -> Array r ix e
makeArray Comp
Seq Sz ix
forall ix. Index ix => Sz ix
zeroSz (e -> ix -> e
forall a b. a -> b -> a
const (Uninitialized -> e
forall e a. Exception e => e -> a
throwImpossible Uninitialized
Uninitialized))
{-# INLINE empty #-}
singleton ::
forall r ix e. Construct r ix e
=> e
-> Array r ix e
singleton :: e -> Array r ix e
singleton = Comp -> Sz ix -> (ix -> e) -> Array r ix e
forall r ix e.
Construct r ix e =>
Comp -> Sz ix -> (ix -> e) -> Array r ix e
makeArray Comp
Seq Sz ix
forall ix. Index ix => Sz ix
oneSz ((ix -> e) -> Array r ix e) -> (e -> ix -> e) -> e -> Array r ix e
forall b c a. (b -> c) -> (a -> b) -> a -> c
. e -> ix -> e
forall a b. a -> b -> a
const
{-# INLINE singleton #-}
infixl 4 !, !?, ??
(!) :: Manifest r ix e => Array r ix e -> ix -> e
(!) = Array r ix e -> ix -> e
forall r ix e. Manifest r ix e => Array r ix e -> ix -> e
index'
{-# INLINE (!) #-}
(!?) :: (Manifest r ix e, MonadThrow m) => Array r ix e -> ix -> m e
!? :: Array r ix e -> ix -> m e
(!?) = Array r ix e -> ix -> m e
forall r ix e (m :: * -> *).
(Manifest r ix e, MonadThrow m) =>
Array r ix e -> ix -> m e
indexM
{-# INLINE (!?) #-}
(??) :: (Manifest r ix e, MonadThrow m) => m (Array r ix e) -> ix -> m e
?? :: m (Array r ix e) -> ix -> m e
(??) m (Array r ix e)
marr ix
ix = m (Array r ix e)
marr m (Array r ix e) -> (Array r ix e -> m e) -> m e
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (Array r ix e -> ix -> m e
forall r ix e (m :: * -> *).
(Manifest r ix e, MonadThrow m) =>
Array r ix e -> ix -> m e
!? ix
ix)
{-# INLINE (??) #-}
index :: Manifest r ix e => Array r ix e -> ix -> Maybe e
index :: Array r ix e -> ix -> Maybe e
index = Array r ix e -> ix -> Maybe e
forall r ix e (m :: * -> *).
(Manifest r ix e, MonadThrow m) =>
Array r ix e -> ix -> m e
indexM
{-# INLINE index #-}
indexM :: (Manifest r ix e, MonadThrow m) => Array r ix e -> ix -> m e
indexM :: Array r ix e -> ix -> m e
indexM = Array r ix e -> ix -> m e
forall r ix e (m :: * -> *).
(Source r ix e, MonadThrow m) =>
Array r ix e -> ix -> m e
evaluateM
{-# INLINE indexM #-}
defaultIndex :: Manifest r ix e => e -> Array r ix e -> ix -> e
defaultIndex :: e -> Array r ix e -> ix -> e
defaultIndex e
defVal = Border e -> Array r ix e -> ix -> e
forall r ix e.
Manifest r ix e =>
Border e -> Array r ix e -> ix -> e
borderIndex (e -> Border e
forall e. e -> Border e
Fill e
defVal)
{-# INLINE defaultIndex #-}
borderIndex :: Manifest r ix e => Border e -> Array r ix e -> ix -> e
borderIndex :: Border e -> Array r ix e -> ix -> e
borderIndex Border e
border Array r ix e
arr = Border e -> Sz ix -> (ix -> e) -> ix -> e
forall ix e. Index ix => Border e -> Sz ix -> (ix -> e) -> ix -> e
handleBorderIndex Border e
border (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 -> ix -> e
forall r ix e. Source r ix e => Array r ix e -> ix -> e
unsafeIndex Array r ix e
arr)
{-# INLINE borderIndex #-}
index' :: Manifest r ix e => Array r ix e -> ix -> e
index' :: Array r ix e -> ix -> e
index' = Array r ix e -> ix -> e
forall r ix e. Source r ix e => Array r ix e -> ix -> e
evaluate'
{-# INLINE index' #-}
evaluateM :: (Source r ix e, MonadThrow m) => Array r ix e -> ix -> m e
evaluateM :: Array r ix e -> ix -> m e
evaluateM Array r ix e
arr ix
ix =
Border (m e) -> Sz ix -> (ix -> m e) -> ix -> m e
forall ix e. Index ix => Border e -> Sz ix -> (ix -> e) -> ix -> e
handleBorderIndex
(m e -> Border (m e)
forall e. e -> Border e
Fill (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 (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) ix
ix)))
(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)
(e -> m e
forall (f :: * -> *) a. Applicative f => a -> f a
pure (e -> m e) -> (ix -> e) -> ix -> m e
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Array r ix e -> ix -> e
forall r ix e. Source r ix e => Array r ix e -> ix -> e
unsafeIndex Array r ix e
arr)
ix
ix
{-# INLINE evaluateM #-}
evaluate' :: Source r ix e => Array r ix e -> ix -> e
evaluate' :: Array r ix e -> ix -> e
evaluate' Array r ix e
arr ix
ix =
Border e -> Sz ix -> (ix -> e) -> ix -> e
forall ix e. Index ix => Border e -> Sz ix -> (ix -> e) -> ix -> e
handleBorderIndex
(e -> Border e
forall e. e -> Border e
Fill (IndexException -> e
forall a e. Exception e => e -> a
throw (Sz ix -> ix -> IndexException
forall ix. Index ix => Sz ix -> ix -> IndexException
IndexOutOfBoundsException (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) ix
ix)))
(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 -> ix -> e
forall r ix e. Source r ix e => Array r ix e -> ix -> e
unsafeIndex Array r ix e
arr)
ix
ix
{-# INLINE evaluate' #-}
imapM_ :: (Source r ix a, Monad m) => (ix -> a -> m b) -> Array r ix a -> m ()
imapM_ :: (ix -> a -> m b) -> Array r ix a -> m ()
imapM_ ix -> a -> m b
f !Array r ix a
arr =
ix -> ix -> ix -> (Int -> Int -> Bool) -> (ix -> m b) -> m ()
forall ix (m :: * -> *) a.
(Index ix, Monad m) =>
ix -> ix -> ix -> (Int -> Int -> Bool) -> (ix -> m a) -> m ()
iterM_ ix
forall ix. Index ix => ix
zeroIndex (Sz ix -> ix
forall ix. Sz ix -> ix
unSz (Array r ix a -> Sz ix
forall r ix e. Load r ix e => Array r ix e -> Sz ix
size Array r ix a
arr)) (Int -> ix
forall ix. Index ix => Int -> ix
pureIndex Int
1) Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
(<) ((ix -> m b) -> m ()) -> (ix -> m b) -> m ()
forall a b. (a -> b) -> a -> b
$ \ !ix
ix -> ix -> a -> m b
f ix
ix (Array r ix a -> ix -> a
forall r ix e. Source r ix e => Array r ix e -> ix -> e
unsafeIndex Array r ix a
arr ix
ix)
{-# INLINE imapM_ #-}
elemsCount :: Load r ix e => Array r ix e -> Int
elemsCount :: Array r ix e -> Int
elemsCount = Sz ix -> Int
forall ix. Index ix => Sz ix -> Int
totalElem (Sz ix -> Int) -> (Array r ix e -> Sz ix) -> Array r ix e -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Array r ix e -> Sz ix
forall r ix e. Load r ix e => Array r ix e -> Sz ix
size
{-# INLINE elemsCount #-}
isNotEmpty :: Load r ix e => Array r ix e -> Bool
isNotEmpty :: Array r ix e -> Bool
isNotEmpty = Bool -> Bool
not (Bool -> Bool) -> (Array r ix e -> Bool) -> Array r ix e -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Array r ix e -> Bool
forall r ix e. Load r ix e => Array r ix e -> Bool
isEmpty
{-# INLINE isNotEmpty #-}