(++) for Stream and Vector.Unboxed
authorRoman Leshchinskiy <rl@cse.unsw.edu.au>
Sun, 6 Jul 2008 16:44:04 +0000 (16:44 +0000)
committerRoman Leshchinskiy <rl@cse.unsw.edu.au>
Sun, 6 Jul 2008 16:44:04 +0000 (16:44 +0000)
Data/Vector/Stream.hs
Data/Vector/Unboxed.hs

index a342cd9..f8aa6e5 100644 (file)
@@ -5,13 +5,13 @@
 module Data.Vector.Stream (
   Step(..), Stream(..),
 
 module Data.Vector.Stream (
   Step(..), Stream(..),
 
-  empty, singleton, replicate,
+  empty, singleton, replicate, (++),
   map, filter, zipWith,
   foldr, foldl, foldl',
   mapM_, foldM
 ) where
 
   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_ )
 
                         foldr, foldl,
                         mapM_ )
 
@@ -41,6 +41,20 @@ replicate n x = Stream step n (max n 0)
     step i | i > 0     = Yield x (i-1)
            | otherwise = Done
 
     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
 map :: (a -> b) -> Stream a -> Stream b
 {-# INLINE_STREAM map #-}
 map f (Stream step s n) = Stream step' s n
index 9518ce5..015a397 100644 (file)
@@ -15,7 +15,7 @@ import           Data.Vector.Stream ( Step(..), Stream(..) )
 import Control.Exception ( assert )
 import Control.Monad.ST  ( ST, runST )
 
 import Control.Exception ( assert )
 import Control.Monad.ST  ( ST, runST )
 
-import Prelude hiding ( length )
+import Prelude hiding ( length, (++) )
 
 data Vector a = Vector {-# UNPACK #-} !Int
                        {-# UNPACK #-} !Int
 
 data Vector a = Vector {-# UNPACK #-} !Int
                        {-# UNPACK #-} !Int
@@ -77,6 +77,10 @@ at :: Unbox a => Vector a -> Int -> a
 at v i = assert (i >= 0 && i < length v)
        $ unsafeAt v i
 
 at v i = assert (i >= 0 && i < length v)
        $ unsafeAt v i
 
+infixr ++
+(++) :: Unbox a => Vector a -> Vector a -> Vector a
+{-# INLINE (++) #-}
+v ++ w = unstream (stream v Stream.++ stream w)
 
 map :: (Unbox a, Unbox b) => (a -> b) -> Vector a -> Vector b
 {-# INLINE map #-}
 
 map :: (Unbox a, Unbox b) => (a -> b) -> Vector a -> Vector b
 {-# INLINE map #-}