-- | Functions and type class implementations for working with Hydra's built-in Flow monad

module Hydra.Flows where

import Hydra.Kernel

import qualified Control.Monad as CM
import qualified System.IO as IO


fromFlowIo :: s -> Flow s a -> IO.IO a
fromFlowIo :: forall s a. s -> Flow s a -> IO a
fromFlowIo s
cx Flow s a
f = case Maybe a
mv of
    Just a
v -> a -> IO a
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return a
v
    Maybe a
Nothing -> String -> IO a
forall a. String -> IO a
forall (m :: * -> *) a. MonadFail m => String -> m a
CM.fail (String -> IO a) -> String -> IO a
forall a b. (a -> b) -> a -> b
$ Trace -> String
traceSummary Trace
trace
  where
    FlowState Maybe a
mv s
_ Trace
trace = Flow s a -> s -> Trace -> FlowState s a
forall s x. Flow s x -> s -> Trace -> FlowState s x
unFlow Flow s a
f s
cx Trace
emptyTrace