{-# LANGUAGE CPP, MultiParamTypeClasses, BangPatterns, TypeFamilies #-}
module Data.Vector.Generic.Mutable.Base (
MVector(..)
) where
import Control.Monad.Primitive ( PrimMonad, PrimState )
#define NOT_VECTOR_MODULE
#include "vector.h"
class MVector v a where
basicLength :: v s a -> Int
basicUnsafeSlice :: Int
-> Int
-> v s a
-> v s a
basicOverlaps :: v s a -> v s a -> Bool
basicUnsafeNew :: PrimMonad m => Int -> m (v (PrimState m) a)
basicInitialize :: PrimMonad m => v (PrimState m) a -> m ()
basicUnsafeReplicate :: PrimMonad m => Int -> a -> m (v (PrimState m) a)
basicUnsafeRead :: PrimMonad m => v (PrimState m) a -> Int -> m a
basicUnsafeWrite :: PrimMonad m => v (PrimState m) a -> Int -> a -> m ()
basicClear :: PrimMonad m => v (PrimState m) a -> m ()
basicSet :: PrimMonad m => v (PrimState m) a -> a -> m ()
basicUnsafeCopy :: PrimMonad m => v (PrimState m) a
-> v (PrimState m) a
-> m ()
basicUnsafeMove :: PrimMonad m => v (PrimState m) a
-> v (PrimState m) a
-> m ()
basicUnsafeGrow :: PrimMonad m => v (PrimState m) a
-> Int
-> m (v (PrimState m) a)
{-# INLINE basicUnsafeReplicate #-}
basicUnsafeReplicate Int
n a
x
= do
v (PrimState m) a
v <- forall (v :: * -> * -> *) a (m :: * -> *).
(MVector v a, PrimMonad m) =>
Int -> m (v (PrimState m) a)
basicUnsafeNew Int
n
forall (v :: * -> * -> *) a (m :: * -> *).
(MVector v a, PrimMonad m) =>
v (PrimState m) a -> a -> m ()
basicSet v (PrimState m) a
v a
x
forall (m :: * -> *) a. Monad m => a -> m a
return v (PrimState m) a
v
{-# INLINE basicClear #-}
basicClear v (PrimState m) a
_ = forall (m :: * -> *) a. Monad m => a -> m a
return ()
{-# INLINE basicSet #-}
basicSet !v (PrimState m) a
v a
x
| Int
n forall a. Eq a => a -> a -> Bool
== Int
0 = forall (m :: * -> *) a. Monad m => a -> m a
return ()
| Bool
otherwise = do
forall (v :: * -> * -> *) a (m :: * -> *).
(MVector v a, PrimMonad m) =>
v (PrimState m) a -> Int -> a -> m ()
basicUnsafeWrite v (PrimState m) a
v Int
0 a
x
Int -> m ()
do_set Int
1
where
!n :: Int
n = forall (v :: * -> * -> *) a s. MVector v a => v s a -> Int
basicLength v (PrimState m) a
v
do_set :: Int -> m ()
do_set Int
i | Int
2forall a. Num a => a -> a -> a
*Int
i forall a. Ord a => a -> a -> Bool
< Int
n = do forall (v :: * -> * -> *) a (m :: * -> *).
(MVector v a, PrimMonad m) =>
v (PrimState m) a -> v (PrimState m) a -> m ()
basicUnsafeCopy (forall (v :: * -> * -> *) a s.
MVector v a =>
Int -> Int -> v s a -> v s a
basicUnsafeSlice Int
i Int
i v (PrimState m) a
v)
(forall (v :: * -> * -> *) a s.
MVector v a =>
Int -> Int -> v s a -> v s a
basicUnsafeSlice Int
0 Int
i v (PrimState m) a
v)
Int -> m ()
do_set (Int
2forall a. Num a => a -> a -> a
*Int
i)
| Bool
otherwise = forall (v :: * -> * -> *) a (m :: * -> *).
(MVector v a, PrimMonad m) =>
v (PrimState m) a -> v (PrimState m) a -> m ()
basicUnsafeCopy (forall (v :: * -> * -> *) a s.
MVector v a =>
Int -> Int -> v s a -> v s a
basicUnsafeSlice Int
i (Int
nforall a. Num a => a -> a -> a
-Int
i) v (PrimState m) a
v)
(forall (v :: * -> * -> *) a s.
MVector v a =>
Int -> Int -> v s a -> v s a
basicUnsafeSlice Int
0 (Int
nforall a. Num a => a -> a -> a
-Int
i) v (PrimState m) a
v)
{-# INLINE basicUnsafeCopy #-}
basicUnsafeCopy !v (PrimState m) a
dst !v (PrimState m) a
src = Int -> m ()
do_copy Int
0
where
!n :: Int
n = forall (v :: * -> * -> *) a s. MVector v a => v s a -> Int
basicLength v (PrimState m) a
src
do_copy :: Int -> m ()
do_copy Int
i | Int
i forall a. Ord a => a -> a -> Bool
< Int
n = do
a
x <- forall (v :: * -> * -> *) a (m :: * -> *).
(MVector v a, PrimMonad m) =>
v (PrimState m) a -> Int -> m a
basicUnsafeRead v (PrimState m) a
src Int
i
forall (v :: * -> * -> *) a (m :: * -> *).
(MVector v a, PrimMonad m) =>
v (PrimState m) a -> Int -> a -> m ()
basicUnsafeWrite v (PrimState m) a
dst Int
i a
x
Int -> m ()
do_copy (Int
iforall a. Num a => a -> a -> a
+Int
1)
| Bool
otherwise = forall (m :: * -> *) a. Monad m => a -> m a
return ()
{-# INLINE basicUnsafeMove #-}
basicUnsafeMove !v (PrimState m) a
dst !v (PrimState m) a
src
| forall (v :: * -> * -> *) a s.
MVector v a =>
v s a -> v s a -> Bool
basicOverlaps v (PrimState m) a
dst v (PrimState m) a
src = do
v (PrimState m) a
srcCopy <- forall (v :: * -> * -> *) a (m :: * -> *).
(MVector v a, PrimMonad m) =>
Int -> m (v (PrimState m) a)
basicUnsafeNew (forall (v :: * -> * -> *) a s. MVector v a => v s a -> Int
basicLength v (PrimState m) a
src)
forall (v :: * -> * -> *) a (m :: * -> *).
(MVector v a, PrimMonad m) =>
v (PrimState m) a -> v (PrimState m) a -> m ()
basicUnsafeCopy v (PrimState m) a
srcCopy v (PrimState m) a
src
forall (v :: * -> * -> *) a (m :: * -> *).
(MVector v a, PrimMonad m) =>
v (PrimState m) a -> v (PrimState m) a -> m ()
basicUnsafeCopy v (PrimState m) a
dst v (PrimState m) a
srcCopy
| Bool
otherwise = forall (v :: * -> * -> *) a (m :: * -> *).
(MVector v a, PrimMonad m) =>
v (PrimState m) a -> v (PrimState m) a -> m ()
basicUnsafeCopy v (PrimState m) a
dst v (PrimState m) a
src
{-# INLINE basicUnsafeGrow #-}
basicUnsafeGrow v (PrimState m) a
v Int
by
= do
v (PrimState m) a
v' <- forall (v :: * -> * -> *) a (m :: * -> *).
(MVector v a, PrimMonad m) =>
Int -> m (v (PrimState m) a)
basicUnsafeNew (Int
nforall a. Num a => a -> a -> a
+Int
by)
forall (v :: * -> * -> *) a (m :: * -> *).
(MVector v a, PrimMonad m) =>
v (PrimState m) a -> v (PrimState m) a -> m ()
basicUnsafeCopy (forall (v :: * -> * -> *) a s.
MVector v a =>
Int -> Int -> v s a -> v s a
basicUnsafeSlice Int
0 Int
n v (PrimState m) a
v') v (PrimState m) a
v
forall (m :: * -> *) a. Monad m => a -> m a
return v (PrimState m) a
v'
where
n :: Int
n = forall (v :: * -> * -> *) a s. MVector v a => v s a -> Int
basicLength v (PrimState m) a
v
{-# MINIMAL basicLength, basicUnsafeSlice, basicOverlaps,
basicUnsafeNew, basicInitialize, basicUnsafeRead,
basicUnsafeWrite #-}