module Azubi.Core.StateExecutor where
import Azubi.Core.Model
class StateExecutor a where
execute :: a -> [State] -> IO ()
class ScriptStateExecuter a where
header :: a -> IO ()
footer :: a -> IO ()
body :: a -> [State] -> IO ()
newtype ScriptExecute a = ScriptExecute a
instance ScriptStateExecuter a => StateExecutor (ScriptExecute a) where
execute (ScriptExecute context) states = do
header context
body context states
footer context
class LocalStateExecute a where
setup :: a -> IO ()
executeState :: a -> State -> IO StateResult
tearDown :: a -> [StateResult] -> IO ()
newtype LocalContext a = LocalContext a
instance LocalStateExecute a => StateExecutor (LocalContext a) where
execute (LocalContext context) states = do
setup context
results <- collectStateResults states
tearDown context results
where
collectStateResults :: [State] -> IO [StateResult]
collectStateResults [] = return []
collectStateResults (x:xs) = do
result <- executeState context x
restResults <- collectStateResults xs
return $ result:restResults