module Test.Dataflow (
  runDataflow
) where

import           Control.Concurrent.STM.TVar (newTVarIO, readTVarIO)
import           Control.Monad               (void)
import           Control.Monad.IO.Class      (MonadIO (..))
import           Dataflow                    (Dataflow, Edge, compile, execute,
                                              outputTVar)
import           Prelude

-- | Run a dataflow with a list of inputs.
--
-- @since 0.1.0.0
runDataflow :: MonadIO io => (Edge o -> Dataflow (Edge i)) -> [i] -> io [o]
runDataflow dataflow inputs =
  liftIO $ do
    out     <- newTVarIO []
    program <- compile (dataflow =<< outputTVar (:) out)

    void $ execute inputs program

    reverse <$> readTVarIO out