    -----------------------------------------------------------------------------
    -- |
    -- Module      : Data.Array.Parallel.Stream.Flat.Random
    -- Copyright   : (c) 2006 Roman Leshchinskiy
    -- License     : see libraries/ndp/LICENSE
    --
    -- Maintainer  : Roman Leshchinskiy <rl@cse.unsw.edu.au>
    -- Stability   : internal
    -- Portability : non-portable (existentials)
    --
    --
    -- Random streams
    --

    {-# LANGUAGE CPP #-}

    #include "fusion-phases.h"

    module Data.Array.Parallel.Stream.Flat.Random (
      randomS, randomRS
    ) where

    import Data.Array.Parallel.Base
    import Data.Array.Parallel.Stream.Flat.Stream

    import System.Random

    randomS :: (RandomGen g, Random a) => Int -> g -> Stream a
    {-# INLINE_STREAM randomS #-}
    randomS n g = Stream step (Lazy g :*: n) n
      where
        {-# INLINE step #-}
        step (Lazy g :*: 0) = Done
        step (Lazy g :*: n) = let (x,g') = random g
                              in Yield x (Lazy g' :*: (n-1))

    randomRS :: (RandomGen g, Random a) => Int -> (a,a) -> g -> Stream a
    {-# INLINE_STREAM randomRS #-}
    randomRS n r g = Stream step (Lazy g :*: n) n
      where
        {-# INLINE step #-}
        step (Lazy g :*: 0) = Done
        step (Lazy g :*: n) = let (x,g') = randomR r g
                              in Yield x (Lazy g' :*: (n-1))