Use new Stream functions
authorRoman Leshchinskiy <rl@cse.unsw.edu.au>
Sun, 6 Jul 2008 17:00:04 +0000 (17:00 +0000)
committerRoman Leshchinskiy <rl@cse.unsw.edu.au>
Sun, 6 Jul 2008 17:00:04 +0000 (17:00 +0000)
Data/Vector.hs
Data/Vector/Unboxed.hs

index dc6faac..9b0bfb9 100644 (file)
@@ -9,7 +9,7 @@ import qualified Data.Vector.Prim    as Prim
 import qualified Data.Vector.Mutable as Mut
 
 import qualified Data.Vector.Stream  as Stream
-import           Data.Vector.Stream ( Step(..), Stream(..) )
+import           Data.Vector.Stream ( Stream )
 
 import Control.Exception ( assert )
 import Control.Monad.ST  ( ST, runST )
@@ -44,20 +44,20 @@ new' n x init = runST (
 
 stream :: Vector a -> Stream a
 {-# INLINE_STREAM stream #-}
-stream (Vector i n arr) = Stream get i n
+stream (Vector i n arr) = Stream.unfold get i n
   where
     n' = n+i
 
     {-# INLINE get #-}
-    get j | j < n'    = Prim.at' arr j $ \x -> Yield x (j+1)
-          | otherwise = Done
+    get j | j < n'    = Prim.at' arr j $ \x -> Just (x, j+1)
+          | otherwise = Nothing
 
 unstream :: Stream a -> Vector a
 {-# INLINE_STREAM unstream #-}
-unstream s@(Stream _ _ n) = new n (\mv ->
+unstream s = new (Stream.bound s) (\mv ->
   do
-    n' <- Mut.fill mv s
-    return $ Mut.slice mv 0 n'
+    n <- Mut.fill mv s
+    return $ Mut.slice mv 0 n
   )
 
 {-# RULES
index 015a397..7daef6a 100644 (file)
@@ -10,7 +10,7 @@ import qualified Data.Vector.Unboxed.Mutable as Mut
 import           Data.Vector.Unboxed.Unbox ( Unbox )
 
 import qualified Data.Vector.Stream as Stream
-import           Data.Vector.Stream ( Step(..), Stream(..) )
+import           Data.Vector.Stream ( Stream )
 
 import Control.Exception ( assert )
 import Control.Monad.ST  ( ST, runST )
@@ -35,20 +35,20 @@ new n init = runST (
 
 stream :: Unbox a => Vector a -> Stream a
 {-# INLINE_STREAM stream #-}
-stream (Vector i n arr) = Stream get i n
+stream (Vector i n arr) = Stream.unfold get i n
   where
     n' = n+i
 
     {-# INLINE get #-}
-    get j | j < n'    = Yield (Prim.at arr j) (j+1)
-          | otherwise = Done
+    get j | j < n'    = Just (Prim.at arr j, j+1)
+          | otherwise = Nothing
 
 unstream :: Unbox a => Stream a -> Vector a
 {-# INLINE_STREAM unstream #-}
-unstream s@(Stream _ _ n) = new n (\mv ->
+unstream s = new (Stream.bound s) (\mv ->
   do
-    n' <- Mut.fill mv s
-    return $ Mut.slice mv 0 n'
+    n <- Mut.fill mv s
+    return $ Mut.slice mv 0 n
   )
 
 {-# RULES