{-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE TypeFamilies #-} module Data.StrictVector.Mutable ( module Data.Vector.Generic.Mutable , MVector(..) , IOVector, STVector ) where import Control.Monad.ST (RealWorld) import Data.Vector.Generic.Mutable hiding (MVector) import qualified Data.Vector.Generic.Mutable as VGM import qualified Data.Vector.Mutable as VM -- | 'MVector' is a strict wrapper around "Data.Vector.Mutable"'s 'Data.Vector.Mutable.MVector' newtype MVector s a = MVector (VM.MVector s a) instance VGM.MVector MVector a where basicLength (MVector v) = VGM.basicLength v basicUnsafeSlice n m (MVector v) = MVector $ VGM.basicUnsafeSlice n m v basicOverlaps (MVector v1) (MVector v2) = VGM.basicOverlaps v1 v2 basicUnsafeNew n = fmap MVector (VGM.basicUnsafeNew n) basicInitialize (MVector v) = basicInitialize v basicUnsafeReplicate n x = x `seq` fmap MVector (VGM.basicUnsafeReplicate n x) basicUnsafeRead (MVector v) n = VGM.basicUnsafeRead v n basicUnsafeWrite (MVector v) n x = x `seq` VGM.basicUnsafeWrite v n x basicClear (MVector v) = VGM.basicClear v basicSet (MVector v) x = x `seq` VGM.basicSet v x basicUnsafeCopy (MVector v1) (MVector v2) = VGM.basicUnsafeCopy v1 v2 basicUnsafeMove (MVector v1) (MVector v2) = VGM.basicUnsafeMove v1 v2 basicUnsafeGrow (MVector v) n = fmap MVector (VGM.basicUnsafeGrow v n) type IOVector = MVector RealWorld type STVector s = MVector s