{-# language
BangPatterns
, CPP
, FlexibleInstances
, ImportQualifiedPost
, MagicHash
, MultiParamTypeClasses
, MultiWayIf
, NamedFieldPuns
, PackageImports
, PolyKinds
, RecordWildCards
, ScopedTypeVariables
, TypeApplications
, TypeFamilies
, TypeOperators
, UnboxedSums
, UnboxedTuples
#-}
module GrowableVector
( Vec
, new
, withCapacity
, length
, capacity
, reserve
, reserveExact
, shrinkToFit
, shrinkTo
, unsafeRead
, read
, unsafeWrite
, write
, push
, pop
, extend
, fromFoldable
, toList
, toLiftedVector, toLiftedVectorWith
, toPrimitiveVector, toPrimitiveVectorWith
, toStorableVector, toStorableVectorWith
, map, map', imap, imap'
) where
import Control.Monad
import Control.Monad.Primitive
import Data.Foldable (traverse_)
import Data.Foldable qualified as F
import Data.Primitive
import Data.Primitive.Contiguous (Contiguous, Element, Mutable)
import Data.Primitive.Contiguous qualified as C
import GHC.Float (int2Double)
import Foreign.Storable (Storable)
import Prelude hiding (length, read, map)
import Data.Vector qualified as LiftedVector
import Data.Vector.Primitive qualified as PrimitiveVector
import Data.Vector.Storable qualified as StorableVector
data Vec arr s a = Vec
{ forall (arr :: * -> *) s a. Vec arr s a -> MutVar s Word
len :: {-# unpack #-} !(MutVar s Word)
, forall (arr :: * -> *) s a.
Vec arr s a -> MutVar s (Mutable arr s a)
buf :: {-# unpack #-} !(MutVar s (Mutable arr s a))
}
new :: forall m arr s a. (MonadPrim s m, Contiguous arr, Element arr a)
=> m (Vec arr s a)
new :: forall (m :: * -> *) (arr :: * -> *) s a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
m (Vec arr s a)
new = Word -> m (Vec arr s a)
forall (m :: * -> *) (arr :: * -> *) s a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Word -> m (Vec arr s a)
withCapacity Word
0
withCapacity :: forall m arr s a. (MonadPrim s m, Contiguous arr, Element arr a)
=> Word
-> m (Vec arr s a)
withCapacity :: forall (m :: * -> *) (arr :: * -> *) s a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Word -> m (Vec arr s a)
withCapacity Word
sz = MutVar s Word -> MutVar s (Mutable arr s a) -> Vec arr s a
forall (arr :: * -> *) s a.
MutVar s Word -> MutVar s (Mutable arr s a) -> Vec arr s a
Vec
(MutVar s Word -> MutVar s (Mutable arr s a) -> Vec arr s a)
-> m (MutVar s Word)
-> m (MutVar s (Mutable arr s a) -> Vec arr s a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Word -> m (MutVar (PrimState m) Word)
forall (m :: * -> *) a.
PrimMonad m =>
a -> m (MutVar (PrimState m) a)
newMutVar Word
0
m (MutVar s (Mutable arr s a) -> Vec arr s a)
-> m (MutVar s (Mutable arr s a)) -> m (Vec arr s a)
forall a b. m (a -> b) -> m a -> m b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (Mutable arr s a -> m (MutVar s (Mutable arr s a))
Mutable arr s a -> m (MutVar (PrimState m) (Mutable arr s a))
forall (m :: * -> *) a.
PrimMonad m =>
a -> m (MutVar (PrimState m) a)
newMutVar (Mutable arr s a -> m (MutVar s (Mutable arr s a)))
-> m (Mutable arr s a) -> m (MutVar s (Mutable arr s a))
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Word -> m (Mutable arr s a)
forall (arr :: * -> *) a s (m :: * -> *).
(Contiguous arr, Element arr a, MonadPrim s m) =>
Word -> m (Mutable arr s a)
cNew Word
sz)
length :: forall m arr s a. (MonadPrim s m, Contiguous arr, Element arr a)
=> Vec arr s a
-> m Word
length :: forall (m :: * -> *) (arr :: * -> *) s a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Vec arr s a -> m Word
length Vec arr s a
vec = MutVar (PrimState m) Word -> m Word
forall (m :: * -> *) a.
PrimMonad m =>
MutVar (PrimState m) a -> m a
readMutVar (Vec arr s a -> MutVar s Word
forall (arr :: * -> *) s a. Vec arr s a -> MutVar s Word
len Vec arr s a
vec)
capacity :: forall m arr s a. (MonadPrim s m, Contiguous arr, Element arr a)
=> Vec arr s a
-> m Word
capacity :: forall (m :: * -> *) (arr :: * -> *) s a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Vec arr s a -> m Word
capacity Vec arr s a
vec = do
Vec arr s a -> m Word
forall s (m :: * -> *) (arr :: * -> *) a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Vec arr s a -> m Word
internal_max_capacity Vec arr s a
vec
reserveExact :: forall m arr s a. (MonadPrim s m, Contiguous arr, Element arr a)
=> Vec arr s a
-> Word
-> m ()
reserveExact :: forall (m :: * -> *) (arr :: * -> *) s a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Vec arr s a -> Word -> m ()
reserveExact Vec arr s a
vec Word
additional = do
Word
cap <- Vec arr s a -> m Word
forall (m :: * -> *) (arr :: * -> *) s a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Vec arr s a -> m Word
capacity Vec arr s a
vec
Bool -> m () -> m ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Word
additional Word -> Word -> Bool
forall a. Ord a => a -> a -> Bool
> Word
cap) (m () -> m ()) -> m () -> m ()
forall a b. (a -> b) -> a -> b
$ do
Mutable arr s a
oldBuf <- Vec arr s a -> m (Mutable arr s a)
forall s (m :: * -> *) (arr :: * -> *) a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Vec arr s a -> m (Mutable arr s a)
internal_vector Vec arr s a
vec
Word
oldSize <- Mutable arr s a -> m Word
forall (arr :: * -> *) a s (m :: * -> *).
(Contiguous arr, Element arr a, MonadPrim s m) =>
Mutable arr s a -> m Word
cSizeMut Mutable arr s a
oldBuf
Word
usedCap <- Vec arr s a -> m Word
forall (m :: * -> *) (arr :: * -> *) s a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Vec arr s a -> m Word
length Vec arr s a
vec
let newSize :: Word
newSize = Word
oldSize Word -> Word -> Word
forall a. Num a => a -> a -> a
+ Word
additional
Mutable arr s a
newBuf <- Word -> m (Mutable arr s a)
forall (arr :: * -> *) a s (m :: * -> *).
(Contiguous arr, Element arr a, MonadPrim s m) =>
Word -> m (Mutable arr s a)
cNew Word
newSize
Mutable arr s a -> Word -> Mutable arr s a -> m ()
forall (arr :: * -> *) a s (m :: * -> *).
(Contiguous arr, Element arr a, MonadPrim s m) =>
Mutable arr s a -> Word -> Mutable arr s a -> m ()
internalCopyOverN Mutable arr s a
newBuf Word
usedCap Mutable arr s a
oldBuf
MutVar (PrimState m) (Mutable arr s a) -> Mutable arr s a -> m ()
forall (m :: * -> *) a.
PrimMonad m =>
MutVar (PrimState m) a -> a -> m ()
writeMutVar (Vec arr s a -> MutVar s (Mutable arr s a)
forall (arr :: * -> *) s a.
Vec arr s a -> MutVar s (Mutable arr s a)
buf Vec arr s a
vec) Mutable arr s a
newBuf
reserve :: forall m arr s a. (MonadPrim s m, Contiguous arr, Element arr a)
=> Vec arr s a
-> Word
-> m ()
reserve :: forall (m :: * -> *) (arr :: * -> *) s a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Vec arr s a -> Word -> m ()
reserve Vec arr s a
vec Word
additional = do
Bool
needsMore <- (\Word
len Word
cap -> Word
len Word -> Word -> Word
forall a. Num a => a -> a -> a
+ Word
additional Word -> Word -> Bool
forall a. Ord a => a -> a -> Bool
> Word
cap)
(Word -> Word -> Bool) -> m Word -> m (Word -> Bool)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Vec arr s a -> m Word
forall (m :: * -> *) (arr :: * -> *) s a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Vec arr s a -> m Word
length Vec arr s a
vec
m (Word -> Bool) -> m Word -> m Bool
forall a b. m (a -> b) -> m a -> m b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Vec arr s a -> m Word
forall (m :: * -> *) (arr :: * -> *) s a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Vec arr s a -> m Word
capacity Vec arr s a
vec
Bool -> m () -> m ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when Bool
needsMore (m () -> m ()) -> m () -> m ()
forall a b. (a -> b) -> a -> b
$ do
Mutable arr s a
oldBuf <- Vec arr s a -> m (Mutable arr s a)
forall s (m :: * -> *) (arr :: * -> *) a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Vec arr s a -> m (Mutable arr s a)
internal_vector Vec arr s a
vec
Word
oldSize <- Mutable arr s a -> m Word
forall (arr :: * -> *) a s (m :: * -> *).
(Contiguous arr, Element arr a, MonadPrim s m) =>
Mutable arr s a -> m Word
cSizeMut Mutable arr s a
oldBuf
Word
usedCap <- Vec arr s a -> m Word
forall (m :: * -> *) (arr :: * -> *) s a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Vec arr s a -> m Word
length Vec arr s a
vec
let c :: Double
c = Word -> Double
uw2d Word
usedCap
let newSize :: Word
newSize = Double -> Word
forall b. Integral b => Double -> b
forall a b. (RealFrac a, Integral b) => a -> b
ceiling (Double -> Double -> Double
forall a. Ord a => a -> a -> a
max (Double
_GROWTH_FACTOR Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
c) (Double
c Double -> Double -> Double
forall a. Num a => a -> a -> a
+ Double
_GROWTH_FACTOR Double -> Double -> Double
forall a. Num a => a -> a -> a
* Word -> Double
uw2d (Word
oldSize Word -> Word -> Word
forall a. Num a => a -> a -> a
+ Word
additional Word -> Word -> Word
forall a. Num a => a -> a -> a
- Word
usedCap)))
Mutable arr s a
newBuf <- Word -> m (Mutable arr s a)
forall (arr :: * -> *) a s (m :: * -> *).
(Contiguous arr, Element arr a, MonadPrim s m) =>
Word -> m (Mutable arr s a)
cNew Word
newSize
Mutable arr s a -> Word -> Mutable arr s a -> m ()
forall (arr :: * -> *) a s (m :: * -> *).
(Contiguous arr, Element arr a, MonadPrim s m) =>
Mutable arr s a -> Word -> Mutable arr s a -> m ()
internalCopyOverN Mutable arr s a
newBuf Word
usedCap Mutable arr s a
oldBuf
MutVar (PrimState m) (Mutable arr s a) -> Mutable arr s a -> m ()
forall (m :: * -> *) a.
PrimMonad m =>
MutVar (PrimState m) a -> a -> m ()
writeMutVar (Vec arr s a -> MutVar s (Mutable arr s a)
forall (arr :: * -> *) s a.
Vec arr s a -> MutVar s (Mutable arr s a)
buf Vec arr s a
vec) Mutable arr s a
newBuf
shrinkToFit :: forall m arr s a. (MonadPrim s m, Contiguous arr, Element arr a)
=> Vec arr s a
-> m ()
shrinkToFit :: forall (m :: * -> *) (arr :: * -> *) s a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Vec arr s a -> m ()
shrinkToFit Vec arr s a
vec = do
Bool
shrinkable <- (\Word
len Word
cap -> Word
cap Word -> Word -> Bool
forall a. Ord a => a -> a -> Bool
> Word
len)
(Word -> Word -> Bool) -> m Word -> m (Word -> Bool)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Vec arr s a -> m Word
forall (m :: * -> *) (arr :: * -> *) s a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Vec arr s a -> m Word
length Vec arr s a
vec
m (Word -> Bool) -> m Word -> m Bool
forall a b. m (a -> b) -> m a -> m b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Vec arr s a -> m Word
forall (m :: * -> *) (arr :: * -> *) s a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Vec arr s a -> m Word
capacity Vec arr s a
vec
Bool -> m () -> m ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when Bool
shrinkable (m () -> m ()) -> m () -> m ()
forall a b. (a -> b) -> a -> b
$ do
Word
usedCap <- Vec arr s a -> m Word
forall (m :: * -> *) (arr :: * -> *) s a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Vec arr s a -> m Word
length Vec arr s a
vec
Mutable arr s a
oldBuf <- Vec arr s a -> m (Mutable arr s a)
forall s (m :: * -> *) (arr :: * -> *) a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Vec arr s a -> m (Mutable arr s a)
internal_vector Vec arr s a
vec
Mutable arr s a
newBuf <- Word -> m (Mutable arr s a)
forall (arr :: * -> *) a s (m :: * -> *).
(Contiguous arr, Element arr a, MonadPrim s m) =>
Word -> m (Mutable arr s a)
cNew Word
usedCap
Mutable arr s a -> Word -> Mutable arr s a -> m ()
forall (arr :: * -> *) a s (m :: * -> *).
(Contiguous arr, Element arr a, MonadPrim s m) =>
Mutable arr s a -> Word -> Mutable arr s a -> m ()
internalCopyOverN Mutable arr s a
newBuf Word
usedCap Mutable arr s a
oldBuf
MutVar (PrimState m) (Mutable arr s a) -> Mutable arr s a -> m ()
forall (m :: * -> *) a.
PrimMonad m =>
MutVar (PrimState m) a -> a -> m ()
writeMutVar (Vec arr s a -> MutVar s (Mutable arr s a)
forall (arr :: * -> *) s a.
Vec arr s a -> MutVar s (Mutable arr s a)
buf Vec arr s a
vec) Mutable arr s a
newBuf
shrinkTo :: forall m arr s a. (MonadPrim s m, Contiguous arr, Element arr a)
=> Vec arr s a
-> Word
-> m ()
shrinkTo :: forall (m :: * -> *) (arr :: * -> *) s a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Vec arr s a -> Word -> m ()
shrinkTo Vec arr s a
vec Word
minCap = do
Word
cap <- Vec arr s a -> m Word
forall (m :: * -> *) (arr :: * -> *) s a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Vec arr s a -> m Word
capacity Vec arr s a
vec
Bool -> m () -> m ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Word
cap Word -> Word -> Bool
forall a. Ord a => a -> a -> Bool
> Word
minCap) (m () -> m ()) -> m () -> m ()
forall a b. (a -> b) -> a -> b
$ do
Word
len <- Vec arr s a -> m Word
forall (m :: * -> *) (arr :: * -> *) s a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Vec arr s a -> m Word
length Vec arr s a
vec
let newLen :: Word
newLen = Word -> Word -> Word
forall a. Ord a => a -> a -> a
max Word
len Word
minCap
Mutable arr s a
oldBuf <- Vec arr s a -> m (Mutable arr s a)
forall s (m :: * -> *) (arr :: * -> *) a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Vec arr s a -> m (Mutable arr s a)
internal_vector Vec arr s a
vec
Mutable arr s a
newBuf <- Word -> m (Mutable arr s a)
forall (arr :: * -> *) a s (m :: * -> *).
(Contiguous arr, Element arr a, MonadPrim s m) =>
Word -> m (Mutable arr s a)
cNew Word
newLen
Mutable arr s a -> Word -> Mutable arr s a -> m ()
forall (arr :: * -> *) a s (m :: * -> *).
(Contiguous arr, Element arr a, MonadPrim s m) =>
Mutable arr s a -> Word -> Mutable arr s a -> m ()
internalCopyOverN Mutable arr s a
newBuf Word
newLen Mutable arr s a
oldBuf
MutVar (PrimState m) (Mutable arr s a) -> Mutable arr s a -> m ()
forall (m :: * -> *) a.
PrimMonad m =>
MutVar (PrimState m) a -> a -> m ()
writeMutVar (Vec arr s a -> MutVar s (Mutable arr s a)
forall (arr :: * -> *) s a.
Vec arr s a -> MutVar s (Mutable arr s a)
buf Vec arr s a
vec) Mutable arr s a
newBuf
unsafeRead :: forall m arr s a. (MonadPrim s m, Contiguous arr, Element arr a)
=> Vec arr s a
-> Word
-> m a
unsafeRead :: forall (m :: * -> *) (arr :: * -> *) s a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Vec arr s a -> Word -> m a
unsafeRead Vec arr s a
vec Word
n = do
Mutable arr s a
v <- MutVar (PrimState m) (Mutable arr s a) -> m (Mutable arr s a)
forall (m :: * -> *) a.
PrimMonad m =>
MutVar (PrimState m) a -> m a
readMutVar (Vec arr s a -> MutVar s (Mutable arr s a)
forall (arr :: * -> *) s a.
Vec arr s a -> MutVar s (Mutable arr s a)
buf Vec arr s a
vec)
Mutable arr s a -> Word -> m a
forall (arr :: * -> *) a s (m :: * -> *).
(Contiguous arr, Element arr a, MonadPrim s m) =>
Mutable arr s a -> Word -> m a
cRead Mutable arr s a
v Word
n
read :: forall m arr s a. (MonadPrim s m, Contiguous arr, Element arr a)
=> Vec arr s a
-> Word
-> m (Maybe a)
read :: forall (m :: * -> *) (arr :: * -> *) s a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Vec arr s a -> Word -> m (Maybe a)
read Vec arr s a
vec Word
n = do
Word
len <- Vec arr s a -> m Word
forall (m :: * -> *) (arr :: * -> *) s a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Vec arr s a -> m Word
length Vec arr s a
vec
if (Word
n Word -> Word -> Bool
forall a. Ord a => a -> a -> Bool
>= Word
0 Bool -> Bool -> Bool
&& Word
n Word -> Word -> Bool
forall a. Ord a => a -> a -> Bool
< Word
len)
then a -> Maybe a
forall a. a -> Maybe a
Just (a -> Maybe a) -> m a -> m (Maybe a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Vec arr s a -> Word -> m a
forall (m :: * -> *) (arr :: * -> *) s a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Vec arr s a -> Word -> m a
unsafeRead Vec arr s a
vec Word
n
else Maybe a -> m (Maybe a)
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe a
forall a. Maybe a
Nothing
unsafeWrite :: forall m arr s a. (MonadPrim s m, Contiguous arr, Element arr a)
=> Vec arr s a
-> Word
-> a
-> m ()
unsafeWrite :: forall (m :: * -> *) (arr :: * -> *) s a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Vec arr s a -> Word -> a -> m ()
unsafeWrite Vec arr s a
vec Word
n a
x = do
Mutable arr s a
v <- MutVar (PrimState m) (Mutable arr s a) -> m (Mutable arr s a)
forall (m :: * -> *) a.
PrimMonad m =>
MutVar (PrimState m) a -> m a
readMutVar (Vec arr s a -> MutVar s (Mutable arr s a)
forall (arr :: * -> *) s a.
Vec arr s a -> MutVar s (Mutable arr s a)
buf Vec arr s a
vec)
Mutable arr s a -> Word -> a -> m ()
forall (arr :: * -> *) a s (m :: * -> *).
(Contiguous arr, Element arr a, MonadPrim s m) =>
Mutable arr s a -> Word -> a -> m ()
cWrite Mutable arr s a
v Word
n a
x
write :: forall m arr s a. (MonadPrim s m, Contiguous arr, Element arr a)
=> Vec arr s a
-> Word
-> a
-> m (Maybe ())
write :: forall (m :: * -> *) (arr :: * -> *) s a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Vec arr s a -> Word -> a -> m (Maybe ())
write Vec arr s a
vec Word
n a
x = do
Word
len <- Vec arr s a -> m Word
forall (m :: * -> *) (arr :: * -> *) s a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Vec arr s a -> m Word
length Vec arr s a
vec
if (Word
n Word -> Word -> Bool
forall a. Ord a => a -> a -> Bool
>= Word
0 Bool -> Bool -> Bool
&& Word
n Word -> Word -> Bool
forall a. Ord a => a -> a -> Bool
< Word
len)
then () -> Maybe ()
forall a. a -> Maybe a
Just (() -> Maybe ()) -> m () -> m (Maybe ())
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Vec arr s a -> Word -> a -> m ()
forall (m :: * -> *) (arr :: * -> *) s a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Vec arr s a -> Word -> a -> m ()
unsafeWrite Vec arr s a
vec Word
n a
x
else Maybe () -> m (Maybe ())
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe ()
forall a. Maybe a
Nothing
push :: forall m arr s a. (MonadPrim s m, Contiguous arr, Element arr a)
=> Vec arr s a
-> a
-> m ()
push :: forall (m :: * -> *) (arr :: * -> *) s a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Vec arr s a -> a -> m ()
push Vec arr s a
vec a
x = do
Vec arr s a -> Word -> m ()
forall (m :: * -> *) (arr :: * -> *) s a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Vec arr s a -> Word -> m ()
reserve Vec arr s a
vec Word
1
Word
index <- Vec arr s a -> m Word
forall (m :: * -> *) (arr :: * -> *) s a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Vec arr s a -> m Word
length Vec arr s a
vec
Vec arr s a -> Word -> a -> m ()
forall s (m :: * -> *) (arr :: * -> *) a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Vec arr s a -> Word -> a -> m ()
internal_write Vec arr s a
vec Word
index a
x
Vec arr s a -> (Word -> Word) -> m ()
forall s (m :: * -> *) (arr :: * -> *) a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Vec arr s a -> (Word -> Word) -> m ()
internal_modify_len Vec arr s a
vec (Word -> Word -> Word
forall a. Num a => a -> a -> a
+ Word
1)
pop :: forall m arr s a. (MonadPrim s m, Contiguous arr, Element arr a)
=> Vec arr s a
-> m (Maybe a)
pop :: forall (m :: * -> *) (arr :: * -> *) s a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Vec arr s a -> m (Maybe a)
pop Vec arr s a
vec = do
Word
lastIndex <- Vec arr s a -> m Word
forall (m :: * -> *) (arr :: * -> *) s a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Vec arr s a -> m Word
length Vec arr s a
vec
if Word
lastIndex Word -> Word -> Bool
forall a. Eq a => a -> a -> Bool
== Word
0
then Maybe a -> m (Maybe a)
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe a
forall a. Maybe a
Nothing
else do
Vec arr s a -> (Word -> Word) -> m ()
forall s (m :: * -> *) (arr :: * -> *) a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Vec arr s a -> (Word -> Word) -> m ()
internal_modify_len Vec arr s a
vec (Word -> Word -> Word
forall a. Num a => a -> a -> a
subtract Word
1)
a -> Maybe a
forall a. a -> Maybe a
Just (a -> Maybe a) -> m a -> m (Maybe a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Vec arr s a -> Word -> m a
forall (m :: * -> *) (arr :: * -> *) s a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Vec arr s a -> Word -> m a
unsafeRead Vec arr s a
vec (Word
lastIndex Word -> Word -> Word
forall a. Num a => a -> a -> a
- Word
1)
extend :: forall m arr s a t. (MonadPrim s m, Contiguous arr, Element arr a, Foldable t)
=> Vec arr s a
-> t a
-> m ()
extend :: forall (m :: * -> *) (arr :: * -> *) s a (t :: * -> *).
(MonadPrim s m, Contiguous arr, Element arr a, Foldable t) =>
Vec arr s a -> t a -> m ()
extend Vec arr s a
vec t a
xs = do
(a -> m ()) -> t a -> m ()
forall (t :: * -> *) (f :: * -> *) a b.
(Foldable t, Applicative f) =>
(a -> f b) -> t a -> f ()
traverse_ (Vec arr s a -> a -> m ()
forall (m :: * -> *) (arr :: * -> *) s a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Vec arr s a -> a -> m ()
push Vec arr s a
vec) t a
xs
fromFoldable :: forall m arr s a t. (MonadPrim s m, Contiguous arr, Element arr a, Foldable t)
=> t a
-> m (Vec arr s a)
fromFoldable :: forall (m :: * -> *) (arr :: * -> *) s a (t :: * -> *).
(MonadPrim s m, Contiguous arr, Element arr a, Foldable t) =>
t a -> m (Vec arr s a)
fromFoldable t a
xs = do
Vec arr s a
vec <- Word -> m (Vec arr s a)
forall (m :: * -> *) (arr :: * -> *) s a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Word -> m (Vec arr s a)
withCapacity (Int -> Word
ui2w (t a -> Int
forall a. t a -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
F.length t a
xs))
Vec arr s a -> t a -> m ()
forall (m :: * -> *) (arr :: * -> *) s a (t :: * -> *).
(MonadPrim s m, Contiguous arr, Element arr a, Foldable t) =>
Vec arr s a -> t a -> m ()
extend Vec arr s a
vec t a
xs
Vec arr s a -> m (Vec arr s a)
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Vec arr s a
vec
toList :: forall m arr s a. (MonadPrim s m, Contiguous arr, Element arr a)
=> Vec arr s a
-> m [a]
toList :: forall (m :: * -> *) (arr :: * -> *) s a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Vec arr s a -> m [a]
toList Vec arr s a
vec = do
Mutable arr s a
buf <- Vec arr s a -> m (Mutable arr s a)
forall s (m :: * -> *) (arr :: * -> *) a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Vec arr s a -> m (Mutable arr s a)
internal_vector Vec arr s a
vec
Word
sz <- Vec arr s a -> m Word
forall (m :: * -> *) (arr :: * -> *) s a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Vec arr s a -> m Word
length Vec arr s a
vec
let go :: Int -> [a] -> m [a]
go :: Int -> [a] -> m [a]
go !Int
ix ![a]
acc =
if Int
ix Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
0
then do
a
x <- Mutable arr (PrimState m) a -> Int -> m a
forall (arr :: * -> *) (m :: * -> *) b.
(Contiguous arr, PrimMonad m, Element arr b) =>
Mutable arr (PrimState m) b -> Int -> m b
forall (m :: * -> *) b.
(PrimMonad m, Element arr b) =>
Mutable arr (PrimState m) b -> Int -> m b
C.read Mutable arr s a
Mutable arr (PrimState m) a
buf Int
ix
Int -> [a] -> m [a]
go (Int
ix Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) (a
x a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [a]
acc)
else do
[a] -> m [a]
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure [a]
acc
Int -> [a] -> m [a]
go (Word -> Int
uw2i (Word
sz Word -> Word -> Word
forall a. Num a => a -> a -> a
- Word
1)) []
toPrimitiveVector :: forall m arr s a. (MonadPrim s m, Contiguous arr, Element arr a, Prim a)
=> Vec arr s a
-> m (PrimitiveVector.Vector a)
toPrimitiveVector :: forall (m :: * -> *) (arr :: * -> *) s a.
(MonadPrim s m, Contiguous arr, Element arr a, Prim a) =>
Vec arr s a -> m (Vector a)
toPrimitiveVector Vec arr s a
vec = do
(Word -> a -> m a) -> Vec arr s a -> m (Vector a)
forall (m :: * -> *) (arr :: * -> *) s a b.
(MonadPrim s m, Contiguous arr, Element arr a, Prim b) =>
(Word -> a -> m b) -> Vec arr s a -> m (Vector b)
toPrimitiveVectorWith (\Word
_ a
a -> a -> m a
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure a
a) Vec arr s a
vec
toStorableVector :: forall m arr s a. (MonadPrim s m, Contiguous arr, Element arr a, Storable a)
=> Vec arr s a
-> m (StorableVector.Vector a)
toStorableVector :: forall (m :: * -> *) (arr :: * -> *) s a.
(MonadPrim s m, Contiguous arr, Element arr a, Storable a) =>
Vec arr s a -> m (Vector a)
toStorableVector Vec arr s a
vec = do
(Word -> a -> m a) -> Vec arr s a -> m (Vector a)
forall (m :: * -> *) (arr :: * -> *) s a b.
(MonadPrim s m, Contiguous arr, Element arr a, Storable b) =>
(Word -> a -> m b) -> Vec arr s a -> m (Vector b)
toStorableVectorWith (\Word
_ a
a -> a -> m a
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure a
a) Vec arr s a
vec
toLiftedVector :: forall m arr s a. (MonadPrim s m, Contiguous arr, Element arr a)
=> Vec arr s a
-> m (LiftedVector.Vector a)
toLiftedVector :: forall (m :: * -> *) (arr :: * -> *) s a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Vec arr s a -> m (Vector a)
toLiftedVector Vec arr s a
vec = do
(Word -> a -> m a) -> Vec arr s a -> m (Vector a)
forall (m :: * -> *) (arr :: * -> *) s a b.
(MonadPrim s m, Contiguous arr, Element arr a) =>
(Word -> a -> m b) -> Vec arr s a -> m (Vector b)
toLiftedVectorWith (\Word
_ a
a -> a -> m a
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure a
a) Vec arr s a
vec
toPrimitiveVectorWith :: forall m arr s a b. (MonadPrim s m, Contiguous arr, Element arr a, Prim b)
=> (Word -> a -> m b)
-> Vec arr s a
-> m (PrimitiveVector.Vector b)
toPrimitiveVectorWith :: forall (m :: * -> *) (arr :: * -> *) s a b.
(MonadPrim s m, Contiguous arr, Element arr a, Prim b) =>
(Word -> a -> m b) -> Vec arr s a -> m (Vector b)
toPrimitiveVectorWith Word -> a -> m b
f Vec arr s a
vec = do
Mutable arr s a
buf <- Vec arr s a -> m (Mutable arr s a)
forall s (m :: * -> *) (arr :: * -> *) a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Vec arr s a -> m (Mutable arr s a)
internal_vector Vec arr s a
vec
Word
len <- Vec arr s a -> m Word
forall (m :: * -> *) (arr :: * -> *) s a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Vec arr s a -> m Word
length Vec arr s a
vec
Int -> (Int -> m b) -> m (Vector b)
forall (m :: * -> *) a.
(Monad m, Prim a) =>
Int -> (Int -> m a) -> m (Vector a)
PrimitiveVector.generateM (Word -> Int
uw2i Word
len) ((Int -> m b) -> m (Vector b)) -> (Int -> m b) -> m (Vector b)
forall a b. (a -> b) -> a -> b
$ \Int
ix -> do
let wix :: Word
wix = Int -> Word
ui2w Int
ix
a
x <- Mutable arr s a -> Word -> m a
forall (arr :: * -> *) a s (m :: * -> *).
(Contiguous arr, Element arr a, MonadPrim s m) =>
Mutable arr s a -> Word -> m a
cRead Mutable arr s a
buf Word
wix
Word -> a -> m b
f Word
wix a
x
toStorableVectorWith :: forall m arr s a b. (MonadPrim s m, Contiguous arr, Element arr a, Storable b)
=> (Word -> a -> m b)
-> Vec arr s a
-> m (StorableVector.Vector b)
toStorableVectorWith :: forall (m :: * -> *) (arr :: * -> *) s a b.
(MonadPrim s m, Contiguous arr, Element arr a, Storable b) =>
(Word -> a -> m b) -> Vec arr s a -> m (Vector b)
toStorableVectorWith Word -> a -> m b
f Vec arr s a
vec = do
Mutable arr s a
buf <- Vec arr s a -> m (Mutable arr s a)
forall s (m :: * -> *) (arr :: * -> *) a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Vec arr s a -> m (Mutable arr s a)
internal_vector Vec arr s a
vec
Word
len <- Vec arr s a -> m Word
forall (m :: * -> *) (arr :: * -> *) s a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Vec arr s a -> m Word
length Vec arr s a
vec
Int -> (Int -> m b) -> m (Vector b)
forall (m :: * -> *) a.
(Monad m, Storable a) =>
Int -> (Int -> m a) -> m (Vector a)
StorableVector.generateM (Word -> Int
uw2i Word
len) ((Int -> m b) -> m (Vector b)) -> (Int -> m b) -> m (Vector b)
forall a b. (a -> b) -> a -> b
$ \Int
ix -> do
let wix :: Word
wix = Int -> Word
ui2w Int
ix
a
x <- Mutable arr s a -> Word -> m a
forall (arr :: * -> *) a s (m :: * -> *).
(Contiguous arr, Element arr a, MonadPrim s m) =>
Mutable arr s a -> Word -> m a
cRead Mutable arr s a
buf Word
wix
Word -> a -> m b
f Word
wix a
x
toLiftedVectorWith :: forall m arr s a b. (MonadPrim s m, Contiguous arr, Element arr a)
=> (Word -> a -> m b)
-> Vec arr s a
-> m (LiftedVector.Vector b)
toLiftedVectorWith :: forall (m :: * -> *) (arr :: * -> *) s a b.
(MonadPrim s m, Contiguous arr, Element arr a) =>
(Word -> a -> m b) -> Vec arr s a -> m (Vector b)
toLiftedVectorWith Word -> a -> m b
f Vec arr s a
vec = do
Mutable arr s a
buf <- Vec arr s a -> m (Mutable arr s a)
forall s (m :: * -> *) (arr :: * -> *) a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Vec arr s a -> m (Mutable arr s a)
internal_vector Vec arr s a
vec
Word
len <- Vec arr s a -> m Word
forall (m :: * -> *) (arr :: * -> *) s a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Vec arr s a -> m Word
length Vec arr s a
vec
Int -> (Int -> m b) -> m (Vector b)
forall (m :: * -> *) a.
Monad m =>
Int -> (Int -> m a) -> m (Vector a)
LiftedVector.generateM (Word -> Int
uw2i Word
len) ((Int -> m b) -> m (Vector b)) -> (Int -> m b) -> m (Vector b)
forall a b. (a -> b) -> a -> b
$ \Int
ix -> do
let wix :: Word
wix = Int -> Word
ui2w Int
ix
a
x <- Mutable arr s a -> Word -> m a
forall (arr :: * -> *) a s (m :: * -> *).
(Contiguous arr, Element arr a, MonadPrim s m) =>
Mutable arr s a -> Word -> m a
cRead Mutable arr s a
buf Word
wix
Word -> a -> m b
f Word
wix a
x
map :: forall m arr s a. (MonadPrim s m, Contiguous arr, Element arr a)
=> (a -> a)
-> Vec arr s a
-> m ()
map :: forall (m :: * -> *) (arr :: * -> *) s a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
(a -> a) -> Vec arr s a -> m ()
map a -> a
f Vec arr s a
vec = do
Mutable arr s a
buf <- Vec arr s a -> m (Mutable arr s a)
forall s (m :: * -> *) (arr :: * -> *) a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Vec arr s a -> m (Mutable arr s a)
internal_vector Vec arr s a
vec
Word
len <- Vec arr s a -> m Word
forall (m :: * -> *) (arr :: * -> *) s a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Vec arr s a -> m Word
length Vec arr s a
vec
let go :: Word -> m ()
go !Word
ix = Bool -> m () -> m ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Word
ix Word -> Word -> Bool
forall a. Ord a => a -> a -> Bool
< Word
len) (m () -> m ()) -> m () -> m ()
forall a b. (a -> b) -> a -> b
$ do
a
a <- Mutable arr s a -> Word -> m a
forall (arr :: * -> *) a s (m :: * -> *).
(Contiguous arr, Element arr a, MonadPrim s m) =>
Mutable arr s a -> Word -> m a
cRead Mutable arr s a
buf Word
ix
Mutable arr s a -> Word -> a -> m ()
forall (arr :: * -> *) a s (m :: * -> *).
(Contiguous arr, Element arr a, MonadPrim s m) =>
Mutable arr s a -> Word -> a -> m ()
cWrite Mutable arr s a
buf Word
ix (a -> a
f a
a)
Word -> m ()
go (Word
ix Word -> Word -> Word
forall a. Num a => a -> a -> a
+ Word
1)
Word -> m ()
go Word
0
map' :: forall m arr s a. (MonadPrim s m, Contiguous arr, Element arr a)
=> (a -> a)
-> Vec arr s a
-> m ()
map' :: forall (m :: * -> *) (arr :: * -> *) s a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
(a -> a) -> Vec arr s a -> m ()
map' a -> a
f Vec arr s a
vec = do
Mutable arr s a
buf <- Vec arr s a -> m (Mutable arr s a)
forall s (m :: * -> *) (arr :: * -> *) a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Vec arr s a -> m (Mutable arr s a)
internal_vector Vec arr s a
vec
Word
len <- Vec arr s a -> m Word
forall (m :: * -> *) (arr :: * -> *) s a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Vec arr s a -> m Word
length Vec arr s a
vec
let go :: Word -> m ()
go !Word
ix = Bool -> m () -> m ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Word
ix Word -> Word -> Bool
forall a. Ord a => a -> a -> Bool
< Word
len) (m () -> m ()) -> m () -> m ()
forall a b. (a -> b) -> a -> b
$ do
a
a <- Mutable arr s a -> Word -> m a
forall (arr :: * -> *) a s (m :: * -> *).
(Contiguous arr, Element arr a, MonadPrim s m) =>
Mutable arr s a -> Word -> m a
cRead Mutable arr s a
buf Word
ix
let !a' :: a
a' = a -> a
f a
a
Mutable arr s a -> Word -> a -> m ()
forall (arr :: * -> *) a s (m :: * -> *).
(Contiguous arr, Element arr a, MonadPrim s m) =>
Mutable arr s a -> Word -> a -> m ()
cWrite Mutable arr s a
buf Word
ix a
a'
Word -> m ()
go (Word
ix Word -> Word -> Word
forall a. Num a => a -> a -> a
+ Word
1)
Word -> m ()
go Word
0
imap :: forall m arr s a. (MonadPrim s m, Contiguous arr, Element arr a)
=> (Word -> a -> a)
-> Vec arr s a
-> m ()
imap :: forall (m :: * -> *) (arr :: * -> *) s a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
(Word -> a -> a) -> Vec arr s a -> m ()
imap Word -> a -> a
f Vec arr s a
vec = do
Mutable arr s a
buf <- Vec arr s a -> m (Mutable arr s a)
forall s (m :: * -> *) (arr :: * -> *) a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Vec arr s a -> m (Mutable arr s a)
internal_vector Vec arr s a
vec
Word
len <- Vec arr s a -> m Word
forall (m :: * -> *) (arr :: * -> *) s a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Vec arr s a -> m Word
length Vec arr s a
vec
let go :: Word -> m ()
go !Word
ix = Bool -> m () -> m ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Word
ix Word -> Word -> Bool
forall a. Ord a => a -> a -> Bool
< Word
len) (m () -> m ()) -> m () -> m ()
forall a b. (a -> b) -> a -> b
$ do
a
a <- Mutable arr s a -> Word -> m a
forall (arr :: * -> *) a s (m :: * -> *).
(Contiguous arr, Element arr a, MonadPrim s m) =>
Mutable arr s a -> Word -> m a
cRead Mutable arr s a
buf Word
ix
Mutable arr s a -> Word -> a -> m ()
forall (arr :: * -> *) a s (m :: * -> *).
(Contiguous arr, Element arr a, MonadPrim s m) =>
Mutable arr s a -> Word -> a -> m ()
cWrite Mutable arr s a
buf Word
ix (Word -> a -> a
f Word
ix a
a)
Word -> m ()
go (Word
ix Word -> Word -> Word
forall a. Num a => a -> a -> a
+ Word
1)
Word -> m ()
go Word
0
imap' :: forall m arr s a. (MonadPrim s m, Contiguous arr, Element arr a)
=> (Word -> a -> a)
-> Vec arr s a
-> m ()
imap' :: forall (m :: * -> *) (arr :: * -> *) s a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
(Word -> a -> a) -> Vec arr s a -> m ()
imap' Word -> a -> a
f Vec arr s a
vec = do
Mutable arr s a
buf <- Vec arr s a -> m (Mutable arr s a)
forall s (m :: * -> *) (arr :: * -> *) a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Vec arr s a -> m (Mutable arr s a)
internal_vector Vec arr s a
vec
Word
len <- Vec arr s a -> m Word
forall (m :: * -> *) (arr :: * -> *) s a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Vec arr s a -> m Word
length Vec arr s a
vec
let go :: Word -> m ()
go !Word
ix = Bool -> m () -> m ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Word
ix Word -> Word -> Bool
forall a. Ord a => a -> a -> Bool
< Word
len) (m () -> m ()) -> m () -> m ()
forall a b. (a -> b) -> a -> b
$ do
a
a <- Mutable arr s a -> Word -> m a
forall (arr :: * -> *) a s (m :: * -> *).
(Contiguous arr, Element arr a, MonadPrim s m) =>
Mutable arr s a -> Word -> m a
cRead Mutable arr s a
buf Word
ix
let !a' :: a
a' = Word -> a -> a
f Word
ix a
a
Mutable arr s a -> Word -> a -> m ()
forall (arr :: * -> *) a s (m :: * -> *).
(Contiguous arr, Element arr a, MonadPrim s m) =>
Mutable arr s a -> Word -> a -> m ()
cWrite Mutable arr s a
buf Word
ix a
a'
Word -> m ()
go (Word
ix Word -> Word -> Word
forall a. Num a => a -> a -> a
+ Word
1)
Word -> m ()
go Word
0
internal_vector :: (MonadPrim s m, Contiguous arr, Element arr a)
=> Vec arr s a
-> m (Mutable arr s a)
internal_vector :: forall s (m :: * -> *) (arr :: * -> *) a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Vec arr s a -> m (Mutable arr s a)
internal_vector = MutVar s (Mutable arr s a) -> m (Mutable arr s a)
MutVar (PrimState m) (Mutable arr s a) -> m (Mutable arr s a)
forall (m :: * -> *) a.
PrimMonad m =>
MutVar (PrimState m) a -> m a
readMutVar (MutVar s (Mutable arr s a) -> m (Mutable arr s a))
-> (Vec arr s a -> MutVar s (Mutable arr s a))
-> Vec arr s a
-> m (Mutable arr s a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Vec arr s a -> MutVar s (Mutable arr s a)
forall (arr :: * -> *) s a.
Vec arr s a -> MutVar s (Mutable arr s a)
buf
internal_write :: (MonadPrim s m, Contiguous arr, Element arr a)
=> Vec arr s a
-> Word
-> a
-> m ()
internal_write :: forall s (m :: * -> *) (arr :: * -> *) a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Vec arr s a -> Word -> a -> m ()
internal_write Vec arr s a
vec Word
i a
x = Vec arr s a -> m (Mutable arr s a)
forall s (m :: * -> *) (arr :: * -> *) a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Vec arr s a -> m (Mutable arr s a)
internal_vector Vec arr s a
vec m (Mutable arr s a) -> (Mutable arr s a -> m ()) -> m ()
forall a b. m a -> (a -> m b) -> m b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Mutable arr s a
v -> Mutable arr s a -> Word -> a -> m ()
forall (arr :: * -> *) a s (m :: * -> *).
(Contiguous arr, Element arr a, MonadPrim s m) =>
Mutable arr s a -> Word -> a -> m ()
cWrite Mutable arr s a
v Word
i a
x
internal_max_capacity :: (MonadPrim s m, Contiguous arr, Element arr a)
=> Vec arr s a
-> m Word
internal_max_capacity :: forall s (m :: * -> *) (arr :: * -> *) a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Vec arr s a -> m Word
internal_max_capacity Vec arr s a
vec = do
Mutable arr s a -> m Word
forall (arr :: * -> *) a s (m :: * -> *).
(Contiguous arr, Element arr a, MonadPrim s m) =>
Mutable arr s a -> m Word
cSizeMut (Mutable arr s a -> m Word) -> m (Mutable arr s a) -> m Word
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< MutVar (PrimState m) (Mutable arr s a) -> m (Mutable arr s a)
forall (m :: * -> *) a.
PrimMonad m =>
MutVar (PrimState m) a -> m a
readMutVar (Vec arr s a -> MutVar s (Mutable arr s a)
forall (arr :: * -> *) s a.
Vec arr s a -> MutVar s (Mutable arr s a)
buf Vec arr s a
vec)
internal_modify_len :: (MonadPrim s m, Contiguous arr, Element arr a)
=> Vec arr s a
-> (Word -> Word)
-> m ()
internal_modify_len :: forall s (m :: * -> *) (arr :: * -> *) a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Vec arr s a -> (Word -> Word) -> m ()
internal_modify_len Vec arr s a
vec Word -> Word
f = do
MutVar (PrimState m) Word -> (Word -> Word) -> m ()
forall (m :: * -> *) a.
PrimMonad m =>
MutVar (PrimState m) a -> (a -> a) -> m ()
modifyMutVar' (Vec arr s a -> MutVar s Word
forall (arr :: * -> *) s a. Vec arr s a -> MutVar s Word
len Vec arr s a
vec) Word -> Word
f
ui2w :: Int -> Word
ui2w :: Int -> Word
ui2w = Int -> Word
forall a b. (Integral a, Num b) => a -> b
fromIntegral
uw2i :: Word -> Int
uw2i :: Word -> Int
uw2i = Word -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral
uw2d :: Word -> Double
uw2d :: Word -> Double
uw2d Word
w = Int -> Double
int2Double (Word -> Int
uw2i Word
w)
cNew :: (Contiguous arr, Element arr a, MonadPrim s m) => Word -> m (Mutable arr s a)
cNew :: forall (arr :: * -> *) a s (m :: * -> *).
(Contiguous arr, Element arr a, MonadPrim s m) =>
Word -> m (Mutable arr s a)
cNew Word
w = Int -> m (Mutable arr (PrimState m) a)
forall (arr :: * -> *) (m :: * -> *) b.
(Contiguous arr, PrimMonad m, Element arr b) =>
Int -> m (Mutable arr (PrimState m) b)
forall (m :: * -> *) b.
(PrimMonad m, Element arr b) =>
Int -> m (Mutable arr (PrimState m) b)
C.new (Word -> Int
uw2i Word
w)
cRead :: (Contiguous arr, Element arr a, MonadPrim s m) => Mutable arr s a -> Word -> m a
cRead :: forall (arr :: * -> *) a s (m :: * -> *).
(Contiguous arr, Element arr a, MonadPrim s m) =>
Mutable arr s a -> Word -> m a
cRead Mutable arr s a
m Word
w = Mutable arr (PrimState m) a -> Int -> m a
forall (arr :: * -> *) (m :: * -> *) b.
(Contiguous arr, PrimMonad m, Element arr b) =>
Mutable arr (PrimState m) b -> Int -> m b
forall (m :: * -> *) b.
(PrimMonad m, Element arr b) =>
Mutable arr (PrimState m) b -> Int -> m b
C.read Mutable arr s a
Mutable arr (PrimState m) a
m (Word -> Int
uw2i Word
w)
cWrite :: (Contiguous arr, Element arr a, MonadPrim s m) => Mutable arr s a -> Word -> a -> m ()
cWrite :: forall (arr :: * -> *) a s (m :: * -> *).
(Contiguous arr, Element arr a, MonadPrim s m) =>
Mutable arr s a -> Word -> a -> m ()
cWrite Mutable arr s a
m Word
w a
a = Mutable arr (PrimState m) a -> Int -> a -> m ()
forall (arr :: * -> *) (m :: * -> *) b.
(Contiguous arr, PrimMonad m, Element arr b) =>
Mutable arr (PrimState m) b -> Int -> b -> m ()
forall (m :: * -> *) b.
(PrimMonad m, Element arr b) =>
Mutable arr (PrimState m) b -> Int -> b -> m ()
C.write Mutable arr s a
Mutable arr (PrimState m) a
m (Word -> Int
uw2i Word
w) a
a
cSizeMut :: (Contiguous arr, Element arr a, MonadPrim s m) => Mutable arr s a -> m Word
cSizeMut :: forall (arr :: * -> *) a s (m :: * -> *).
(Contiguous arr, Element arr a, MonadPrim s m) =>
Mutable arr s a -> m Word
cSizeMut Mutable arr s a
m = Int -> Word
ui2w (Int -> Word) -> m Int -> m Word
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Mutable arr (PrimState m) a -> m Int
forall (arr :: * -> *) (m :: * -> *) b.
(Contiguous arr, PrimMonad m, Element arr b) =>
Mutable arr (PrimState m) b -> m Int
forall (m :: * -> *) b.
(PrimMonad m, Element arr b) =>
Mutable arr (PrimState m) b -> m Int
C.sizeMut Mutable arr s a
Mutable arr (PrimState m) a
m
internalCopyOverN :: (Contiguous arr, Element arr a, MonadPrim s m) => Mutable arr s a -> Word -> Mutable arr s a -> m ()
internalCopyOverN :: forall (arr :: * -> *) a s (m :: * -> *).
(Contiguous arr, Element arr a, MonadPrim s m) =>
Mutable arr s a -> Word -> Mutable arr s a -> m ()
internalCopyOverN Mutable arr s a
destination Word
sourceLen Mutable arr s a
source = do
Mutable arr (PrimState m) a
-> Int -> MutableSliced arr (PrimState m) a -> m ()
forall (arr :: * -> *) (m :: * -> *) b.
(Contiguous arr, PrimMonad m, Element arr b) =>
Mutable arr (PrimState m) b
-> Int -> MutableSliced arr (PrimState m) b -> m ()
forall (m :: * -> *) b.
(PrimMonad m, Element arr b) =>
Mutable arr (PrimState m) b
-> Int -> MutableSliced arr (PrimState m) b -> m ()
C.copyMut Mutable arr s a
Mutable arr (PrimState m) a
destination Int
0 (Mutable arr s a -> Int -> Int -> MutableSliced arr s a
forall a s.
Element arr a =>
Mutable arr s a -> Int -> Int -> MutableSliced arr s a
forall (arr :: * -> *) a s.
(Contiguous arr, Element arr a) =>
Mutable arr s a -> Int -> Int -> MutableSliced arr s a
C.sliceMut Mutable arr s a
source Int
0 (Word -> Int
uw2i Word
sourceLen))
_GROWTH_FACTOR :: Double
_GROWTH_FACTOR :: Double
_GROWTH_FACTOR = Double
1.5
{-# inline _GROWTH_FACTOR #-}