{-# LANGUAGE CPP #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeFamilies #-}
module Data.Vector.Grow.Storable(
GrowVector(..)
, IOGrowVector
, length
, null
, capacity
, new
, newSized
, slice
, thaw
, freeze
, ensure
, ensureAppend
, read
, write
, unsafeRead
, unsafeWrite
, pushBack
, unsafePushBack
) where
import Control.Monad
import Control.Monad.Primitive
import Data.Primitive.MutVar
import Data.Vector.Storable.Mutable (MVector, Storable)
import GHC.Generics
import Prelude hiding (length, null, read)
import qualified Data.Vector.Storable as V
import qualified Data.Vector.Storable.Mutable as M
data GrowVector s a = GrowVector {
GrowVector s a -> MutVar s (MVector s a)
growVector :: !(MutVar s (MVector s a))
, GrowVector s a -> MutVar s Int
growVectorLength :: !(MutVar s Int)
} deriving ((forall x. GrowVector s a -> Rep (GrowVector s a) x)
-> (forall x. Rep (GrowVector s a) x -> GrowVector s a)
-> Generic (GrowVector s a)
forall x. Rep (GrowVector s a) x -> GrowVector s a
forall x. GrowVector s a -> Rep (GrowVector s a) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall s a x. Rep (GrowVector s a) x -> GrowVector s a
forall s a x. GrowVector s a -> Rep (GrowVector s a) x
$cto :: forall s a x. Rep (GrowVector s a) x -> GrowVector s a
$cfrom :: forall s a x. GrowVector s a -> Rep (GrowVector s a) x
Generic)
type IOGrowVector a = GrowVector RealWorld a
capacity :: (Storable a, PrimMonad m) => GrowVector (PrimState m) a -> m Int
capacity :: GrowVector (PrimState m) a -> m Int
capacity GrowVector (PrimState m) a
v = do
MVector (PrimState m) a
mv <- MutVar (PrimState m) (MVector (PrimState m) a)
-> m (MVector (PrimState m) a)
forall (m :: * -> *) a.
PrimMonad m =>
MutVar (PrimState m) a -> m a
readMutVar (MutVar (PrimState m) (MVector (PrimState m) a)
-> m (MVector (PrimState m) a))
-> MutVar (PrimState m) (MVector (PrimState m) a)
-> m (MVector (PrimState m) a)
forall a b. (a -> b) -> a -> b
$ GrowVector (PrimState m) a
-> MutVar (PrimState m) (MVector (PrimState m) a)
forall s a. GrowVector s a -> MutVar s (MVector s a)
growVector GrowVector (PrimState m) a
v
Int -> m Int
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Int -> m Int) -> Int -> m Int
forall a b. (a -> b) -> a -> b
$ MVector (PrimState m) a -> Int
forall a s. Storable a => MVector s a -> Int
M.length MVector (PrimState m) a
mv
{-# INLINE capacity #-}
length :: (Storable a, PrimMonad m) => GrowVector (PrimState m) a -> m Int
length :: GrowVector (PrimState m) a -> m Int
length GrowVector (PrimState m) a
v = MutVar (PrimState m) Int -> m Int
forall (m :: * -> *) a.
PrimMonad m =>
MutVar (PrimState m) a -> m a
readMutVar (MutVar (PrimState m) Int -> m Int)
-> MutVar (PrimState m) Int -> m Int
forall a b. (a -> b) -> a -> b
$ GrowVector (PrimState m) a -> MutVar (PrimState m) Int
forall s a. GrowVector s a -> MutVar s Int
growVectorLength GrowVector (PrimState m) a
v
{-# INLINE length #-}
null :: (Storable a, PrimMonad m) => GrowVector (PrimState m) a -> m Bool
null :: GrowVector (PrimState m) a -> m Bool
null GrowVector (PrimState m) a
v = (Int -> Bool) -> m Int -> m Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
0) (m Int -> m Bool) -> m Int -> m Bool
forall a b. (a -> b) -> a -> b
$ GrowVector (PrimState m) a -> m Int
forall a (m :: * -> *).
(Storable a, PrimMonad m) =>
GrowVector (PrimState m) a -> m Int
length GrowVector (PrimState m) a
v
{-# INLINE null #-}
new :: (Storable a, PrimMonad m) => Int -> m (GrowVector (PrimState m) a)
new :: Int -> m (GrowVector (PrimState m) a)
new = Int -> Int -> m (GrowVector (PrimState m) a)
forall a (m :: * -> *).
(Storable a, PrimMonad m) =>
Int -> Int -> m (GrowVector (PrimState m) a)
newSized Int
0
{-# INLINE new #-}
newSized :: (Storable a, PrimMonad m) => Int -> Int -> m (GrowVector (PrimState m) a)
newSized :: Int -> Int -> m (GrowVector (PrimState m) a)
newSized Int
n Int
cap = MutVar (PrimState m) (MVector (PrimState m) a)
-> MutVar (PrimState m) Int -> GrowVector (PrimState m) a
forall s a.
MutVar s (MVector s a) -> MutVar s Int -> GrowVector s a
GrowVector (MutVar (PrimState m) (MVector (PrimState m) a)
-> MutVar (PrimState m) Int -> GrowVector (PrimState m) a)
-> m (MutVar (PrimState m) (MVector (PrimState m) a))
-> m (MutVar (PrimState m) Int -> GrowVector (PrimState m) a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (MVector (PrimState m) a
-> m (MutVar (PrimState m) (MVector (PrimState m) a))
forall (m :: * -> *) a.
PrimMonad m =>
a -> m (MutVar (PrimState m) a)
newMutVar (MVector (PrimState m) a
-> m (MutVar (PrimState m) (MVector (PrimState m) a)))
-> m (MVector (PrimState m) a)
-> m (MutVar (PrimState m) (MVector (PrimState m) a))
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Int -> m (MVector (PrimState m) a)
forall (m :: * -> *) a.
(PrimMonad m, Storable a) =>
Int -> m (MVector (PrimState m) a)
M.new Int
cap) m (MutVar (PrimState m) Int -> GrowVector (PrimState m) a)
-> m (MutVar (PrimState m) Int) -> m (GrowVector (PrimState m) a)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Int -> m (MutVar (PrimState m) Int)
forall (m :: * -> *) a.
PrimMonad m =>
a -> m (MutVar (PrimState m) a)
newMutVar Int
n
{-# INLINABLE newSized #-}
slice :: (Storable a, PrimMonad m)
=> Int
-> Int
-> GrowVector (PrimState m) a
-> m (GrowVector (PrimState m) a)
slice :: Int
-> Int
-> GrowVector (PrimState m) a
-> m (GrowVector (PrimState m) a)
slice Int
i Int
n GrowVector (PrimState m) a
v = do
MutVar (PrimState m) Int
newSize <- Int -> m (MutVar (PrimState m) Int)
forall (m :: * -> *) a.
PrimMonad m =>
a -> m (MutVar (PrimState m) a)
newMutVar Int
n
MVector (PrimState m) a
mv <- MutVar (PrimState m) (MVector (PrimState m) a)
-> m (MVector (PrimState m) a)
forall (m :: * -> *) a.
PrimMonad m =>
MutVar (PrimState m) a -> m a
readMutVar (MutVar (PrimState m) (MVector (PrimState m) a)
-> m (MVector (PrimState m) a))
-> MutVar (PrimState m) (MVector (PrimState m) a)
-> m (MVector (PrimState m) a)
forall a b. (a -> b) -> a -> b
$ GrowVector (PrimState m) a
-> MutVar (PrimState m) (MVector (PrimState m) a)
forall s a. GrowVector s a -> MutVar s (MVector s a)
growVector GrowVector (PrimState m) a
v
MutVar (PrimState m) (MVector (PrimState m) a)
newVec <- MVector (PrimState m) a
-> m (MutVar (PrimState m) (MVector (PrimState m) a))
forall (m :: * -> *) a.
PrimMonad m =>
a -> m (MutVar (PrimState m) a)
newMutVar (MVector (PrimState m) a
-> m (MutVar (PrimState m) (MVector (PrimState m) a)))
-> MVector (PrimState m) a
-> m (MutVar (PrimState m) (MVector (PrimState m) a))
forall a b. (a -> b) -> a -> b
$! Int -> Int -> MVector (PrimState m) a -> MVector (PrimState m) a
forall a s. Storable a => Int -> Int -> MVector s a -> MVector s a
M.slice Int
i Int
n MVector (PrimState m) a
mv
GrowVector (PrimState m) a -> m (GrowVector (PrimState m) a)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (GrowVector (PrimState m) a -> m (GrowVector (PrimState m) a))
-> GrowVector (PrimState m) a -> m (GrowVector (PrimState m) a)
forall a b. (a -> b) -> a -> b
$! MutVar (PrimState m) (MVector (PrimState m) a)
-> MutVar (PrimState m) Int -> GrowVector (PrimState m) a
forall s a.
MutVar s (MVector s a) -> MutVar s Int -> GrowVector s a
GrowVector MutVar (PrimState m) (MVector (PrimState m) a)
newVec MutVar (PrimState m) Int
newSize
{-# INLINABLE slice #-}
thaw :: (Storable a, PrimMonad m)
=> V.Vector a
-> m (GrowVector (PrimState m) a)
thaw :: Vector a -> m (GrowVector (PrimState m) a)
thaw Vector a
u = do
MutVar (PrimState m) (MVector (PrimState m) a)
mv <- MVector (PrimState m) a
-> m (MutVar (PrimState m) (MVector (PrimState m) a))
forall (m :: * -> *) a.
PrimMonad m =>
a -> m (MutVar (PrimState m) a)
newMutVar (MVector (PrimState m) a
-> m (MutVar (PrimState m) (MVector (PrimState m) a)))
-> m (MVector (PrimState m) a)
-> m (MutVar (PrimState m) (MVector (PrimState m) a))
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Vector a -> m (MVector (PrimState m) a)
forall a (m :: * -> *).
(Storable a, PrimMonad m) =>
Vector a -> m (MVector (PrimState m) a)
V.thaw Vector a
u
MutVar (PrimState m) Int
lv <- Int -> m (MutVar (PrimState m) Int)
forall (m :: * -> *) a.
PrimMonad m =>
a -> m (MutVar (PrimState m) a)
newMutVar (Vector a -> Int
forall a. Storable a => Vector a -> Int
V.length Vector a
u)
GrowVector (PrimState m) a -> m (GrowVector (PrimState m) a)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (GrowVector (PrimState m) a -> m (GrowVector (PrimState m) a))
-> GrowVector (PrimState m) a -> m (GrowVector (PrimState m) a)
forall a b. (a -> b) -> a -> b
$ MutVar (PrimState m) (MVector (PrimState m) a)
-> MutVar (PrimState m) Int -> GrowVector (PrimState m) a
forall s a.
MutVar s (MVector s a) -> MutVar s Int -> GrowVector s a
GrowVector MutVar (PrimState m) (MVector (PrimState m) a)
mv MutVar (PrimState m) Int
lv
{-# INLINABLE thaw #-}
freeze :: (Storable a, PrimMonad m)
=> GrowVector (PrimState m) a
-> m (V.Vector a)
freeze :: GrowVector (PrimState m) a -> m (Vector a)
freeze GrowVector (PrimState m) a
v = do
Int
n <- GrowVector (PrimState m) a -> m Int
forall a (m :: * -> *).
(Storable a, PrimMonad m) =>
GrowVector (PrimState m) a -> m Int
length GrowVector (PrimState m) a
v
MVector (PrimState m) a
mv <- MutVar (PrimState m) (MVector (PrimState m) a)
-> m (MVector (PrimState m) a)
forall (m :: * -> *) a.
PrimMonad m =>
MutVar (PrimState m) a -> m a
readMutVar (MutVar (PrimState m) (MVector (PrimState m) a)
-> m (MVector (PrimState m) a))
-> MutVar (PrimState m) (MVector (PrimState m) a)
-> m (MVector (PrimState m) a)
forall a b. (a -> b) -> a -> b
$ GrowVector (PrimState m) a
-> MutVar (PrimState m) (MVector (PrimState m) a)
forall s a. GrowVector s a -> MutVar s (MVector s a)
growVector GrowVector (PrimState m) a
v
MVector (PrimState m) a -> m (Vector a)
forall a (m :: * -> *).
(Storable a, PrimMonad m) =>
MVector (PrimState m) a -> m (Vector a)
V.freeze (MVector (PrimState m) a -> m (Vector a))
-> MVector (PrimState m) a -> m (Vector a)
forall a b. (a -> b) -> a -> b
$ Int -> MVector (PrimState m) a -> MVector (PrimState m) a
forall a s. Storable a => Int -> MVector s a -> MVector s a
M.take Int
n MVector (PrimState m) a
mv
{-# INLINABLE freeze #-}
ensure :: (Storable a, PrimMonad m)
=> GrowVector (PrimState m) a
-> Int
-> m ()
ensure :: GrowVector (PrimState m) a -> Int -> m ()
ensure GrowVector (PrimState m) a
v Int
n = do
Int
c <- GrowVector (PrimState m) a -> m Int
forall a (m :: * -> *).
(Storable a, PrimMonad m) =>
GrowVector (PrimState m) a -> m Int
capacity GrowVector (PrimState m) a
v
Bool -> m () -> m ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (Int
c Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
n) (m () -> m ()) -> m () -> m ()
forall a b. (a -> b) -> a -> b
$ do
MVector (PrimState m) a
mv <- MutVar (PrimState m) (MVector (PrimState m) a)
-> m (MVector (PrimState m) a)
forall (m :: * -> *) a.
PrimMonad m =>
MutVar (PrimState m) a -> m a
readMutVar (MutVar (PrimState m) (MVector (PrimState m) a)
-> m (MVector (PrimState m) a))
-> MutVar (PrimState m) (MVector (PrimState m) a)
-> m (MVector (PrimState m) a)
forall a b. (a -> b) -> a -> b
$ GrowVector (PrimState m) a
-> MutVar (PrimState m) (MVector (PrimState m) a)
forall s a. GrowVector s a -> MutVar s (MVector s a)
growVector GrowVector (PrimState m) a
v
MutVar (PrimState m) (MVector (PrimState m) a)
-> MVector (PrimState m) a -> m ()
forall (m :: * -> *) a.
PrimMonad m =>
MutVar (PrimState m) a -> a -> m ()
writeMutVar (GrowVector (PrimState m) a
-> MutVar (PrimState m) (MVector (PrimState m) a)
forall s a. GrowVector s a -> MutVar s (MVector s a)
growVector GrowVector (PrimState m) a
v) (MVector (PrimState m) a -> m ())
-> m (MVector (PrimState m) a) -> m ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< MVector (PrimState m) a -> Int -> m (MVector (PrimState m) a)
forall (m :: * -> *) a.
(PrimMonad m, Storable a) =>
MVector (PrimState m) a -> Int -> m (MVector (PrimState m) a)
M.grow MVector (PrimState m) a
mv (Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
c)
{-# INLINABLE ensure #-}
ensureAppend :: (Storable a, PrimMonad m)
=> GrowVector (PrimState m) a
-> Int
-> m ()
ensureAppend :: GrowVector (PrimState m) a -> Int -> m ()
ensureAppend GrowVector (PrimState m) a
v Int
i = do
Int
n <- MutVar (PrimState m) Int -> m Int
forall (m :: * -> *) a.
PrimMonad m =>
MutVar (PrimState m) a -> m a
readMutVar (MutVar (PrimState m) Int -> m Int)
-> MutVar (PrimState m) Int -> m Int
forall a b. (a -> b) -> a -> b
$ GrowVector (PrimState m) a -> MutVar (PrimState m) Int
forall s a. GrowVector s a -> MutVar s Int
growVectorLength GrowVector (PrimState m) a
v
MVector (PrimState m) a
mv <- MutVar (PrimState m) (MVector (PrimState m) a)
-> m (MVector (PrimState m) a)
forall (m :: * -> *) a.
PrimMonad m =>
MutVar (PrimState m) a -> m a
readMutVar (MutVar (PrimState m) (MVector (PrimState m) a)
-> m (MVector (PrimState m) a))
-> MutVar (PrimState m) (MVector (PrimState m) a)
-> m (MVector (PrimState m) a)
forall a b. (a -> b) -> a -> b
$ GrowVector (PrimState m) a
-> MutVar (PrimState m) (MVector (PrimState m) a)
forall s a. GrowVector s a -> MutVar s (MVector s a)
growVector GrowVector (PrimState m) a
v
let c :: Int
c = MVector (PrimState m) a -> Int
forall a s. Storable a => MVector s a -> Int
M.length MVector (PrimState m) a
mv
Bool -> m () -> m ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (Int
c Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
i) (m () -> m ()) -> m () -> m ()
forall a b. (a -> b) -> a -> b
$ do
let growFactor :: Double
growFactor = Double
1.5
newCap :: Int
newCap = Double -> Int
forall a b. (RealFrac a, Integral b) => a -> b
ceiling (Double -> Int) -> Double -> Int
forall a b. (a -> b) -> a -> b
$ Double -> Double -> Double
forall a. Ord a => a -> a -> a
max (Double
growFactor Double -> Double -> Double
forall a. Num a => a -> a -> a
* Int -> Double
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
c) (Int -> Double
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
c Double -> Double -> Double
forall a. Num a => a -> a -> a
+ Double
growFactor Double -> Double -> Double
forall a. Num a => a -> a -> a
* Int -> Double
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
c))
MutVar (PrimState m) (MVector (PrimState m) a)
-> MVector (PrimState m) a -> m ()
forall (m :: * -> *) a.
PrimMonad m =>
MutVar (PrimState m) a -> a -> m ()
writeMutVar (GrowVector (PrimState m) a
-> MutVar (PrimState m) (MVector (PrimState m) a)
forall s a. GrowVector s a -> MutVar s (MVector s a)
growVector GrowVector (PrimState m) a
v) (MVector (PrimState m) a -> m ())
-> m (MVector (PrimState m) a) -> m ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< MVector (PrimState m) a -> Int -> m (MVector (PrimState m) a)
forall (m :: * -> *) a.
(PrimMonad m, Storable a) =>
MVector (PrimState m) a -> Int -> m (MVector (PrimState m) a)
M.grow MVector (PrimState m) a
mv (Int
newCap Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
c)
{-# INLINABLE ensureAppend #-}
read :: (Storable a, PrimMonad m)
=> GrowVector (PrimState m) a
-> Int
-> m a
read :: GrowVector (PrimState m) a -> Int -> m a
read GrowVector (PrimState m) a
v Int
i = do
Int
n <- MutVar (PrimState m) Int -> m Int
forall (m :: * -> *) a.
PrimMonad m =>
MutVar (PrimState m) a -> m a
readMutVar (MutVar (PrimState m) Int -> m Int)
-> MutVar (PrimState m) Int -> m Int
forall a b. (a -> b) -> a -> b
$ GrowVector (PrimState m) a -> MutVar (PrimState m) Int
forall s a. GrowVector s a -> MutVar s Int
growVectorLength GrowVector (PrimState m) a
v
#ifndef LIQUID
Bool -> m () -> m ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Int
i Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
0 Bool -> Bool -> Bool
|| Int
i Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
n) (m () -> m ()) -> m () -> m ()
forall a b. (a -> b) -> a -> b
$ [Char] -> m ()
forall a. HasCallStack => [Char] -> a
error ([Char] -> m ()) -> [Char] -> m ()
forall a b. (a -> b) -> a -> b
$ [Char]
"GrowVector.read: index " [Char] -> [Char] -> [Char]
forall a. Semigroup a => a -> a -> a
<> Int -> [Char]
forall a. Show a => a -> [Char]
show Int
i [Char] -> [Char] -> [Char]
forall a. Semigroup a => a -> a -> a
<> [Char]
" is out bounds " [Char] -> [Char] -> [Char]
forall a. Semigroup a => a -> a -> a
<> Int -> [Char]
forall a. Show a => a -> [Char]
show Int
n
#endif
MVector (PrimState m) a
mv <- MutVar (PrimState m) (MVector (PrimState m) a)
-> m (MVector (PrimState m) a)
forall (m :: * -> *) a.
PrimMonad m =>
MutVar (PrimState m) a -> m a
readMutVar (MutVar (PrimState m) (MVector (PrimState m) a)
-> m (MVector (PrimState m) a))
-> MutVar (PrimState m) (MVector (PrimState m) a)
-> m (MVector (PrimState m) a)
forall a b. (a -> b) -> a -> b
$ GrowVector (PrimState m) a
-> MutVar (PrimState m) (MVector (PrimState m) a)
forall s a. GrowVector s a -> MutVar s (MVector s a)
growVector GrowVector (PrimState m) a
v
MVector (PrimState m) a -> Int -> m a
forall (m :: * -> *) a.
(PrimMonad m, Storable a) =>
MVector (PrimState m) a -> Int -> m a
M.unsafeRead MVector (PrimState m) a
mv Int
i
{-# INLINABLE read #-}
unsafeRead :: (Storable a, PrimMonad m)
=> GrowVector (PrimState m) a
-> Int
-> m a
unsafeRead :: GrowVector (PrimState m) a -> Int -> m a
unsafeRead GrowVector (PrimState m) a
v Int
i = do
MVector (PrimState m) a
mv <- MutVar (PrimState m) (MVector (PrimState m) a)
-> m (MVector (PrimState m) a)
forall (m :: * -> *) a.
PrimMonad m =>
MutVar (PrimState m) a -> m a
readMutVar (MutVar (PrimState m) (MVector (PrimState m) a)
-> m (MVector (PrimState m) a))
-> MutVar (PrimState m) (MVector (PrimState m) a)
-> m (MVector (PrimState m) a)
forall a b. (a -> b) -> a -> b
$ GrowVector (PrimState m) a
-> MutVar (PrimState m) (MVector (PrimState m) a)
forall s a. GrowVector s a -> MutVar s (MVector s a)
growVector GrowVector (PrimState m) a
v
MVector (PrimState m) a -> Int -> m a
forall (m :: * -> *) a.
(PrimMonad m, Storable a) =>
MVector (PrimState m) a -> Int -> m a
M.unsafeRead MVector (PrimState m) a
mv Int
i
{-# INLINABLE unsafeRead #-}
write :: (Storable a, PrimMonad m)
=> GrowVector (PrimState m) a
-> Int
-> a
-> m ()
write :: GrowVector (PrimState m) a -> Int -> a -> m ()
write GrowVector (PrimState m) a
v Int
i a
a = do
Int
n <- MutVar (PrimState m) Int -> m Int
forall (m :: * -> *) a.
PrimMonad m =>
MutVar (PrimState m) a -> m a
readMutVar (MutVar (PrimState m) Int -> m Int)
-> MutVar (PrimState m) Int -> m Int
forall a b. (a -> b) -> a -> b
$ GrowVector (PrimState m) a -> MutVar (PrimState m) Int
forall s a. GrowVector s a -> MutVar s Int
growVectorLength GrowVector (PrimState m) a
v
#ifndef LIQUID
Bool -> m () -> m ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Int
i Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
0 Bool -> Bool -> Bool
|| Int
i Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
n) (m () -> m ()) -> m () -> m ()
forall a b. (a -> b) -> a -> b
$ [Char] -> m ()
forall a. HasCallStack => [Char] -> a
error ([Char] -> m ()) -> [Char] -> m ()
forall a b. (a -> b) -> a -> b
$ [Char]
"GrowVector.write: index " [Char] -> [Char] -> [Char]
forall a. Semigroup a => a -> a -> a
<> Int -> [Char]
forall a. Show a => a -> [Char]
show Int
i [Char] -> [Char] -> [Char]
forall a. Semigroup a => a -> a -> a
<> [Char]
" is out bounds " [Char] -> [Char] -> [Char]
forall a. Semigroup a => a -> a -> a
<> Int -> [Char]
forall a. Show a => a -> [Char]
show Int
n
#endif
MVector (PrimState m) a
mv <- MutVar (PrimState m) (MVector (PrimState m) a)
-> m (MVector (PrimState m) a)
forall (m :: * -> *) a.
PrimMonad m =>
MutVar (PrimState m) a -> m a
readMutVar (MutVar (PrimState m) (MVector (PrimState m) a)
-> m (MVector (PrimState m) a))
-> MutVar (PrimState m) (MVector (PrimState m) a)
-> m (MVector (PrimState m) a)
forall a b. (a -> b) -> a -> b
$ GrowVector (PrimState m) a
-> MutVar (PrimState m) (MVector (PrimState m) a)
forall s a. GrowVector s a -> MutVar s (MVector s a)
growVector GrowVector (PrimState m) a
v
MVector (PrimState m) a -> Int -> a -> m ()
forall (m :: * -> *) a.
(PrimMonad m, Storable a) =>
MVector (PrimState m) a -> Int -> a -> m ()
M.unsafeWrite MVector (PrimState m) a
mv Int
i a
a
{-# INLINABLE write #-}
unsafeWrite :: (Storable a, PrimMonad m)
=> GrowVector (PrimState m) a
-> Int
-> a
-> m ()
unsafeWrite :: GrowVector (PrimState m) a -> Int -> a -> m ()
unsafeWrite GrowVector (PrimState m) a
v Int
i a
a = do
MVector (PrimState m) a
mv <- MutVar (PrimState m) (MVector (PrimState m) a)
-> m (MVector (PrimState m) a)
forall (m :: * -> *) a.
PrimMonad m =>
MutVar (PrimState m) a -> m a
readMutVar (MutVar (PrimState m) (MVector (PrimState m) a)
-> m (MVector (PrimState m) a))
-> MutVar (PrimState m) (MVector (PrimState m) a)
-> m (MVector (PrimState m) a)
forall a b. (a -> b) -> a -> b
$ GrowVector (PrimState m) a
-> MutVar (PrimState m) (MVector (PrimState m) a)
forall s a. GrowVector s a -> MutVar s (MVector s a)
growVector GrowVector (PrimState m) a
v
MVector (PrimState m) a -> Int -> a -> m ()
forall (m :: * -> *) a.
(PrimMonad m, Storable a) =>
MVector (PrimState m) a -> Int -> a -> m ()
M.unsafeWrite MVector (PrimState m) a
mv Int
i a
a
{-# INLINABLE unsafeWrite #-}
pushBack :: (Storable a, PrimMonad m)
=> GrowVector (PrimState m) a
-> a
-> m ()
pushBack :: GrowVector (PrimState m) a -> a -> m ()
pushBack GrowVector (PrimState m) a
v a
a = do
GrowVector (PrimState m) a -> Int -> m ()
forall a (m :: * -> *).
(Storable a, PrimMonad m) =>
GrowVector (PrimState m) a -> Int -> m ()
ensureAppend GrowVector (PrimState m) a
v Int
1
GrowVector (PrimState m) a -> a -> m ()
forall a (m :: * -> *).
(Storable a, PrimMonad m) =>
GrowVector (PrimState m) a -> a -> m ()
unsafePushBack GrowVector (PrimState m) a
v a
a
{-# INLINABLE pushBack #-}
unsafePushBack :: (Storable a, PrimMonad m)
=> GrowVector (PrimState m) a
-> a
-> m ()
unsafePushBack :: GrowVector (PrimState m) a -> a -> m ()
unsafePushBack GrowVector (PrimState m) a
v a
a = do
Int
n <- MutVar (PrimState m) Int -> m Int
forall (m :: * -> *) a.
PrimMonad m =>
MutVar (PrimState m) a -> m a
readMutVar (MutVar (PrimState m) Int -> m Int)
-> MutVar (PrimState m) Int -> m Int
forall a b. (a -> b) -> a -> b
$ GrowVector (PrimState m) a -> MutVar (PrimState m) Int
forall s a. GrowVector s a -> MutVar s Int
growVectorLength GrowVector (PrimState m) a
v
MVector (PrimState m) a
mv <- MutVar (PrimState m) (MVector (PrimState m) a)
-> m (MVector (PrimState m) a)
forall (m :: * -> *) a.
PrimMonad m =>
MutVar (PrimState m) a -> m a
readMutVar (MutVar (PrimState m) (MVector (PrimState m) a)
-> m (MVector (PrimState m) a))
-> MutVar (PrimState m) (MVector (PrimState m) a)
-> m (MVector (PrimState m) a)
forall a b. (a -> b) -> a -> b
$ GrowVector (PrimState m) a
-> MutVar (PrimState m) (MVector (PrimState m) a)
forall s a. GrowVector s a -> MutVar s (MVector s a)
growVector GrowVector (PrimState m) a
v
MVector (PrimState m) a -> Int -> a -> m ()
forall (m :: * -> *) a.
(PrimMonad m, Storable a) =>
MVector (PrimState m) a -> Int -> a -> m ()
M.write MVector (PrimState m) a
mv Int
n a
a
MutVar (PrimState m) Int -> Int -> m ()
forall (m :: * -> *) a.
PrimMonad m =>
MutVar (PrimState m) a -> a -> m ()
writeMutVar (GrowVector (PrimState m) a -> MutVar (PrimState m) Int
forall s a. GrowVector s a -> MutVar s Int
growVectorLength GrowVector (PrimState m) a
v) (Int
nInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1)
{-# INLINABLE unsafePushBack #-}