Add iterate function
authorKhudyakov Alexey <alexey.skladnoy@gmail.com>
Tue, 4 Jan 2011 14:43:12 +0000 (14:43 +0000)
committerKhudyakov Alexey <alexey.skladnoy@gmail.com>
Tue, 4 Jan 2011 14:43:12 +0000 (14:43 +0000)
Data/Vector.hs
Data/Vector/Fusion/Stream.hs
Data/Vector/Fusion/Stream/Monadic.hs
Data/Vector/Generic.hs
Data/Vector/Primitive.hs
Data/Vector/Storable.hs
Data/Vector/Unboxed.hs

index 745665b..7951df9 100644 (file)
@@ -46,7 +46,7 @@ module Data.Vector (
   -- * Construction
 
   -- ** Initialisation
-  empty, singleton, replicate, generate,
+  empty, singleton, replicate, generate, iterate,
 
   -- ** Monadic initialisation
   replicateM, generateM, create,
@@ -168,7 +168,7 @@ import Prelude hiding ( length, null,
                         filter, takeWhile, dropWhile, span, break,
                         elem, notElem,
                         foldl, foldl1, foldr, foldr1,
-                        all, any, and, or, sum, product, minimum, maximum,
+                        all, any, and, or, sum, product, minimum, maximum, iterate,
                         scanl, scanl1, scanr, scanr1,
                         enumFromTo, enumFromThenTo,
                         mapM, mapM_, sequence, sequence_ )
@@ -459,6 +459,11 @@ generate :: Int -> (Int -> a) -> Vector a
 {-# INLINE generate #-}
 generate = G.generate
 
+-- | /O(n)/ Apply function n times to value. Zeroth element is original value.
+iterate :: Int -> (a -> a) -> a -> Vector a
+{-# INLINE iterate #-}
+iterate = G.iterate
+
 -- Unfolding
 -- ---------
 
index 077a0f3..cd8187c 100644 (file)
@@ -55,7 +55,7 @@ module Data.Vector.Fusion.Stream (
   and, or,
 
   -- * Unfolding
-  unfoldr, unfoldrN,
+  unfoldr, unfoldrN, iterate,
 
   -- * Scans
   prescanl, prescanl',
@@ -90,6 +90,7 @@ import Prelude hiding ( length, null,
                         elem, notElem,
                         foldl, foldl1, foldr, foldr1,
                         and, or,
+                        iterate,
                         scanl, scanl1,
                         enumFromTo, enumFromThenTo,
                         mapM, mapM_ )
@@ -418,6 +419,11 @@ unfoldrN :: Int -> (s -> Maybe (a, s)) -> s -> Stream a
 {-# INLINE unfoldrN #-}
 unfoldrN = M.unfoldrN
 
+-- | Apply function n-1 times to value. Zeroth element is original value.
+iterate :: Int -> (a -> a) -> a -> Stream a
+{-# INLINE iterate #-}
+iterate = M.iterate
+
 -- Scans
 -- -----
 
index 81bf098..7e26a1a 100644 (file)
@@ -56,6 +56,7 @@ module Data.Vector.Fusion.Stream.Monadic (
   -- * Unfolding
   unfoldr, unfoldrM,
   unfoldrN, unfoldrNM,
+  iterate, iterateM,
 
   -- * Scans
   prescanl, prescanlM, prescanl', prescanlM',
@@ -86,6 +87,7 @@ import Prelude hiding ( length, null,
                         elem, notElem,
                         foldl, foldl1, foldr, foldr1,
                         and, or,
+                        iterate,
                         scanl, scanl1,
                         enumFromTo, enumFromThenTo )
 
@@ -993,6 +995,22 @@ unfoldrNM n f s = Stream step (s,n) (Max (delay_inline max n 0))
                                  Nothing     -> Done
                              ) (f s)
 
+-- | Apply monadic function n times to value. Zeroth element is original value.
+iterateM :: Monad m => Int -> (a -> m a) -> a -> Stream m a
+{-# INLINE_STREAM iterateM #-}
+iterateM n f x0 = Stream step (x0,n) (Exact (delay_inline max n 0))
+  where
+    {-# INLINE_INNER step #-}
+    step (x,i) | i <= 0    = return Done
+               | i == n    = return $ Yield x (x,i-1)
+               | otherwise = do a <- f x
+                                return $ Yield a (a,i-1)
+
+-- | Apply function n times to value. Zeroth element is original value.
+iterate :: Monad m => Int -> (a -> a) -> a -> Stream m a
+{-# INLINE_STREAM iterate #-}
+iterate n f x0 = iterateM n (return . f) x0
+
 -- Scans
 -- -----
 
index dc6f9b7..daf27ae 100644 (file)
@@ -36,7 +36,7 @@ module Data.Vector.Generic (
   -- * Construction
 
   -- ** Initialisation
-  empty, singleton, replicate, generate,
+  empty, singleton, replicate, generate, iterate,
 
   -- ** Monadic initialisation
   replicateM, generateM, create,
@@ -183,7 +183,7 @@ import Prelude hiding ( length, null,
                         filter, takeWhile, dropWhile, span, break,
                         elem, notElem,
                         foldl, foldl1, foldr, foldr1,
-                        all, any, and, or, sum, product, maximum, minimum,
+                        all, any, and, or, sum, product, maximum, minimum, iterate,
                         scanl, scanl1, scanr, scanr1,
                         enumFromTo, enumFromThenTo,
                         mapM, mapM_, sequence, sequence_ )
@@ -515,6 +515,11 @@ generate :: Vector v a => Int -> (Int -> a) -> v a
 {-# INLINE generate #-}
 generate n f = unstream (Stream.generate n f)
 
+-- | /O(n)/ Apply function n times to value. Zeroth element is original value.
+iterate :: Vector v a => Int -> (a -> a) -> a -> v a
+{-# INLINE iterate #-}
+iterate n f x = unstream (Stream.iterate n f x)
+
 -- Unfolding
 -- ---------
 
index bf0714c..3195097 100644 (file)
@@ -39,7 +39,7 @@ module Data.Vector.Primitive (
   -- * Construction
 
   -- ** Initialisation
-  empty, singleton, replicate, generate,
+  empty, singleton, replicate, generate, iterate,
 
   -- ** Monadic initialisation
   replicateM, generateM, create,
@@ -152,7 +152,7 @@ import Prelude hiding ( length, null,
                         filter, takeWhile, dropWhile, span, break,
                         elem, notElem,
                         foldl, foldl1, foldr, foldr1,
-                        all, any, sum, product, minimum, maximum,
+                        all, any, sum, product, minimum, maximum, iterate,
                         scanl, scanl1, scanr, scanr1,
                         enumFromTo, enumFromThenTo,
                         mapM, mapM_ )
@@ -454,6 +454,11 @@ generate :: Prim a => Int -> (Int -> a) -> Vector a
 {-# INLINE generate #-}
 generate = G.generate
 
+-- | /O(n)/ Apply function n times to value. Zeroth element is original value.
+iterate :: Prim a => Int -> (a -> a) -> a -> Vector a
+{-# INLINE iterate #-}
+iterate = G.iterate
+
 -- Unfolding
 -- ---------
 
index 4ab78b0..19f8fb8 100644 (file)
@@ -36,7 +36,7 @@ module Data.Vector.Storable (
   -- * Construction
 
   -- ** Initialisation
-  empty, singleton, replicate, generate,
+  empty, singleton, replicate, generate, iterate,
 
   -- ** Monadic initialisation
   replicateM, generateM, create,
@@ -155,7 +155,7 @@ import Prelude hiding ( length, null,
                         filter, takeWhile, dropWhile, span, break,
                         elem, notElem,
                         foldl, foldl1, foldr, foldr1,
-                        all, any, and, or, sum, product, minimum, maximum,
+                        all, any, and, or, sum, product, minimum, maximum, iterate,
                         scanl, scanl1, scanr, scanr1,
                         enumFromTo, enumFromThenTo,
                         mapM, mapM_ )
@@ -463,6 +463,11 @@ generate :: Storable a => Int -> (Int -> a) -> Vector a
 {-# INLINE generate #-}
 generate = G.generate
 
+-- | /O(n)/ Apply function n times to value. Zeroth element is original value.
+iterate :: Storable a => Int -> (a -> a) -> a -> Vector a
+{-# INLINE iterate #-}
+iterate = G.iterate
+
 -- Unfolding
 -- ---------
 
index 8e908d7..b9f89bd 100644 (file)
@@ -59,7 +59,7 @@ module Data.Vector.Unboxed (
   -- * Construction
 
   -- ** Initialisation
-  empty, singleton, replicate, generate,
+  empty, singleton, replicate, generate, iterate,
 
   -- ** Monadic initialisation
   replicateM, generateM, create,
@@ -177,7 +177,7 @@ import Prelude hiding ( length, null,
                         filter, takeWhile, dropWhile, span, break,
                         elem, notElem,
                         foldl, foldl1, foldr, foldr1,
-                        all, any, and, or, sum, product, minimum, maximum,
+                        all, any, and, or, sum, product, minimum, maximum, iterate,
                         scanl, scanl1, scanr, scanr1,
                         enumFromTo, enumFromThenTo,
                         mapM, mapM_ )
@@ -433,6 +433,11 @@ generate :: Unbox a => Int -> (Int -> a) -> Vector a
 {-# INLINE generate #-}
 generate = G.generate
 
+-- | /O(n)/ Apply function n times to value. Zeroth element is original value.
+iterate :: Unbox a => Int -> (a -> a) -> a -> Vector a
+{-# INLINE iterate #-}
+iterate = G.iterate
+
 -- Unfolding
 -- ---------