Specialise enumFromTo for Int
authorRoman Leshchinskiy <rl@cse.unsw.edu.au>
Wed, 2 Dec 2009 10:39:34 +0000 (10:39 +0000)
committerRoman Leshchinskiy <rl@cse.unsw.edu.au>
Wed, 2 Dec 2009 10:39:34 +0000 (10:39 +0000)
Data/Vector/Fusion/Stream.hs
Data/Vector/Fusion/Stream/Monadic.hs
Data/Vector/Generic.hs

index 27b8bae..dd51bd5 100644 (file)
@@ -63,6 +63,9 @@ module Data.Vector.Fusion.Stream (
   scanl, scanl',
   scanl1, scanl1',
 
+  -- * Enumerations
+  enumFromTo,
+
   -- * Conversions
   toList, fromList, liftStream,
 
@@ -86,6 +89,7 @@ import Prelude hiding ( length, null,
                         foldl, foldl1, foldr, foldr1,
                         and, or,
                         scanl, scanl1,
+                        enumFromTo, enumFromThenTo,
                         mapM_ )
 
 -- | The type of pure streams 
@@ -482,6 +486,12 @@ fold1M' :: Monad m => (a -> a -> m a) -> Stream a -> m a
 {-# INLINE fold1M' #-}
 fold1M' m = M.fold1M' m . liftStream
 
+-- Enumerations
+-- ------------
+
+enumFromTo :: Enum a => a -> a -> Stream a
+{-# INLINE enumFromTo #-}
+enumFromTo = M.enumFromTo
 
 -- Conversions
 -- -----------
index 85cee7c..44d5820 100644 (file)
@@ -61,6 +61,9 @@ module Data.Vector.Fusion.Stream.Monadic (
   scanl, scanlM, scanl', scanlM',
   scanl1, scanl1M, scanl1', scanl1M',
 
+  -- * Enumerations
+  enumFromTo,
+
   -- * Conversions
   toList, fromList
 ) where
@@ -79,7 +82,8 @@ import Prelude hiding ( length, null,
                         elem, notElem,
                         foldl, foldl1, foldr, foldr1,
                         and, or,
-                        scanl, scanl1 )
+                        scanl, scanl1,
+                        enumFromTo, enumFromThenTo )
 import qualified Prelude
 
 -- | Result of taking a single step in a stream
@@ -938,6 +942,32 @@ scanl1M' f (Stream step s sz) = Stream step' (s, Nothing) sz
                             Skip    s' -> return $ Skip (s', Just x)
                             Done       -> return Done
 
+-- Enumerations
+-- ------------
+
+-- | Enumerate values from @x@ to @y@
+enumFromTo :: (Enum a, Monad m) => a -> a -> Stream m a
+{-# INLINE_STREAM enumFromTo #-}
+enumFromTo x y = fromList [x .. y]
+
+enumFromTo_IntLike :: (Enum a, Ord a, Monad m) => a -> a -> Stream m a
+{-# INLINE_STREAM enumFromTo_IntLike #-}
+enumFromTo_IntLike x y = Stream step x (Exact n)
+  where
+    n = max (fromEnum y - fromEnum x) 0
+
+    {-# INLINE_INNER step #-}
+    step x | x <= y    = return $ Yield x (succ x)
+           | otherwise = return $ Done
+
+{-# RULES
+
+"enumFromTo<Int> [Stream]"
+  enumFromTo = enumFromTo_IntLike :: Monad m => Int -> Int -> Stream m Int
+
+  #-}
+
+
 -- Conversions
 -- -----------
 
index 16b04bb..781e6ae 100644 (file)
@@ -630,7 +630,7 @@ scanl1' f = unstream . inplace (MStream.scanl1' f) . stream
 
 enumFromTo :: (Vector v a, Enum a) => a -> a -> v a
 {-# INLINE enumFromTo #-}
-enumFromTo from to = fromList [from .. to]
+enumFromTo x y = unstream (Stream.enumFromTo x y)
 
 enumFromThenTo :: (Vector v a, Enum a) => a -> a -> a -> v a
 {-# INLINE enumFromThenTo #-}