module Parsley.Internal.Backend.Machine.Types (
module Parsley.Internal.Backend.Machine.Types,
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)
type MachineMonad s o xs n r a = Reader (Ctx s o a) (Γ s o xs n r a -> Code (ST s (Maybe a)))
newtype Machine s o xs n r a = Machine { Machine s o xs n r a -> MachineMonad s o xs n r a
getMachine :: MachineMonad s o xs n r a }
run :: Machine s o xs n r a
-> Γ s o xs n r a
-> Ctx s o a
-> Code (ST s (Maybe a))
run :: Machine s o xs n r a
-> Γ s o xs n r a -> Ctx s o a -> Code (ST s (Maybe a))
run = (Ctx s o a -> Γ s o xs n r a -> Code (ST s (Maybe a)))
-> Γ s o xs n r a -> Ctx s o a -> Code (ST s (Maybe a))
forall a b c. (a -> b -> c) -> b -> a -> c
flip ((Ctx s o a -> Γ s o xs n r a -> Code (ST s (Maybe a)))
-> Γ s o xs n r a -> Ctx s o a -> Code (ST s (Maybe a)))
-> (Machine s o xs n r a
-> Ctx s o a -> Γ s o xs n r a -> Code (ST s (Maybe a)))
-> Machine s o xs n r a
-> Γ s o xs n r a
-> Ctx s o a
-> Code (ST s (Maybe a))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Reader (Ctx s o a) (Γ s o xs n r a -> Code (ST s (Maybe a)))
-> Ctx s o a -> Γ s o xs n r a -> Code (ST s (Maybe a))
forall r a. Reader r a -> r -> a
runReader (Reader (Ctx s o a) (Γ s o xs n r a -> Code (ST s (Maybe a)))
-> Ctx s o a -> Γ s o xs n r a -> Code (ST s (Maybe a)))
-> (Machine s o xs n r a
-> Reader (Ctx s o a) (Γ s o xs n r a -> Code (ST s (Maybe a))))
-> Machine s o xs n r a
-> Ctx s o a
-> Γ s o xs n r a
-> Code (ST s (Maybe a))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Machine s o xs n r a
-> Reader (Ctx s o a) (Γ s o xs n r a -> Code (ST s (Maybe a)))
forall s o (xs :: [Type]) (n :: Nat) r a.
Machine s o xs n r a -> MachineMonad s o xs n r a
getMachine