Fusible (//)
authorRoman Leshchinskiy <rl@cse.unsw.edu.au>
Sat, 12 Jul 2008 09:30:45 +0000 (09:30 +0000)
committerRoman Leshchinskiy <rl@cse.unsw.edu.au>
Sat, 12 Jul 2008 09:30:45 +0000 (09:30 +0000)
Data/Vector/IVector.hs
Data/Vector/MVector.hs

index fa668e9..b0569c4 100644 (file)
@@ -29,6 +29,9 @@ module Data.Vector.IVector (
   -- * Subvectors
   slice, extract, takeSlice, take, dropSlice, drop,
 
   -- * Subvectors
   slice, extract, takeSlice, take, dropSlice, drop,
 
+  -- * Permutations
+  (//),
+
   -- * Mapping and zipping
   map, zipWith,
 
   -- * Mapping and zipping
   map, zipWith,
 
@@ -277,6 +280,14 @@ drop n = unstream . Stream.drop n . stream
 
   #-}
 
 
   #-}
 
+-- Permutations
+-- ------------
+
+(//) :: IVector v a => v a -> [(Int, a)] -> v a
+{-# INLINE (//) #-}
+v // us = new (Mut.update (Mut.unstream (stream v))
+                          (Stream.fromList us))
+
 -- Mapping/zipping
 -- ---------------
 
 -- Mapping/zipping
 -- ---------------
 
index ef90355..38f0e8d 100644 (file)
@@ -16,7 +16,7 @@
 module Data.Vector.MVector (
   MVectorPure(..), MVector(..),
 
 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
 ) where
 
 import qualified Data.Vector.Stream      as Stream
@@ -201,3 +201,11 @@ unstreamUnknown s
                                  . double2Int
                                  $ int2Double (length v) * gROWTH_FACTOR
 
                                  . 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
+