{-# LANGUAGE NoImplicitPrelude #-}
module RIO.Deque
(
Deque
, UDeque
, SDeque
, BDeque
, newDeque
, getDequeSize
, popFrontDeque
, popBackDeque
, pushFrontDeque
, pushBackDeque
, foldlDeque
, foldrDeque
, dequeToList
, dequeToVector
, freezeDeque
, asUDeque
, asSDeque
, asBDeque
) where
import RIO.Prelude.Reexports
import Control.Exception (assert)
import Control.Monad (liftM)
import qualified Data.Vector.Generic as VG
import qualified Data.Vector.Generic.Mutable as V
import qualified Data.Vector.Mutable as B
import qualified Data.Vector.Storable.Mutable as S
import qualified Data.Vector.Unboxed.Mutable as U
import Data.Primitive.MutVar
data DequeState v s a = DequeState
!(v s a)
{-# UNPACK #-} !Int
{-# UNPACK #-} !Int
newtype Deque v s a = Deque (MutVar s (DequeState v s a))
type UDeque = Deque U.MVector
type SDeque = Deque S.MVector
type BDeque = Deque B.MVector
asUDeque :: UDeque s a -> UDeque s a
asUDeque :: forall s a. UDeque s a -> UDeque s a
asUDeque = forall a. a -> a
id
asSDeque :: SDeque s a -> SDeque s a
asSDeque :: forall s a. SDeque s a -> SDeque s a
asSDeque = forall a. a -> a
id
asBDeque :: BDeque s a -> BDeque s a
asBDeque :: forall s a. BDeque s a -> BDeque s a
asBDeque = forall a. a -> a
id
newDeque
:: (V.MVector v a, PrimMonad m)
=> m (Deque v (PrimState m) a)
newDeque :: forall (v :: * -> * -> *) a (m :: * -> *).
(MVector v a, PrimMonad m) =>
m (Deque v (PrimState m) a)
newDeque = do
v (PrimState m) a
v <- forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
Int -> m (v (PrimState m) a)
V.new Int
baseSize
forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM forall (v :: * -> * -> *) s a.
MutVar s (DequeState v s a) -> Deque v s a
Deque forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *) a.
PrimMonad m =>
a -> m (MutVar (PrimState m) a)
newMutVar (forall (v :: * -> * -> *) s a.
v s a -> Int -> Int -> DequeState v s a
DequeState v (PrimState m) a
v Int
0 Int
0)
where
baseSize :: Int
baseSize = Int
32
{-# INLINE newDeque #-}
getDequeSize :: PrimMonad m => Deque v (PrimState m) a -> m Int
getDequeSize :: forall (m :: * -> *) (v :: * -> * -> *) a.
PrimMonad m =>
Deque v (PrimState m) a -> m Int
getDequeSize (Deque MutVar (PrimState m) (DequeState v (PrimState m) a)
var) = do
DequeState v (PrimState m) a
_ Int
_ Int
size <- forall (m :: * -> *) a.
PrimMonad m =>
MutVar (PrimState m) a -> m a
readMutVar MutVar (PrimState m) (DequeState v (PrimState m) a)
var
forall (f :: * -> *) a. Applicative f => a -> f a
pure Int
size
{-# INLINE getDequeSize #-}
popFrontDeque
:: (V.MVector v a, PrimMonad m)
=> Deque v (PrimState m) a
-> m (Maybe a)
popFrontDeque :: forall (v :: * -> * -> *) a (m :: * -> *).
(MVector v a, PrimMonad m) =>
Deque v (PrimState m) a -> m (Maybe a)
popFrontDeque (Deque MutVar (PrimState m) (DequeState v (PrimState m) a)
var) = do
DequeState v (PrimState m) a
v Int
start Int
size <- forall (m :: * -> *) a.
PrimMonad m =>
MutVar (PrimState m) a -> m a
readMutVar MutVar (PrimState m) (DequeState v (PrimState m) a)
var
if Int
size forall a. Eq a => a -> a -> Bool
== Int
0
then forall (m :: * -> *) a. Monad m => a -> m a
return forall a. Maybe a
Nothing
else do
a
x <- forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Int -> m a
V.unsafeRead v (PrimState m) a
v Int
start
let start' :: Int
start' = Int
start forall a. Num a => a -> a -> a
+ Int
1
start'' :: Int
start''
| Int
start' forall a. Ord a => a -> a -> Bool
>= forall (v :: * -> * -> *) a s. MVector v a => v s a -> Int
V.length v (PrimState m) a
v = Int
0
| Bool
otherwise = Int
start'
forall (m :: * -> *) a.
PrimMonad m =>
MutVar (PrimState m) a -> a -> m ()
writeMutVar MutVar (PrimState m) (DequeState v (PrimState m) a)
var forall a b. (a -> b) -> a -> b
$! forall (v :: * -> * -> *) s a.
v s a -> Int -> Int -> DequeState v s a
DequeState v (PrimState m) a
v Int
start'' (Int
size forall a. Num a => a -> a -> a
- Int
1)
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$! forall a. a -> Maybe a
Just a
x
{-# INLINE popFrontDeque #-}
popBackDeque
:: (V.MVector v a, PrimMonad m)
=> Deque v (PrimState m) a
-> m (Maybe a)
popBackDeque :: forall (v :: * -> * -> *) a (m :: * -> *).
(MVector v a, PrimMonad m) =>
Deque v (PrimState m) a -> m (Maybe a)
popBackDeque (Deque MutVar (PrimState m) (DequeState v (PrimState m) a)
var) = do
DequeState v (PrimState m) a
v Int
start Int
size <- forall (m :: * -> *) a.
PrimMonad m =>
MutVar (PrimState m) a -> m a
readMutVar MutVar (PrimState m) (DequeState v (PrimState m) a)
var
if Int
size forall a. Eq a => a -> a -> Bool
== Int
0
then forall (m :: * -> *) a. Monad m => a -> m a
return forall a. Maybe a
Nothing
else do
let size' :: Int
size' = Int
size forall a. Num a => a -> a -> a
- Int
1
end :: Int
end = Int
start forall a. Num a => a -> a -> a
+ Int
size'
end' :: Int
end'
| Int
end forall a. Ord a => a -> a -> Bool
>= forall (v :: * -> * -> *) a s. MVector v a => v s a -> Int
V.length v (PrimState m) a
v = Int
end forall a. Num a => a -> a -> a
- forall (v :: * -> * -> *) a s. MVector v a => v s a -> Int
V.length v (PrimState m) a
v
| Bool
otherwise = Int
end
a
x <- forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Int -> m a
V.unsafeRead v (PrimState m) a
v Int
end'
forall (m :: * -> *) a.
PrimMonad m =>
MutVar (PrimState m) a -> a -> m ()
writeMutVar MutVar (PrimState m) (DequeState v (PrimState m) a)
var forall a b. (a -> b) -> a -> b
$! forall (v :: * -> * -> *) s a.
v s a -> Int -> Int -> DequeState v s a
DequeState v (PrimState m) a
v Int
start Int
size'
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$! forall a. a -> Maybe a
Just a
x
{-# INLINE popBackDeque #-}
pushFrontDeque
:: (V.MVector v a, PrimMonad m)
=> Deque v (PrimState m) a
-> a
-> m ()
pushFrontDeque :: forall (v :: * -> * -> *) a (m :: * -> *).
(MVector v a, PrimMonad m) =>
Deque v (PrimState m) a -> a -> m ()
pushFrontDeque (Deque MutVar (PrimState m) (DequeState v (PrimState m) a)
var) a
x = do
DequeState v (PrimState m) a
v Int
start Int
size <- forall (m :: * -> *) a.
PrimMonad m =>
MutVar (PrimState m) a -> m a
readMutVar MutVar (PrimState m) (DequeState v (PrimState m) a)
var
v (PrimState m) a -> Int -> Int -> m ()
inner v (PrimState m) a
v Int
start Int
size
where
inner :: v (PrimState m) a -> Int -> Int -> m ()
inner v (PrimState m) a
v Int
start Int
size = do
if Int
size forall a. Ord a => a -> a -> Bool
>= forall (v :: * -> * -> *) a s. MVector v a => v s a -> Int
V.length v (PrimState m) a
v
then forall (m :: * -> *) (v :: * -> * -> *) a b.
(PrimMonad m, MVector v a) =>
v (PrimState m) a
-> Int -> Int -> (v (PrimState m) a -> Int -> Int -> m b) -> m b
newVector v (PrimState m) a
v Int
start Int
size v (PrimState m) a -> Int -> Int -> m ()
inner
else do
let size' :: Int
size' = Int
size forall a. Num a => a -> a -> a
+ Int
1
start' :: Int
start' = (Int
start forall a. Num a => a -> a -> a
- Int
1) forall a. Integral a => a -> a -> a
`rem` forall (v :: * -> * -> *) a s. MVector v a => v s a -> Int
V.length v (PrimState m) a
v
start'' :: Int
start''
| Int
start' forall a. Ord a => a -> a -> Bool
< Int
0 = forall (v :: * -> * -> *) a s. MVector v a => v s a -> Int
V.length v (PrimState m) a
v forall a. Num a => a -> a -> a
+ Int
start'
| Bool
otherwise = Int
start'
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Int -> a -> m ()
V.unsafeWrite v (PrimState m) a
v Int
start'' a
x
forall (m :: * -> *) a.
PrimMonad m =>
MutVar (PrimState m) a -> a -> m ()
writeMutVar MutVar (PrimState m) (DequeState v (PrimState m) a)
var forall a b. (a -> b) -> a -> b
$! forall (v :: * -> * -> *) s a.
v s a -> Int -> Int -> DequeState v s a
DequeState v (PrimState m) a
v Int
start'' Int
size'
{-# INLINE pushFrontDeque #-}
pushBackDeque
:: (V.MVector v a, PrimMonad m)
=> Deque v (PrimState m) a
-> a
-> m ()
pushBackDeque :: forall (v :: * -> * -> *) a (m :: * -> *).
(MVector v a, PrimMonad m) =>
Deque v (PrimState m) a -> a -> m ()
pushBackDeque (Deque MutVar (PrimState m) (DequeState v (PrimState m) a)
var) a
x = do
DequeState v (PrimState m) a
v Int
start Int
size <- forall (m :: * -> *) a.
PrimMonad m =>
MutVar (PrimState m) a -> m a
readMutVar MutVar (PrimState m) (DequeState v (PrimState m) a)
var
v (PrimState m) a -> Int -> Int -> m ()
inner v (PrimState m) a
v Int
start Int
size
where
inner :: v (PrimState m) a -> Int -> Int -> m ()
inner v (PrimState m) a
v Int
start Int
size = do
if Int
size forall a. Ord a => a -> a -> Bool
>= forall (v :: * -> * -> *) a s. MVector v a => v s a -> Int
V.length v (PrimState m) a
v
then forall (m :: * -> *) (v :: * -> * -> *) a b.
(PrimMonad m, MVector v a) =>
v (PrimState m) a
-> Int -> Int -> (v (PrimState m) a -> Int -> Int -> m b) -> m b
newVector v (PrimState m) a
v Int
start Int
size v (PrimState m) a -> Int -> Int -> m ()
inner
else do
let end :: Int
end = Int
start forall a. Num a => a -> a -> a
+ Int
size
end' :: Int
end'
| Int
end forall a. Ord a => a -> a -> Bool
>= forall (v :: * -> * -> *) a s. MVector v a => v s a -> Int
V.length v (PrimState m) a
v = Int
end forall a. Num a => a -> a -> a
- forall (v :: * -> * -> *) a s. MVector v a => v s a -> Int
V.length v (PrimState m) a
v
| Bool
otherwise = Int
end
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Int -> a -> m ()
V.unsafeWrite v (PrimState m) a
v Int
end' a
x
forall (m :: * -> *) a.
PrimMonad m =>
MutVar (PrimState m) a -> a -> m ()
writeMutVar MutVar (PrimState m) (DequeState v (PrimState m) a)
var forall a b. (a -> b) -> a -> b
$! forall (v :: * -> * -> *) s a.
v s a -> Int -> Int -> DequeState v s a
DequeState v (PrimState m) a
v Int
start (Int
size forall a. Num a => a -> a -> a
+ Int
1)
{-# INLINE pushBackDeque #-}
foldlDeque
:: (V.MVector v a, PrimMonad m)
=> (acc -> a -> m acc)
-> acc
-> Deque v (PrimState m) a
-> m acc
foldlDeque :: forall (v :: * -> * -> *) a (m :: * -> *) acc.
(MVector v a, PrimMonad m) =>
(acc -> a -> m acc) -> acc -> Deque v (PrimState m) a -> m acc
foldlDeque acc -> a -> m acc
f acc
acc0 (Deque MutVar (PrimState m) (DequeState v (PrimState m) a)
var) = do
DequeState v (PrimState m) a
v Int
start Int
size <- forall (m :: * -> *) a.
PrimMonad m =>
MutVar (PrimState m) a -> m a
readMutVar MutVar (PrimState m) (DequeState v (PrimState m) a)
var
let loop :: Int -> acc -> m acc
loop Int
idx acc
acc
| Int
idx forall a. Ord a => a -> a -> Bool
>= Int
size = forall (f :: * -> *) a. Applicative f => a -> f a
pure acc
acc
| Bool
otherwise = do
let idxPlusStart :: Int
idxPlusStart = Int
idx forall a. Num a => a -> a -> a
+ Int
start
idx' :: Int
idx'
| Int
idxPlusStart forall a. Ord a => a -> a -> Bool
>= forall (v :: * -> * -> *) a s. MVector v a => v s a -> Int
V.length v (PrimState m) a
v = Int
idxPlusStart forall a. Num a => a -> a -> a
- forall (v :: * -> * -> *) a s. MVector v a => v s a -> Int
V.length v (PrimState m) a
v
| Bool
otherwise = Int
idxPlusStart
a
a <- forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Int -> m a
V.unsafeRead v (PrimState m) a
v Int
idx'
acc
acc' <- acc -> a -> m acc
f acc
acc a
a
Int -> acc -> m acc
loop (Int
idx forall a. Num a => a -> a -> a
+ Int
1) forall a b. (a -> b) -> a -> b
$! acc
acc'
Int -> acc -> m acc
loop Int
0 acc
acc0
foldrDeque
:: (V.MVector v a, PrimMonad m)
=> (a -> acc -> m acc)
-> acc
-> Deque v (PrimState m) a
-> m acc
foldrDeque :: forall (v :: * -> * -> *) a (m :: * -> *) acc.
(MVector v a, PrimMonad m) =>
(a -> acc -> m acc) -> acc -> Deque v (PrimState m) a -> m acc
foldrDeque a -> acc -> m acc
f acc
acc0 (Deque MutVar (PrimState m) (DequeState v (PrimState m) a)
var) = do
DequeState v (PrimState m) a
v Int
start Int
size <- forall (m :: * -> *) a.
PrimMonad m =>
MutVar (PrimState m) a -> m a
readMutVar MutVar (PrimState m) (DequeState v (PrimState m) a)
var
let loop :: Int -> acc -> m acc
loop Int
idx acc
acc
| Int
idx forall a. Ord a => a -> a -> Bool
< Int
0 = forall (f :: * -> *) a. Applicative f => a -> f a
pure acc
acc
| Bool
otherwise = do
let idxPlusStart :: Int
idxPlusStart = Int
idx forall a. Num a => a -> a -> a
+ Int
start
idx' :: Int
idx'
| Int
idxPlusStart forall a. Ord a => a -> a -> Bool
>= forall (v :: * -> * -> *) a s. MVector v a => v s a -> Int
V.length v (PrimState m) a
v = Int
idxPlusStart forall a. Num a => a -> a -> a
- forall (v :: * -> * -> *) a s. MVector v a => v s a -> Int
V.length v (PrimState m) a
v
| Bool
otherwise = Int
idxPlusStart
a
a <- forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Int -> m a
V.unsafeRead v (PrimState m) a
v Int
idx'
acc
acc' <- a -> acc -> m acc
f a
a acc
acc
Int -> acc -> m acc
loop (Int
idx forall a. Num a => a -> a -> a
- Int
1) forall a b. (a -> b) -> a -> b
$! acc
acc'
Int -> acc -> m acc
loop (Int
size forall a. Num a => a -> a -> a
- Int
1) acc
acc0
dequeToList
:: (V.MVector v a, PrimMonad m)
=> Deque v (PrimState m) a
-> m [a]
dequeToList :: forall (v :: * -> * -> *) a (m :: * -> *).
(MVector v a, PrimMonad m) =>
Deque v (PrimState m) a -> m [a]
dequeToList = forall (v :: * -> * -> *) a (m :: * -> *) acc.
(MVector v a, PrimMonad m) =>
(a -> acc -> m acc) -> acc -> Deque v (PrimState m) a -> m acc
foldrDeque (\a
a [a]
rest -> forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ a
a forall a. a -> [a] -> [a]
: [a]
rest) []
{-# INLINE dequeToList #-}
dequeToVector :: (VG.Vector v' a, V.MVector v a, PrimMonad m)
=> Deque v (PrimState m) a -> m (v' a)
dequeToVector :: forall (v' :: * -> *) a (v :: * -> * -> *) (m :: * -> *).
(Vector v' a, MVector v a, PrimMonad m) =>
Deque v (PrimState m) a -> m (v' a)
dequeToVector Deque v (PrimState m) a
dq = do
Int
size <- forall (m :: * -> *) (v :: * -> * -> *) a.
PrimMonad m =>
Deque v (PrimState m) a -> m Int
getDequeSize Deque v (PrimState m) a
dq
Mutable v' (PrimState m) a
mv <- forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
Int -> m (v (PrimState m) a)
V.unsafeNew Int
size
forall (v :: * -> * -> *) a (m :: * -> *) acc.
(MVector v a, PrimMonad m) =>
(acc -> a -> m acc) -> acc -> Deque v (PrimState m) a -> m acc
foldlDeque (\Int
i a
e -> forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Int -> a -> m ()
V.unsafeWrite Mutable v' (PrimState m) a
mv Int
i a
e forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> forall (f :: * -> *) a. Applicative f => a -> f a
pure (Int
iforall a. Num a => a -> a -> a
+Int
1)) Int
0 Deque v (PrimState m) a
dq
forall (m :: * -> *) (v :: * -> *) a.
(PrimMonad m, Vector v a) =>
Mutable v (PrimState m) a -> m (v a)
VG.unsafeFreeze Mutable v' (PrimState m) a
mv
newVector :: (PrimMonad m, V.MVector v a)
=> v (PrimState m) a
-> Int
-> Int
-> (v (PrimState m) a -> Int -> Int -> m b)
-> m b
newVector :: forall (m :: * -> *) (v :: * -> * -> *) a b.
(PrimMonad m, MVector v a) =>
v (PrimState m) a
-> Int -> Int -> (v (PrimState m) a -> Int -> Int -> m b) -> m b
newVector v (PrimState m) a
v Int
size2 Int
sizeOrig v (PrimState m) a -> Int -> Int -> m b
f = forall a. (?callStack::CallStack) => Bool -> a -> a
assert (Int
sizeOrig forall a. Eq a => a -> a -> Bool
== forall (v :: * -> * -> *) a s. MVector v a => v s a -> Int
V.length v (PrimState m) a
v) forall a b. (a -> b) -> a -> b
$ do
v (PrimState m) a
v' <- forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
Int -> m (v (PrimState m) a)
V.unsafeNew (forall (v :: * -> * -> *) a s. MVector v a => v s a -> Int
V.length v (PrimState m) a
v forall a. Num a => a -> a -> a
* Int
2)
let size1 :: Int
size1 = forall (v :: * -> * -> *) a s. MVector v a => v s a -> Int
V.length v (PrimState m) a
v forall a. Num a => a -> a -> a
- Int
size2
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> v (PrimState m) a -> m ()
V.unsafeCopy
(forall (v :: * -> * -> *) a s. MVector v a => Int -> v s a -> v s a
V.unsafeTake Int
size1 v (PrimState m) a
v')
(forall (v :: * -> * -> *) a s.
MVector v a =>
Int -> Int -> v s a -> v s a
V.unsafeSlice Int
size2 Int
size1 v (PrimState m) a
v)
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> v (PrimState m) a -> m ()
V.unsafeCopy
(forall (v :: * -> * -> *) a s.
MVector v a =>
Int -> Int -> v s a -> v s a
V.unsafeSlice Int
size1 Int
size2 v (PrimState m) a
v')
(forall (v :: * -> * -> *) a s. MVector v a => Int -> v s a -> v s a
V.unsafeTake Int
size2 v (PrimState m) a
v)
v (PrimState m) a -> Int -> Int -> m b
f v (PrimState m) a
v' Int
0 Int
sizeOrig
{-# INLINE newVector #-}
freezeDeque ::
(VG.Vector v a, PrimMonad m)
=> Deque (VG.Mutable v) (PrimState m) a
-> m (v a)
freezeDeque :: forall (v :: * -> *) a (m :: * -> *).
(Vector v a, PrimMonad m) =>
Deque (Mutable v) (PrimState m) a -> m (v a)
freezeDeque (Deque MutVar (PrimState m) (DequeState (Mutable v) (PrimState m) a)
var) = do
state :: DequeState (Mutable v) (PrimState m) a
state@(DequeState Mutable v (PrimState m) a
v Int
_ Int
size) <- forall (m :: * -> *) a.
PrimMonad m =>
MutVar (PrimState m) a -> m a
readMutVar MutVar (PrimState m) (DequeState (Mutable v) (PrimState m) a)
var
Mutable v (PrimState m) a
v' <- forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
Int -> m (v (PrimState m) a)
V.unsafeNew Int
size
forall (v :: * -> * -> *) a (m :: * -> *).
(MVector v a, PrimMonad m) =>
v (PrimState m) a -> DequeState v (PrimState m) a -> m ()
makeCopy Mutable v (PrimState m) a
v' DequeState (Mutable v) (PrimState m) a
state
forall (m :: * -> *) (v :: * -> *) a.
(PrimMonad m, Vector v a) =>
Mutable v (PrimState m) a -> m (v a)
VG.unsafeFreeze Mutable v (PrimState m) a
v'
makeCopy ::
(V.MVector v a, PrimMonad m)
=> v (PrimState m) a
-> DequeState v (PrimState m) a
-> m ()
makeCopy :: forall (v :: * -> * -> *) a (m :: * -> *).
(MVector v a, PrimMonad m) =>
v (PrimState m) a -> DequeState v (PrimState m) a -> m ()
makeCopy v (PrimState m) a
v' (DequeState v (PrimState m) a
v Int
start Int
size) = do
let size1 :: Int
size1 = forall a. Ord a => a -> a -> a
min Int
size (forall (v :: * -> * -> *) a s. MVector v a => v s a -> Int
V.length v (PrimState m) a
v forall a. Num a => a -> a -> a
- Int
start)
size2 :: Int
size2 = Int
size forall a. Num a => a -> a -> a
- Int
size1
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> v (PrimState m) a -> m ()
V.unsafeCopy
(forall (v :: * -> * -> *) a s. MVector v a => Int -> v s a -> v s a
V.unsafeTake Int
size1 v (PrimState m) a
v')
(forall (v :: * -> * -> *) a s.
MVector v a =>
Int -> Int -> v s a -> v s a
V.unsafeSlice Int
start Int
size1 v (PrimState m) a
v)
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Int
size forall a. Ord a => a -> a -> Bool
> Int
size1) forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> v (PrimState m) a -> m ()
V.unsafeCopy
(forall (v :: * -> * -> *) a s.
MVector v a =>
Int -> Int -> v s a -> v s a
V.unsafeSlice Int
size1 Int
size2 v (PrimState m) a
v')
(forall (v :: * -> * -> *) a s. MVector v a => Int -> v s a -> v s a
V.unsafeTake Int
size2 v (PrimState m) a
v)
{-# INLINE makeCopy #-}