module Data.Repa.Flow.Simple
        ( module Data.Repa.Flow.States
        , Source
        , Sink

          -- * Evaluation
        , drainS

          -- * Conversions
        , fromList
        , toList
        , takeList

          -- * Finalizers
        , finalize_i
        , finalize_o

          -- * Flow Operators
          -- ** Constructors
        , repeat_i
        , replicate_i
        , prepend_i

          -- ** Mapping
        , map_i,        map_o

          -- ** Connecting
        , dup_oo,       dup_io,         dup_oi
        , connect_i

          -- ** Splitting
        , head_i
        , peek_i

          -- ** Grouping
        , groups_i

          -- ** Packing
        , pack_ii

          -- ** Folding
        , folds_ii

          -- ** Watching
        , watch_i
        , watch_o
        , trigger_o

          -- ** Ignorance
        , ignore_o
        , abandon_o

          -- * Flow IO
          -- ** Sourcing
        , fromFiles
        , sourceBytes
        , sourceRecords

          -- ** Sinking
        , toFiles
        , sinkBytes)
where
import Data.Repa.Flow.States
import Data.Repa.Flow.Simple.Base
import Data.Repa.Flow.Simple.List
import Data.Repa.Flow.Simple.Operator
import Data.Repa.Flow.Simple.IO
import qualified Data.Repa.Flow.Generic.Eval    as G
#include "repa-flow.h"


-- | Pull all available values from the source and push them to the sink.
drainS  :: Monad m
        => Source m a -> Sink m a -> m ()
drainS = G.drainS
{-# INLINE drainS #-}