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