    {-# LANGUAGE ExistentialQuantification #-}

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

    module Data.Array.Parallel.Stream.Flat.Stream (
      Step(..), Stream(..)
    ) where

    import Data.Array.Parallel.Base (
      Rebox)

    data Step s a = Done
                  | Skip     !s
                  | Yield !a !s

    instance Functor (Step s) where
      fmap f Done        = Done
      fmap f (Skip s)    = Skip s
      fmap f (Yield x s) = Yield (f x) s

    data Stream a = forall s. Rebox s => Stream (s -> Step s a) !s Int