(original) (raw)

{-# 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 s. 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 s. 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 a. a -> ST s a forall (m :: * -> *) a. Monad m => a -> m a return v s a v

{-# INLINE basicClear #-} basicClear v s a _ = () -> ST s () forall a. a -> ST s a 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 a. a -> ST s a forall (m :: * -> *) a. Monad m => a -> m a return () | Bool otherwise = do v s a -> Int -> a -> ST s () forall s. 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 s. 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 s. 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 s. 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 s. 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 s. 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 s. 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 s. 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 s. 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 s. 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 s. 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 a. a -> ST s a 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 s. 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 s. 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 s. 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 s. 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 s. 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 s. 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 s. 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 s. 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 s. 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 a. a -> ST s a forall (m :: * -> *) a. Monad m => a -> m a return v s a v' where n :: Int n = v s a -> Int forall s. 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 #-}