module FP.Parser.Effects where

import FP.Prelude
import FP.Pretty
import FP.Parser.Common

-- # ParserEnv

data ParserEnv t = ParserEnv
  { parserEnvRenderFormat  [Format] 
  , parserEnvErrorStack  ([𝕊],𝕊)
  , parserEnvLevel  
  , parserEnvBumped  𝔹
  }
makeLenses ''ParserEnv
makePrettyRecord ''ParserEnv

parserEnv₀  ParserEnv t
parserEnv₀ = ParserEnv [] ([],"<top level>") (𝕟 0) False

-- # ParserOut

data ParserOut t = ParserOut
  { parserOutSuccess  𝔹
  , parserOutError  SourceErrorMaybe t
  }
makeLenses ''ParserOut
makePrettyRecord ''ParserOut

instance Monoid (ParserOut t) where
  null = ParserOut bot null
  ParserOut sd₁ er₁  ParserOut sd₂ er₂ = ParserOut  (sd₁  sd₂) (er₁  er₂)

-- # ParserState

data ParserState t = ParserState
  { parserStateInput  SourceInput t
  , parserStateErrorContext  SourceContextPrefix t
  , parserStateCaptureContext  SourceContextPrefix t
  }
makeLenses ''ParserState
makePrettyRecord ''ParserState

parserState₀  Stream (SourceToken t)  ParserState t
parserState₀ ss = ParserState (sourceInput₀ ss) null null