{-# language ApplicativeDo #-} module FlexTask.Interpreter.EvaluationHelper ( syntaxAndSemantics, ) where import Control.Monad.Identity (Identity, runIdentity) import Control.OutputCapable.Blocks (LangM, LangM', Rated, ReportT) import Control.OutputCapable.Blocks.Generic (($>>=)) import Control.OutputCapable.Blocks.Type ( Output, getOutputSequenceWithResult, getOutputSequenceWithRating, ) syntaxAndSemantics :: (String -> LangM' (ReportT Output Identity) b) -> (a -> b -> LangM (ReportT Output Identity)) -> (FilePath -> a -> b -> Rated (ReportT Output IO)) -> String -> FilePath -> a -> IO ([Output], Maybe (Maybe Rational, [Output])) syntaxAndSemantics :: forall b a. (String -> LangM' (ReportT Output Identity) b) -> (a -> b -> LangM (ReportT Output Identity)) -> (String -> a -> b -> Rated (ReportT Output IO)) -> String -> String -> a -> IO ([Output], Maybe (Maybe Rational, [Output])) syntaxAndSemantics String -> LangM' (ReportT Output Identity) b preprocess a -> b -> LangM (ReportT Output Identity) syntax String -> a -> b -> Rated (ReportT Output IO) semantics String input String path a tData = let (Maybe b maybeSyntaxResult, [Output] syntaxOutput) = Identity (Maybe b, [Output]) -> (Maybe b, [Output]) forall a. Identity a -> a runIdentity (Identity (Maybe b, [Output]) -> (Maybe b, [Output])) -> Identity (Maybe b, [Output]) -> (Maybe b, [Output]) forall a b. (a -> b) -> a -> b $ LangM' (ReportT Output Identity) b -> Identity (Maybe b, [Output]) forall (m :: * -> *) a. Functor m => LangM' (ReportT Output m) a -> m (Maybe a, [Output]) getOutputSequenceWithResult (LangM' (ReportT Output Identity) b -> Identity (Maybe b, [Output])) -> LangM' (ReportT Output Identity) b -> Identity (Maybe b, [Output]) forall a b. (a -> b) -> a -> b $ String -> LangM' (ReportT Output Identity) b preprocess String input LangM' (ReportT Output Identity) b -> (b -> LangM' (ReportT Output Identity) b) -> LangM' (ReportT Output Identity) b forall (m :: * -> *) l a b. Monad m => GenericLangM l m a -> (a -> GenericLangM l m b) -> GenericLangM l m b $>>= \b result -> b result b -> LangM (ReportT Output Identity) -> LangM' (ReportT Output Identity) b forall a b. a -> GenericLangM Language (ReportT Output Identity) b -> GenericLangM Language (ReportT Output Identity) a forall (f :: * -> *) a b. Functor f => a -> f b -> f a <$ a -> b -> LangM (ReportT Output Identity) syntax a tData b result in ([Output] syntaxOutput,) (Maybe (Maybe Rational, [Output]) -> ([Output], Maybe (Maybe Rational, [Output]))) -> IO (Maybe (Maybe Rational, [Output])) -> IO ([Output], Maybe (Maybe Rational, [Output])) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> (b -> IO (Maybe Rational, [Output])) -> Maybe b -> IO (Maybe (Maybe Rational, [Output])) forall (t :: * -> *) (m :: * -> *) a b. (Traversable t, Monad m) => (a -> m b) -> t a -> m (t b) forall (m :: * -> *) a b. Monad m => (a -> m b) -> Maybe a -> m (Maybe b) mapM (Rated (ReportT Output IO) -> IO (Maybe Rational, [Output]) forall (m :: * -> *). Functor m => Rated (ReportT Output m) -> m (Maybe Rational, [Output]) getOutputSequenceWithRating (Rated (ReportT Output IO) -> IO (Maybe Rational, [Output])) -> (b -> Rated (ReportT Output IO)) -> b -> IO (Maybe Rational, [Output]) forall b c a. (b -> c) -> (a -> b) -> a -> c . String -> a -> b -> Rated (ReportT Output IO) semantics String path a tData) Maybe b maybeSyntaxResult