New combinators
[darcs-mirrors/vector.git] / Data / Vector / Base.hs
index c2a954a..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,6 +47,14 @@ infixr ++
 {-# INLINE (++) #-}
 v ++ w = unstream (stream v Stream.++ stream w)
 
+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 #-}
 map f = unstream . Stream.map f . stream
@@ -55,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
@@ -63,3 +83,11 @@ sum :: (Base v a, Num a) => v a -> a
 {-# INLINE sum #-}
 sum = foldl' (+) 0
 
+toList :: Base v a => v a -> [a]
+{-# INLINE toList #-}
+toList = Stream.toList . stream
+
+fromList :: Base v a => [a] -> v a
+{-# INLINE fromList #-}
+fromList = unstream . Stream.fromList
+