(++) for Stream and Vector.Unboxed
[darcs-mirrors/vector.git] / Data / Vector / Stream.hs
index f25e2d5..f8aa6e5 100644 (file)
@@ -1,15 +1,17 @@
-{-# LANGUAGE ExistentialQuantification, BangPatterns #-}
+{-# LANGUAGE ExistentialQuantification, BangPatterns, CPP #-}
+
+#include "phases.h"
 
 module Data.Vector.Stream (
   Step(..), Stream(..),
 
-  empty, singleton, replicate,
+  empty, singleton, replicate, (++),
   map, filter, zipWith,
   foldr, foldl, foldl',
   mapM_, foldM
 ) where
 
-import Prelude hiding ( replicate, map, filter, zipWith,
+import Prelude hiding ( replicate, (++), map, filter, zipWith,
                         foldr, foldl,
                         mapM_ )
 
@@ -39,6 +41,20 @@ replicate n x = Stream step n (max n 0)
     step i | i > 0     = Yield x (i-1)
            | otherwise = Done
 
+infixr ++
+(++) :: Stream a -> Stream a -> Stream a
+{-# INLINE_STREAM (++) #-}
+Stream stepa sa na ++ Stream stepb sb nb = Stream step (Left sa) (na + nb)
+  where
+    step (Left  sa) = case stepa sa of
+                        Yield x sa' -> Yield x (Left  sa')
+                        Skip    sa' -> Skip    (Left  sa')
+                        Done        -> Skip    (Right sb)
+    step (Right sb) = case stepb sb of
+                        Yield x sb' -> Yield x (Right sb')
+                        Skip    sb' -> Skip    (Right sb')
+                        Done        -> Done
+
 map :: (a -> b) -> Stream a -> Stream b
 {-# INLINE_STREAM map #-}
 map f (Stream step s n) = Stream step' s n