{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE CPP #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeFamilies #-}
module Data.Vector.Generic.Mutable.Base (
MVector(..)
) where
import Control.Monad.ST
#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 :: Int -> ST s (v s a)
basicInitialize :: v s a -> ST s ()
basicUnsafeReplicate :: Int -> a -> ST s (v s a)
basicUnsafeRead :: v s a -> Int -> ST s a
basicUnsafeWrite :: v s a -> Int -> a -> ST s ()
basicClear :: v s a -> ST s ()
basicSet :: v s a -> a -> ST s ()
basicUnsafeCopy :: v s a
-> v s a
-> ST s ()
basicUnsafeMove :: v s a
-> v s a
-> ST s ()
basicUnsafeGrow :: v s a -> Int -> ST s (v s a)
{-# INLINE basicUnsafeReplicate #-}
basicUnsafeReplicate Int
n a
x
= do
v s a
v <- Int -> ST s (v s a)
forall (v :: * -> * -> *) a s. MVector v a => Int -> ST s (v s a)
basicUnsafeNew Int
n
v s a -> a -> ST s ()
forall (v :: * -> * -> *) a s. MVector v a => v s a -> a -> ST s ()
basicSet v s a
v a
x
v s a -> ST s (v s a)
forall (m :: * -> *) a. Monad m => a -> m a
return v s a
v
{-# INLINE basicClear #-}
basicClear v s a
_ = () -> ST s ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
{-# INLINE basicSet #-}
basicSet !v s a
v a
x
| Int
n Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
0 = () -> ST s ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
| Bool
otherwise = do
v s a -> Int -> a -> ST s ()
forall (v :: * -> * -> *) a s.
MVector v a =>
v s a -> Int -> a -> ST s ()
basicUnsafeWrite v s a
v Int
0 a
x
Int -> ST s ()
do_set Int
1
where
!n :: Int
n = v s a -> Int
forall (v :: * -> * -> *) a s. MVector v a => v s a -> Int
basicLength v s a
v
do_set :: Int -> ST s ()
do_set Int
i | Int
2Int -> Int -> Int
forall a. Num a => a -> a -> a
*Int
i Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
n = do v s a -> v s a -> ST s ()
forall (v :: * -> * -> *) a s.
MVector v a =>
v s a -> v s a -> ST s ()
basicUnsafeCopy (Int -> Int -> v s a -> v s a
forall (v :: * -> * -> *) a s.
MVector v a =>
Int -> Int -> v s a -> v s a
basicUnsafeSlice Int
i Int
i v s a
v)
(Int -> Int -> v s a -> v s a
forall (v :: * -> * -> *) a s.
MVector v a =>
Int -> Int -> v s a -> v s a
basicUnsafeSlice Int
0 Int
i v s a
v)
Int -> ST s ()
do_set (Int
2Int -> Int -> Int
forall a. Num a => a -> a -> a
*Int
i)
| Bool
otherwise = v s a -> v s a -> ST s ()
forall (v :: * -> * -> *) a s.
MVector v a =>
v s a -> v s a -> ST s ()
basicUnsafeCopy (Int -> Int -> v s a -> v s a
forall (v :: * -> * -> *) a s.
MVector v a =>
Int -> Int -> v s a -> v s a
basicUnsafeSlice Int
i (Int
nInt -> Int -> Int
forall a. Num a => a -> a -> a
-Int
i) v s a
v)
(Int -> Int -> v s a -> v s a
forall (v :: * -> * -> *) a s.
MVector v a =>
Int -> Int -> v s a -> v s a
basicUnsafeSlice Int
0 (Int
nInt -> Int -> Int
forall a. Num a => a -> a -> a
-Int
i) v s a
v)
{-# INLINE basicUnsafeCopy #-}
basicUnsafeCopy !v s a
dst !v s a
src = Int -> ST s ()
do_copy Int
0
where
!n :: Int
n = v s a -> Int
forall (v :: * -> * -> *) a s. MVector v a => v s a -> Int
basicLength v s a
src
do_copy :: Int -> ST s ()
do_copy Int
i | Int
i Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
n = do
a
x <- v s a -> Int -> ST s a
forall (v :: * -> * -> *) a s.
MVector v a =>
v s a -> Int -> ST s a
basicUnsafeRead v s a
src Int
i
v s a -> Int -> a -> ST s ()
forall (v :: * -> * -> *) a s.
MVector v a =>
v s a -> Int -> a -> ST s ()
basicUnsafeWrite v s a
dst Int
i a
x
Int -> ST s ()
do_copy (Int
iInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1)
| Bool
otherwise = () -> ST s ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
{-# INLINE basicUnsafeMove #-}
basicUnsafeMove !v s a
dst !v s a
src
| v s a -> v s a -> Bool
forall (v :: * -> * -> *) a s.
MVector v a =>
v s a -> v s a -> Bool
basicOverlaps v s a
dst v s a
src = do
v s a
srcCopy <- Int -> ST s (v s a)
forall (v :: * -> * -> *) a s. MVector v a => Int -> ST s (v s a)
basicUnsafeNew (v s a -> Int
forall (v :: * -> * -> *) a s. MVector v a => v s a -> Int
basicLength v s a
src)
v s a -> v s a -> ST s ()
forall (v :: * -> * -> *) a s.
MVector v a =>
v s a -> v s a -> ST s ()
basicUnsafeCopy v s a
srcCopy v s a
src
v s a -> v s a -> ST s ()
forall (v :: * -> * -> *) a s.
MVector v a =>
v s a -> v s a -> ST s ()
basicUnsafeCopy v s a
dst v s a
srcCopy
| Bool
otherwise = v s a -> v s a -> ST s ()
forall (v :: * -> * -> *) a s.
MVector v a =>
v s a -> v s a -> ST s ()
basicUnsafeCopy v s a
dst v s a
src
{-# INLINE basicUnsafeGrow #-}
basicUnsafeGrow v s a
v Int
by
= do
v s a
v' <- Int -> ST s (v s a)
forall (v :: * -> * -> *) a s. MVector v a => Int -> ST s (v s a)
basicUnsafeNew (Int
nInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
by)
v s a -> v s a -> ST s ()
forall (v :: * -> * -> *) a s.
MVector v a =>
v s a -> v s a -> ST s ()
basicUnsafeCopy (Int -> Int -> v s a -> v s a
forall (v :: * -> * -> *) a s.
MVector v a =>
Int -> Int -> v s a -> v s a
basicUnsafeSlice Int
0 Int
n v s a
v') v s a
v
v s a -> ST s (v s a)
forall (m :: * -> *) a. Monad m => a -> m a
return v s a
v'
where
n :: Int
n = v s a -> Int
forall (v :: * -> * -> *) a s. MVector v a => v s a -> Int
basicLength v s a
v
{-# MINIMAL basicLength, basicUnsafeSlice, basicOverlaps,
basicUnsafeNew, basicInitialize, basicUnsafeRead,
basicUnsafeWrite #-}