Fusible (//)
[darcs-mirrors/vector.git] / Data / Vector / MVector.hs
index b26d0c3..38f0e8d 100644 (file)
 -- Generic interface to mutable vectors
 --
 
+#include "phases.h"
+
 module Data.Vector.MVector (
   MVectorPure(..), MVector(..),
 
-  slice, new, newWith, read, write, copy, grow, unstream
+  slice, new, newWith, read, write, copy, grow, unstream, update
 ) where
 
 import qualified Data.Vector.Stream      as Stream
@@ -164,7 +166,7 @@ grow v by = assert (by >= 0)
 -- The vector will grow logarithmically if the 'Size' hint of the 'Stream' is
 -- inexact.
 unstream :: MVector v m a => Stream a -> m (v a)
-{-# INLINE unstream #-}
+{-# INLINE_STREAM unstream #-}
 unstream s = case upperBound (Stream.size s) of
                Just n  -> unstreamMax     s n
                Nothing -> unstreamUnknown s
@@ -199,3 +201,11 @@ unstreamUnknown s
                                  . double2Int
                                  $ int2Double (length v) * gROWTH_FACTOR
 
+
+update :: MVector v m a => v a -> Stream (Int, a) -> m ()
+{-# INLINE update #-}
+update v s = Stream.mapM_ put s
+  where
+    {-# INLINE put #-}
+    put (i, x) = write v i x
+