{-# language
ImportQualifiedPost
, PackageImports
, ScopedTypeVariables
, TypeApplications
, TypeFamilies
#-}
module GrowableVector.Unboxed
( 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 GrowableVector qualified
import Control.Monad
import Control.Monad.Primitive
import Data.Coerce (coerce)
import Data.Primitive
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
newtype Vec s a = Vec (GrowableVector.Vec PrimArray s a)
new :: forall m s a. (MonadPrim s m, Prim a)
=> m (Vec s a)
new :: forall (m :: * -> *) s a. (MonadPrim s m, Prim a) => m (Vec s a)
new = (Vec PrimArray s a -> Vec s a)
-> m (Vec PrimArray s a) -> m (Vec s a)
forall a b. (a -> b) -> m a -> m b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Vec PrimArray s a -> Vec s a
forall a b. Coercible a b => a -> b
coerce m (Vec PrimArray s a)
forall (m :: * -> *) (arr :: * -> *) s a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
m (Vec arr s a)
GrowableVector.new
withCapacity :: forall m s a. (MonadPrim s m, Prim a)
=> Word
-> m (Vec s a)
withCapacity :: forall (m :: * -> *) s a.
(MonadPrim s m, Prim a) =>
Word -> m (Vec s a)
withCapacity Word
sz = (Vec PrimArray s a -> Vec s a)
-> m (Vec PrimArray s a) -> m (Vec s a)
forall a b. (a -> b) -> m a -> m b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Vec PrimArray s a -> Vec s a
forall a b. Coercible a b => a -> b
coerce (Word -> m (Vec PrimArray s a)
forall (m :: * -> *) (arr :: * -> *) s a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Word -> m (Vec arr s a)
GrowableVector.withCapacity Word
sz)
length :: forall m s a. (MonadPrim s m, Prim a)
=> Vec s a
-> m Word
length :: forall (m :: * -> *) s a.
(MonadPrim s m, Prim a) =>
Vec s a -> m Word
length Vec s a
vec = Vec PrimArray s a -> m Word
forall (m :: * -> *) (arr :: * -> *) s a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Vec arr s a -> m Word
GrowableVector.length (Vec s a -> Vec PrimArray s a
forall a b. Coercible a b => a -> b
coerce Vec s a
vec)
capacity :: forall m s a. (MonadPrim s m, Prim a)
=> Vec s a
-> m Word
capacity :: forall (m :: * -> *) s a.
(MonadPrim s m, Prim a) =>
Vec s a -> m Word
capacity Vec s a
vec = Vec PrimArray s a -> m Word
forall (m :: * -> *) (arr :: * -> *) s a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Vec arr s a -> m Word
GrowableVector.capacity (Vec s a -> Vec PrimArray s a
forall a b. Coercible a b => a -> b
coerce Vec s a
vec)
reserveExact :: forall m s a. (MonadPrim s m, Prim a)
=> Vec s a
-> Word
-> m ()
reserveExact :: forall (m :: * -> *) s a.
(MonadPrim s m, Prim a) =>
Vec s a -> Word -> m ()
reserveExact Vec s a
vec Word
additional = Vec PrimArray s a -> Word -> m ()
forall (m :: * -> *) (arr :: * -> *) s a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Vec arr s a -> Word -> m ()
GrowableVector.reserveExact (Vec s a -> Vec PrimArray s a
forall a b. Coercible a b => a -> b
coerce Vec s a
vec) Word
additional
reserve :: forall m s a. (MonadPrim s m, Prim a)
=> Vec s a
-> Word
-> m ()
reserve :: forall (m :: * -> *) s a.
(MonadPrim s m, Prim a) =>
Vec s a -> Word -> m ()
reserve Vec s a
vec Word
additional = Vec PrimArray s a -> Word -> m ()
forall (m :: * -> *) (arr :: * -> *) s a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Vec arr s a -> Word -> m ()
GrowableVector.reserve (Vec s a -> Vec PrimArray s a
forall a b. Coercible a b => a -> b
coerce Vec s a
vec) Word
additional
shrinkToFit :: forall m s a. (MonadPrim s m, Prim a)
=> Vec s a
-> m ()
shrinkToFit :: forall (m :: * -> *) s a.
(MonadPrim s m, Prim a) =>
Vec s a -> m ()
shrinkToFit Vec s a
vec = Vec PrimArray s a -> m ()
forall (m :: * -> *) (arr :: * -> *) s a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Vec arr s a -> m ()
GrowableVector.shrinkToFit (Vec s a -> Vec PrimArray s a
forall a b. Coercible a b => a -> b
coerce Vec s a
vec)
shrinkTo :: forall m s a. (MonadPrim s m, Prim a)
=> Vec s a
-> Word
-> m ()
shrinkTo :: forall (m :: * -> *) s a.
(MonadPrim s m, Prim a) =>
Vec s a -> Word -> m ()
shrinkTo Vec s a
vec Word
minCap = Vec PrimArray s a -> Word -> m ()
forall (m :: * -> *) (arr :: * -> *) s a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Vec arr s a -> Word -> m ()
GrowableVector.shrinkTo (Vec s a -> Vec PrimArray s a
forall a b. Coercible a b => a -> b
coerce Vec s a
vec) Word
minCap
unsafeRead :: forall m s a. (MonadPrim s m, Prim a)
=> Vec s a
-> Word
-> m a
unsafeRead :: forall (m :: * -> *) s a.
(MonadPrim s m, Prim a) =>
Vec s a -> Word -> m a
unsafeRead Vec s a
vec Word
n = Vec PrimArray 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
GrowableVector.unsafeRead (Vec s a -> Vec PrimArray s a
forall a b. Coercible a b => a -> b
coerce Vec s a
vec) Word
n
read :: forall m s a. (MonadPrim s m, Prim a)
=> Vec s a
-> Word
-> m (Maybe a)
read :: forall (m :: * -> *) s a.
(MonadPrim s m, Prim a) =>
Vec s a -> Word -> m (Maybe a)
read Vec s a
vec Word
n = Vec PrimArray s a -> Word -> m (Maybe a)
forall (m :: * -> *) (arr :: * -> *) s a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Vec arr s a -> Word -> m (Maybe a)
GrowableVector.read (Vec s a -> Vec PrimArray s a
forall a b. Coercible a b => a -> b
coerce Vec s a
vec) Word
n
unsafeWrite :: forall m s a. (MonadPrim s m, Prim a)
=> Vec s a
-> Word
-> a
-> m ()
unsafeWrite :: forall (m :: * -> *) s a.
(MonadPrim s m, Prim a) =>
Vec s a -> Word -> a -> m ()
unsafeWrite Vec s a
vec Word
n a
x = Vec PrimArray 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 ()
GrowableVector.unsafeWrite (Vec s a -> Vec PrimArray s a
forall a b. Coercible a b => a -> b
coerce Vec s a
vec) Word
n a
x
write :: forall m s a. (MonadPrim s m, Prim a)
=> Vec s a
-> Word
-> a
-> m (Maybe ())
write :: forall (m :: * -> *) s a.
(MonadPrim s m, Prim a) =>
Vec s a -> Word -> a -> m (Maybe ())
write Vec s a
vec Word
n a
x = Vec PrimArray s a -> Word -> a -> m (Maybe ())
forall (m :: * -> *) (arr :: * -> *) s a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Vec arr s a -> Word -> a -> m (Maybe ())
GrowableVector.write (Vec s a -> Vec PrimArray s a
forall a b. Coercible a b => a -> b
coerce Vec s a
vec) Word
n a
x
push :: forall m s a. (MonadPrim s m, Prim a)
=> Vec s a
-> a
-> m ()
push :: forall (m :: * -> *) s a.
(MonadPrim s m, Prim a) =>
Vec s a -> a -> m ()
push Vec s a
vec a
x = Vec PrimArray s a -> a -> m ()
forall (m :: * -> *) (arr :: * -> *) s a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Vec arr s a -> a -> m ()
GrowableVector.push (Vec s a -> Vec PrimArray s a
forall a b. Coercible a b => a -> b
coerce Vec s a
vec) a
x
pop :: forall m s a. (MonadPrim s m, Prim a)
=> Vec s a
-> m (Maybe a)
pop :: forall (m :: * -> *) s a.
(MonadPrim s m, Prim a) =>
Vec s a -> m (Maybe a)
pop Vec s a
vec = Vec PrimArray s a -> m (Maybe a)
forall (m :: * -> *) (arr :: * -> *) s a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Vec arr s a -> m (Maybe a)
GrowableVector.pop (Vec s a -> Vec PrimArray s a
forall a b. Coercible a b => a -> b
coerce Vec s a
vec)
extend :: forall m s a t. (MonadPrim s m, Prim a, Foldable t)
=> Vec s a
-> t a
-> m ()
extend :: forall (m :: * -> *) s a (t :: * -> *).
(MonadPrim s m, Prim a, Foldable t) =>
Vec s a -> t a -> m ()
extend Vec s a
vec t a
xs = Vec PrimArray 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 ()
GrowableVector.extend (Vec s a -> Vec PrimArray s a
forall a b. Coercible a b => a -> b
coerce Vec s a
vec) t a
xs
fromFoldable :: forall m s a t. (MonadPrim s m, Prim a, Foldable t)
=> t a
-> m (Vec s a)
fromFoldable :: forall (m :: * -> *) s a (t :: * -> *).
(MonadPrim s m, Prim a, Foldable t) =>
t a -> m (Vec s a)
fromFoldable t a
xs = (Vec PrimArray s a -> Vec s a)
-> m (Vec PrimArray s a) -> m (Vec s a)
forall a b. (a -> b) -> m a -> m b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Vec PrimArray s a -> Vec s a
forall a b. Coercible a b => a -> b
coerce (t a -> m (Vec PrimArray s a)
forall (m :: * -> *) (arr :: * -> *) s a (t :: * -> *).
(MonadPrim s m, Contiguous arr, Element arr a, Foldable t) =>
t a -> m (Vec arr s a)
GrowableVector.fromFoldable t a
xs)
toList :: forall m s a. (MonadPrim s m, Prim a)
=> Vec s a
-> m [a]
toList :: forall (m :: * -> *) s a.
(MonadPrim s m, Prim a) =>
Vec s a -> m [a]
toList Vec s a
vec = Vec PrimArray s a -> m [a]
forall (m :: * -> *) (arr :: * -> *) s a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Vec arr s a -> m [a]
GrowableVector.toList (Vec s a -> Vec PrimArray s a
forall a b. Coercible a b => a -> b
coerce Vec s a
vec)
toPrimitiveVector :: forall m s a. (MonadPrim s m, Prim a, Prim a)
=> Vec s a
-> m (PrimitiveVector.Vector a)
toPrimitiveVector :: forall (m :: * -> *) s a.
(MonadPrim s m, Prim a, Prim a) =>
Vec s a -> m (Vector a)
toPrimitiveVector Vec s a
vec = Vec PrimArray s a -> m (Vector a)
forall (m :: * -> *) (arr :: * -> *) s a.
(MonadPrim s m, Contiguous arr, Element arr a, Prim a) =>
Vec arr s a -> m (Vector a)
GrowableVector.toPrimitiveVector (Vec s a -> Vec PrimArray s a
forall a b. Coercible a b => a -> b
coerce Vec s a
vec)
toStorableVector :: forall m s a. (MonadPrim s m, Prim a, Storable a)
=> Vec s a
-> m (StorableVector.Vector a)
toStorableVector :: forall (m :: * -> *) s a.
(MonadPrim s m, Prim a, Storable a) =>
Vec s a -> m (Vector a)
toStorableVector Vec s a
vec = Vec PrimArray s a -> m (Vector a)
forall (m :: * -> *) (arr :: * -> *) s a.
(MonadPrim s m, Contiguous arr, Element arr a, Storable a) =>
Vec arr s a -> m (Vector a)
GrowableVector.toStorableVector (Vec s a -> Vec PrimArray s a
forall a b. Coercible a b => a -> b
coerce Vec s a
vec)
toLiftedVector :: forall m s a. (MonadPrim s m, Prim a)
=> Vec s a
-> m (LiftedVector.Vector a)
toLiftedVector :: forall (m :: * -> *) s a.
(MonadPrim s m, Prim a) =>
Vec s a -> m (Vector a)
toLiftedVector Vec s a
vec = Vec PrimArray s a -> m (Vector a)
forall (m :: * -> *) (arr :: * -> *) s a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
Vec arr s a -> m (Vector a)
GrowableVector.toLiftedVector (Vec s a -> Vec PrimArray s a
forall a b. Coercible a b => a -> b
coerce Vec s a
vec)
toPrimitiveVectorWith :: forall m s a b. (MonadPrim s m, Prim a, Prim a, Prim b)
=> (Word -> a -> m b)
-> Vec s a
-> m (PrimitiveVector.Vector b)
toPrimitiveVectorWith :: forall (m :: * -> *) s a b.
(MonadPrim s m, Prim a, Prim a, Prim b) =>
(Word -> a -> m b) -> Vec s a -> m (Vector b)
toPrimitiveVectorWith Word -> a -> m b
f Vec s a
vec = (Word -> a -> m b) -> Vec PrimArray s a -> m (Vector b)
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)
GrowableVector.toPrimitiveVectorWith Word -> a -> m b
f (Vec s a -> Vec PrimArray s a
forall a b. Coercible a b => a -> b
coerce Vec s a
vec)
toStorableVectorWith :: forall m s a b. (MonadPrim s m, Prim a, Storable b)
=> (Word -> a -> m b)
-> Vec s a
-> m (StorableVector.Vector b)
toStorableVectorWith :: forall (m :: * -> *) s a b.
(MonadPrim s m, Prim a, Storable b) =>
(Word -> a -> m b) -> Vec s a -> m (Vector b)
toStorableVectorWith Word -> a -> m b
f Vec s a
vec = (Word -> a -> m b) -> Vec PrimArray s a -> m (Vector b)
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)
GrowableVector.toStorableVectorWith Word -> a -> m b
f (Vec s a -> Vec PrimArray s a
forall a b. Coercible a b => a -> b
coerce Vec s a
vec)
toLiftedVectorWith :: forall m s a b. (MonadPrim s m, Prim a)
=> (Word -> a -> m b)
-> Vec s a
-> m (LiftedVector.Vector b)
toLiftedVectorWith :: forall (m :: * -> *) s a b.
(MonadPrim s m, Prim a) =>
(Word -> a -> m b) -> Vec s a -> m (Vector b)
toLiftedVectorWith Word -> a -> m b
f Vec s a
vec = (Word -> a -> m b) -> Vec PrimArray s a -> m (Vector b)
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)
GrowableVector.toLiftedVectorWith Word -> a -> m b
f (Vec s a -> Vec PrimArray s a
forall a b. Coercible a b => a -> b
coerce Vec s a
vec)
map :: forall m s a. (MonadPrim s m, Prim a)
=> (a -> a)
-> Vec s a
-> m ()
map :: forall (m :: * -> *) s a.
(MonadPrim s m, Prim a) =>
(a -> a) -> Vec s a -> m ()
map a -> a
f Vec s a
vec = (a -> a) -> Vec PrimArray s a -> m ()
forall (m :: * -> *) (arr :: * -> *) s a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
(a -> a) -> Vec arr s a -> m ()
GrowableVector.map a -> a
f (Vec s a -> Vec PrimArray s a
forall a b. Coercible a b => a -> b
coerce Vec s a
vec)
map' :: forall m s a. (MonadPrim s m, Prim a)
=> (a -> a)
-> Vec s a
-> m ()
map' :: forall (m :: * -> *) s a.
(MonadPrim s m, Prim a) =>
(a -> a) -> Vec s a -> m ()
map' a -> a
f Vec s a
vec = (a -> a) -> Vec PrimArray s a -> m ()
forall (m :: * -> *) (arr :: * -> *) s a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
(a -> a) -> Vec arr s a -> m ()
GrowableVector.map' a -> a
f (Vec s a -> Vec PrimArray s a
forall a b. Coercible a b => a -> b
coerce Vec s a
vec)
imap :: forall m s a. (MonadPrim s m, Prim a)
=> (Word -> a -> a)
-> Vec s a
-> m ()
imap :: forall (m :: * -> *) s a.
(MonadPrim s m, Prim a) =>
(Word -> a -> a) -> Vec s a -> m ()
imap Word -> a -> a
f Vec s a
vec = (Word -> a -> a) -> Vec PrimArray s a -> m ()
forall (m :: * -> *) (arr :: * -> *) s a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
(Word -> a -> a) -> Vec arr s a -> m ()
GrowableVector.imap Word -> a -> a
f (Vec s a -> Vec PrimArray s a
forall a b. Coercible a b => a -> b
coerce Vec s a
vec)
imap' :: forall m s a. (MonadPrim s m, Prim a)
=> (Word -> a -> a)
-> Vec s a
-> m ()
imap' :: forall (m :: * -> *) s a.
(MonadPrim s m, Prim a) =>
(Word -> a -> a) -> Vec s a -> m ()
imap' Word -> a -> a
f Vec s a
vec = (Word -> a -> a) -> Vec PrimArray s a -> m ()
forall (m :: * -> *) (arr :: * -> *) s a.
(MonadPrim s m, Contiguous arr, Element arr a) =>
(Word -> a -> a) -> Vec arr s a -> m ()
GrowableVector.imap' Word -> a -> a
f (Vec s a -> Vec PrimArray s a
forall a b. Coercible a b => a -> b
coerce Vec s a
vec)