update, bpermute
authorRoman Leshchinskiy <rl@cse.unsw.edu.au>
Thu, 7 Aug 2008 06:45:42 +0000 (06:45 +0000)
committerRoman Leshchinskiy <rl@cse.unsw.edu.au>
Thu, 7 Aug 2008 06:45:42 +0000 (06:45 +0000)
Data/Vector/IVector.hs

index 1fc3265..cf03eb7 100644 (file)
@@ -1,4 +1,5 @@
-{-# LANGUAGE Rank2Types, MultiParamTypeClasses, ScopedTypeVariables #-}
+{-# LANGUAGE Rank2Types, MultiParamTypeClasses, FlexibleContexts,
+             ScopedTypeVariables #-}
 -- |
 -- Module      : Data.Vector.IVector
 -- Copyright   : (c) Roman Leshchinskiy 2008
@@ -30,7 +31,7 @@ module Data.Vector.IVector (
   slice, extract, takeSlice, take, dropSlice, drop,
 
   -- * Permutations
-  (//),
+  (//), update, bpermute,
 
   -- * Mapping and zipping
   map, zipWith,
@@ -312,6 +313,14 @@ drop n = unstream . Stream.drop n . stream
 v // us = new (Mut.update (Mut.unstream (stream v))
                           (Stream.fromList us))
 
+update :: (IVector v a, IVector v (Int, a)) => v a -> v (Int, a) -> v a
+{-# INLINE update #-}
+update v w = new (Mut.update (Mut.unstream (stream v)) (stream w))
+
+bpermute :: (IVector v a, IVector v Int) => v a -> v Int -> v a
+{-# INLINE bpermute #-}
+bpermute v is = is `seq` map (v!) is
+
 -- Mapping/zipping
 -- ---------------