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