New combinators
[darcs-mirrors/vector.git] / Data / Vector / Base.hs
index ae88f17..494c603 100644 (file)
@@ -1,4 +1,4 @@
-{-# LANGUAGE TypeFamilies, FlexibleContexts, RankNTypes, MultiParamTypeClasses, BangPatterns, CPP #-}
+{-# LANGUAGE Rank2Types, MultiParamTypeClasses, BangPatterns, CPP #-}
 
 #include "phases.h"
 
@@ -14,7 +14,7 @@ import           Data.Vector.Stream.Size
 import Prelude hiding ( length, map, zipWith, sum )
 
 class Base v a where
-  create       :: (forall mv. Mut.Base mv a => Mut.Trans mv (mv a)) -> v a
+  create       :: (forall mv m. Mut.Base mv m a => m (mv m a)) -> v a
 
   length       :: v a -> Int
   unsafeSlice  :: v a -> Int -> Int -> v a
@@ -47,9 +47,13 @@ infixr ++
 {-# INLINE (++) #-}
 v ++ w = unstream (stream v Stream.++ stream w)
 
-filter :: Base v a => (a -> Bool) -> v a -> v a
-{-# INLINE filter #-}
-filter f = unstream . Stream.filter f . stream
+take :: Base v a => Int -> v a -> v a
+{-# INLINE take #-}
+take n = unstream . Stream.take n . stream
+
+drop :: Base v a => Int -> v a -> v a
+{-# INLINE drop #-}
+drop n = unstream . Stream.drop n . stream
 
 map :: (Base v a, Base v b) => (a -> b) -> v a -> v b
 {-# INLINE map #-}
@@ -59,6 +63,18 @@ zipWith :: (Base v a, Base v b, Base v c) => (a -> b -> c) -> v a -> v b -> v c
 {-# INLINE zipWith #-}
 zipWith f xs ys = unstream (Stream.zipWith f (stream xs) (stream ys))
 
+filter :: Base v a => (a -> Bool) -> v a -> v a
+{-# INLINE filter #-}
+filter f = unstream . Stream.filter f . stream
+
+takeWhile :: Base v a => (a -> Bool) -> v a -> v a
+{-# INLINE takeWhile #-}
+takeWhile f = unstream . Stream.takeWhile f . stream
+
+dropWhile :: Base v a => (a -> Bool) -> v a -> v a
+{-# INLINE dropWhile #-}
+dropWhile f = unstream . Stream.dropWhile f . stream
+
 foldl' :: Base v b => (a -> b -> a) -> a -> v b -> a
 {-# INLINE foldl' #-}
 foldl' f z = Stream.foldl' f z . stream