{-# language
ImportQualifiedPost
, PackageImports
, ScopedTypeVariables
, TypeApplications
, TypeFamilies
#-}
module GrowableVector.Lifted.Small
( 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 SmallArray 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 SmallArray s a -> Vec s a)
-> m (Vec SmallArray 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 SmallArray s a -> Vec s a
forall a b. Coercible a b => a -> b
coerce m (Vec SmallArray 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 SmallArray s a -> Vec s a)
-> m (Vec SmallArray 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 SmallArray s a -> Vec s a
forall a b. Coercible a b => a -> b
coerce (Word -> m (Vec SmallArray 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 SmallArray 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 SmallArray 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 SmallArray 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 SmallArray 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 SmallArray 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 SmallArray 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 SmallArray 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 SmallArray 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 SmallArray 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 SmallArray 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 SmallArray 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 SmallArray 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 SmallArray 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 SmallArray 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 SmallArray 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 SmallArray 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 SmallArray 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 SmallArray 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 SmallArray 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 SmallArray 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 SmallArray 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 SmallArray 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 SmallArray 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 SmallArray 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 SmallArray 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 SmallArray 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 SmallArray s a -> Vec s a)
-> m (Vec SmallArray 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 SmallArray s a -> Vec s a
forall a b. Coercible a b => a -> b
coerce (t a -> m (Vec SmallArray 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 SmallArray 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 SmallArray 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 SmallArray 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 SmallArray 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 SmallArray 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 SmallArray 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 SmallArray 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 SmallArray 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 SmallArray 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 SmallArray 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 SmallArray 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 SmallArray 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 SmallArray 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 SmallArray 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 SmallArray 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 SmallArray 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 SmallArray 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 SmallArray 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 SmallArray 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 SmallArray 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 SmallArray 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 SmallArray s a
forall a b. Coercible a b => a -> b
coerce Vec s a
vec)