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