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