Add generate
authorRoman Leshchinskiy <rl@cse.unsw.edu.au>
Wed, 9 Dec 2009 00:14:28 +0000 (00:14 +0000)
committerRoman Leshchinskiy <rl@cse.unsw.edu.au>
Wed, 9 Dec 2009 00:14:28 +0000 (00:14 +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 7cee390..0db69d8 100644 (file)
@@ -19,7 +19,7 @@ module Data.Vector (
   length, null,
 
   -- * Construction
-  empty, singleton, cons, snoc, replicate, (++), copy,
+  empty, singleton, cons, snoc, replicate, generate, (++), copy,
 
   -- * Accessing individual elements
   (!), head, last, indexM, headM, lastM,
@@ -159,6 +159,12 @@ replicate :: Int -> a -> Vector a
 {-# INLINE replicate #-}
 replicate = G.replicate
 
+-- | Generate a vector of the given length by applying the function to each
+-- index
+generate :: Int -> (Int -> a) -> Vector a
+{-# INLINE generate #-}
+generate = G.generate
+
 -- | Prepend an element
 cons :: a -> Vector a -> Vector a
 {-# INLINE cons #-}
index c41fbfb..040cc67 100644 (file)
@@ -26,7 +26,7 @@ module Data.Vector.Fusion.Stream (
   length, null,
 
   -- * Construction
-  empty, singleton, cons, snoc, replicate, (++),
+  empty, singleton, cons, snoc, replicate, generate, (++),
 
   -- * Accessing individual elements
   head, last, (!!),
@@ -161,6 +161,11 @@ replicate :: Int -> a -> Stream a
 {-# INLINE replicate #-}
 replicate = M.replicate
 
+-- | Generate a stream from its indices
+generate :: Int -> (Int -> a) -> Stream a
+{-# INLINE generate #-}
+generate = M.generate
+
 -- | Prepend an element
 cons :: a -> Stream a -> Stream a
 {-# INLINE cons #-}
index e495368..d8ec6d8 100644 (file)
@@ -22,7 +22,7 @@ module Data.Vector.Fusion.Stream.Monadic (
   length, null,
 
   -- * Construction
-  empty, singleton, cons, snoc, replicate, (++),
+  empty, singleton, cons, snoc, replicate, generate, generateM, (++),
 
   -- * Accessing elements
   head, last, (!!),
@@ -164,6 +164,21 @@ replicate n x = Stream (return . step) n (Exact (delay_inline max n 0))
     step i | i > 0     = Yield x (i-1)
            | otherwise = Done
 
+generate :: Monad m => Int -> (Int -> a) -> Stream m a
+{-# INLINE generate #-}
+generate n f = generateM n (return . f)
+
+-- | Generate a stream from its indices
+generateM :: Monad m => Int -> (Int -> m a) -> Stream m a
+{-# INLINE_STREAM generateM #-}
+generateM n f = n `seq` Stream step 0 (Exact (delay_inline max n 0))
+  where
+    {-# INLINE_INNER step #-}
+    step i | i < n     = do
+                           x <- f i
+                           return $ Yield x (i+1)
+           | otherwise = return Done
+
 -- | Prepend an element
 cons :: Monad m => a -> Stream m a -> Stream m a
 {-# INLINE cons #-}
index c082e8f..d777f37 100644 (file)
@@ -20,7 +20,7 @@ module Data.Vector.Generic (
   length, null,
 
   -- * Construction
-  empty, singleton, cons, snoc, replicate, (++), copy,
+  empty, singleton, cons, snoc, replicate, generate, (++), copy,
 
   -- * Accessing individual elements
   (!), head, last, indexM, headM, lastM,
@@ -257,6 +257,12 @@ replicate n x = elemseq (undefined :: v a) x
               $ unstream
               $ Stream.replicate n x
 
+-- | Generate a vector of the given length by applying the function to each
+-- index
+generate :: Vector v a => Int -> (Int -> a) -> v a
+{-# INLINE generate #-}
+generate n f = unstream (Stream.generate n f)
+
 -- | Prepend an element
 cons :: forall v a. Vector v a => a -> v a -> v a
 {-# INLINE cons #-}
index 4cec20b..7eae262 100644 (file)
@@ -19,7 +19,7 @@ module Data.Vector.Primitive (
   length, null,
 
   -- * Construction
-  empty, singleton, cons, snoc, replicate, (++), copy,
+  empty, singleton, cons, snoc, replicate, generate, (++), copy,
 
   -- * Accessing individual elements
   (!), head, last,
@@ -160,6 +160,12 @@ replicate :: Prim a => Int -> a -> Vector a
 {-# INLINE replicate #-}
 replicate = G.replicate
 
+-- | Generate a vector of the given length by applying the function to each
+-- index
+generate :: Prim a => Int -> (Int -> a) -> Vector a
+{-# INLINE generate #-}
+generate = G.generate
+
 -- | Prepend an element
 cons :: Prim a => a -> Vector a -> Vector a
 {-# INLINE cons #-}
index 43f933e..cbaeaee 100644 (file)
@@ -19,7 +19,7 @@ module Data.Vector.Storable (
   length, null,
 
   -- * Construction
-  empty, singleton, cons, snoc, replicate, (++), copy,
+  empty, singleton, cons, snoc, replicate, generate, (++), copy,
 
   -- * Accessing individual elements
   (!), head, last,
@@ -191,6 +191,12 @@ replicate :: Storable a => Int -> a -> Vector a
 {-# INLINE replicate #-}
 replicate = G.replicate
 
+-- | Generate a vector of the given length by applying the function to each
+-- index
+generate :: Storable a => Int -> (Int -> a) -> Vector a
+{-# INLINE generate #-}
+generate = G.generate
+
 -- | Prepend an element
 cons :: Storable a => a -> Vector a -> Vector a
 {-# INLINE cons #-}
index 3b5d76e..b746268 100644 (file)
@@ -17,7 +17,7 @@ module Data.Vector.Unboxed (
   length, null,
 
   -- * Construction
-  empty, singleton, cons, snoc, replicate, (++), copy,
+  empty, singleton, cons, snoc, replicate, generate, (++), copy,
 
   -- * Accessing individual elements
   (!), head, last,
@@ -132,6 +132,12 @@ replicate :: Unbox a => Int -> a -> Vector a
 {-# INLINE replicate #-}
 replicate = G.replicate
 
+-- | Generate a vector of the given length by applying the function to each
+-- index
+generate :: Unbox a => Int -> (Int -> a) -> Vector a
+{-# INLINE generate #-}
+generate = G.generate
+
 -- | Prepend an element
 cons :: Unbox a => a -> Vector a -> Vector a
 {-# INLINE cons #-}