{-# LANGUAGE RecordWildCards #-}
module Dataflow (
Dataflow,
Edge,
Timestamp,
StateRef,
send,
readState,
writeState,
modifyState,
statefulVertex,
statelessVertex,
outputTVar,
Program,
compile,
execute
) where
import Control.Monad (void)
import Control.Monad.State.Strict (execStateT, runStateT)
import Data.Traversable (Traversable)
import Dataflow.Primitives
import Dataflow.Vertices
data Program i = Program {
programInput :: Edge i,
programState :: DataflowState
}
compile :: Dataflow (Edge i) -> IO (Program i)
compile (Dataflow actions) = uncurry Program <$> runStateT actions initDataflowState
execute :: Traversable t => t i -> Program i -> IO ()
execute corpus Program{..} = execDataflow feedInput
where
feedInput = input corpus programInput
execDataflow action = void $ execStateT (runDataflow action) programState