{-| Module : Parsley.Internal.Backend.Machine.Types Description : Core machine monads and re-exported internal types. License : BSD-3-Clause Maintainer : Jamie Willis Stability : experimental This module contains the monadic machinery used in the evaluation of a parser machine. It also rexports parts of @Base@ and @Statics@ for compatiblity with the ghc 8.6+ backend, which shares common code for @LetRecBuilder.hs@. @since 1.4.0.0 -} module Parsley.Internal.Backend.Machine.Types ( module Parsley.Internal.Backend.Machine.Types, -- * Compatibility Re-exports module Parsley.Internal.Backend.Machine.Types.Base, module Parsley.Internal.Backend.Machine.Types.Statics ) where import Control.Monad.Reader (Reader, runReader) import Control.Monad.ST (ST) import Parsley.Internal.Backend.Machine.Types.Base (Func) import Parsley.Internal.Backend.Machine.Types.Context (Ctx) import Parsley.Internal.Backend.Machine.Types.State (Γ) import Parsley.Internal.Backend.Machine.Types.Statics (QSubroutine, qSubroutine) import Parsley.Internal.Common.Utils (Code) {-| The monad stack used to evaluate a parser machine, see `run`. @since 1.4.0.0 -} type MachineMonad s o xs n r a = Reader (Ctx s o a) (Γ s o xs n r a -> Code (ST s (Maybe a))) {-| Wraps up the `MachineMonad` type so that it can serve as the carrier of `Parsley.Internal.Common.Indexed.cata4`. @since 1.4.0.0 -} newtype Machine s o xs n r a = Machine { getMachine :: MachineMonad s o xs n r a } {-| Used to execute the evaluator for a parser machine, resulting in the final code to be returned back to the User API. @since 1.4.0.0 -} run :: Machine s o xs n r a -- ^ The action that will generate the final code. -> Γ s o xs n r a -- ^ The informaton that is threaded through the parsing machinery, which appears in some form in the generated code. -> Ctx s o a -- ^ Static information used in the code generation process, but not in the generated code. -> Code (ST s (Maybe a)) -- ^ The code that represents this parser (after having been given an input). run = flip . runReader . getMachine