{take|drop}WhileSlice
authorRoman Leshchinskiy <rl@cse.unsw.edu.au>
Sat, 12 Jul 2008 04:20:47 +0000 (04:20 +0000)
committerRoman Leshchinskiy <rl@cse.unsw.edu.au>
Sat, 12 Jul 2008 04:20:47 +0000 (04:20 +0000)
Data/Vector/IVector.hs

index 01e2378..e549d90 100644 (file)
@@ -24,13 +24,13 @@ module Data.Vector.IVector (
   empty, singleton, cons, snoc, replicate, (++),
 
   -- * Subvectors
-  slice, takeSlice, take, dropSlice, drop,
+  slice, subvector, takeSlice, take, dropSlice, drop,
 
   -- * Mapping and zipping
   map, zipWith,
 
   -- * Filtering
-  filter, takeWhile, dropWhile,
+  filter, takeWhileSlice, takeWhile, dropWhileSlice, dropWhile,
 
   -- * Searching
   elem, notElem, find, findIndex,
@@ -213,12 +213,28 @@ filter :: IVector v a => (a -> Bool) -> v a -> v a
 {-# INLINE filter #-}
 filter f = unstream . Stream.filter f . stream
 
+-- | Yield the longest prefix of elements satisfying the predicate without
+-- copying.
+takeWhileSlice :: IVector v a => (a -> Bool) -> v a -> v a
+{-# INLINE takeWhileSlice #-}
+takeWhileSlice f v = case findIndex (not . f) v of
+                       Just n  -> takeSlice n v
+                       Nothing -> v
+
 -- | Copy the longest prefix of elements satisfying the predicate to a new
 -- vector
 takeWhile :: IVector v a => (a -> Bool) -> v a -> v a
 {-# INLINE takeWhile #-}
 takeWhile f = unstream . Stream.takeWhile f . stream
 
+-- | Drop the longest prefix of elements that satisfy the predicate without
+-- copying
+dropWhileSlice :: IVector v a => (a -> Bool) -> v a -> v a
+{-# INLINE dropWhileSlice #-}
+dropWhileSlice f v = case findIndex (not . f) v of
+                       Just n  -> dropSlice n v
+                       Nothing -> v
+
 -- | Drop the longest prefix of elements that satisfy the predicate and copy
 -- the rest to a new vector.
 dropWhile :: IVector v a => (a -> Bool) -> v a -> v a