{-# 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