vector-0.2: Data/Vector/MVector/New.hs
{-# LANGUAGE Rank2Types, ScopedTypeVariables #-}
#include "phases.h"
module Data.Vector.MVector.New (
New(..), run, unstream, transform, update, reverse
) where
import qualified Data.Vector.MVector as MVector
import Data.Vector.MVector ( MVector )
import Data.Vector.Fusion.Stream ( Stream, MStream )
import qualified Data.Vector.Fusion.Stream as Stream
import qualified Data.Vector.Fusion.Stream.Monadic as MStream
import Control.Monad ( liftM )
import Prelude hiding ( reverse, map, filter )
newtype New a = New (forall m mv. MVector mv m a => m (mv a))
run :: MVector mv m a => New a -> m (mv a)
{-# INLINE run #-}
run (New p) = p
modify :: New a -> (forall m mv. MVector mv m a => mv a -> m ()) -> New a
{-# INLINE modify #-}
modify (New p) q = New (do { v <- p; q v; return v })
unstream :: Stream a -> New a
{-# INLINE_STREAM unstream #-}
unstream s = New (MVector.unstream s)
transform :: (forall m. Monad m => MStream m a -> MStream m a) -> New a -> New a
{-# INLINE_STREAM transform #-}
transform f (New p) = New (MVector.transform f =<< p)
{-# RULES
"transform/transform [New]"
forall (f :: forall m. Monad m => MStream m a -> MStream m a)
(g :: forall m. Monad m => MStream m a -> MStream m a)
p .
transform f (transform g p) = transform (f . g) p
#-}
update :: New a -> Stream (Int, a) -> New a
{-# INLINE_STREAM update #-}
update m s = modify m (\v -> MVector.update v s)
reverse :: New a -> New a
{-# INLINE_STREAM reverse #-}
reverse m = modify m (MVector.reverse)