{-|
Module      : Parsley.Internal.Backend.Machine.Types.State
Description : Partially static components of a parser
License     : BSD-3-Clause
Maintainer  : Jamie Willis
Stability   : experimental

This module contains the runtime state of a parser, which is
is partially static, since there are many refinements that can be
used to improve it but ultimately, most of this exists at runtime
in some form or another.

@since 1.4.0.0
-}
module Parsley.Internal.Backend.Machine.Types.State (
    Γ(..), OpStack(..),
  ) where

import Parsley.Internal.Backend.Machine.Defunc        (Defunc)
import Parsley.Internal.Backend.Machine.Types.Input   (Input)
import Parsley.Internal.Backend.Machine.Types.Statics (StaCont, AugmentedStaHandler)
import Parsley.Internal.Common.Vec                    (Vec)

{-|
The stack that represents the applicative arguments to a parser.
These values, when converted to @Code@ will appear in the generated
code, but can be manipulated and combined using this stack, which will
not appear in the generated code.

@since 1.4.0.0
-}
data OpStack xs where
  -- | The empty stack, with no operands available.
  Empty :: OpStack '[]
  -- | A pushed item on the stack, which takes the form of a defunctionalised value.
  Op :: Defunc x -> OpStack xs -> OpStack (x ': xs)

{-|
A record that bundles together all of the runtime components
of a parser in their variously statically augmented forms.

@since 1.4.0.0
-}
data Γ s o xs n r a = Γ { Γ s o xs n r a -> OpStack xs
operands :: !(OpStack xs)                        -- ^ The current values available for applicative application.
                        , Γ s o xs n r a -> StaCont s o a r
retCont  :: !(StaCont s o a r)                   -- ^ The current return continuation when this parser is finished.
                        , Γ s o xs n r a -> Input o
input    :: !(Input o)                           -- ^ The current offset into the input of the parser.
                        , Γ s o xs n r a -> Vec n (AugmentedStaHandler s o a)
handlers :: !(Vec n (AugmentedStaHandler s o a)) -- ^ The failure handlers that are used to process failure during a parser.
                        }