Add accum
authorRoman Leshchinskiy <rl@cse.unsw.edu.au>
Tue, 7 Oct 2008 14:11:18 +0000 (14:11 +0000)
committerRoman Leshchinskiy <rl@cse.unsw.edu.au>
Tue, 7 Oct 2008 14:11:18 +0000 (14:11 +0000)
Data/Vector/IVector.hs
Data/Vector/MVector.hs
Data/Vector/MVector/New.hs

index 3f66e64..9db6dc7 100644 (file)
@@ -31,7 +31,7 @@ module Data.Vector.IVector (
   slice, init, tail, take, drop,
 
   -- * Permutations
-  (//), update, bpermute,
+  accum, (//), update, bpermute,
 
   -- * Mapping and zipping
   map, zipWith, zip,
@@ -335,6 +335,11 @@ drop n v = slice v n (max 0 (length v - n))
 -- Permutations
 -- ------------
 
+accum :: IVector v a => (a -> b -> a) -> v a -> [(Int,b)] -> v a
+{-# INLINE accum #-}
+accum f v us = new (New.accum f (New.unstream (stream v))
+                                (Stream.fromList us))
+
 (//) :: IVector v a => v a -> [(Int, a)] -> v a
 {-# INLINE (//) #-}
 v // us = new (New.update (New.unstream (stream v))
index 52a1226..33dc033 100644 (file)
@@ -18,7 +18,7 @@ module Data.Vector.MVector (
 
   slice, new, newWith, read, write, copy, grow,
   unstream, transform,
-  update, reverse
+  accum, update, reverse
 ) where
 
 import qualified Data.Vector.Fusion.Stream      as Stream
@@ -229,12 +229,18 @@ unstreamUnknown s
                                  . double2Int
                                  $ int2Double (length v) * gROWTH_FACTOR
 
+accum :: MVector v m a => (a -> b -> a) -> v a -> Stream (Int, b) -> m ()
+{-# INLINE accum #-}
+accum f v s = Stream.mapM_ upd s
+  where
+    {-# INLINE upd #-}
+    upd (i,b) = do
+                  a <- read v i
+                  write v i (f a b)
+
 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
+update = accum (const id)
 
 reverse :: MVector v m a => v a -> m ()
 {-# INLINE reverse #-}
index 00d51d8..787dadc 100644 (file)
@@ -3,7 +3,7 @@
 #include "phases.h"
 
 module Data.Vector.MVector.New (
-  New(..), run, unstream, transform, update, reverse,
+  New(..), run, unstream, transform, accum, update, reverse,
   slice, init, tail, take, drop
 ) where
 
@@ -94,6 +94,10 @@ drop n m = apply (\v -> MVector.slice v n (max 0 (MVector.length v - n))) m
 
   #-}
 
+accum :: (a -> b -> a) -> New a -> Stream (Int, b) -> New a
+{-# INLINE_STREAM accum #-}
+accum f m s = modify m (\v -> MVector.accum f v s)
+
 update :: New a -> Stream (Int, a) -> New a
 {-# INLINE_STREAM update #-}
 update m s = modify m (\v -> MVector.update v s)