-- |
--
-- Module:      Language.Egison.Parser.Pattern.Prim.ParseMode
-- Description: Parser configuration
-- Stability:   experimental
--
-- A parser configuration type, that contains a set of external parsers

module Language.Egison.Parser.Pattern.Prim.ParseMode
  ( ParseMode(..)
  , ParseFixity(..)
  , ExtParser
  )
where

import           Language.Egison.Syntax.Pattern.Fixity
                                                ( Fixity )
import           Language.Egison.Parser.Pattern.Prim.Source
                                                ( Tokens )


-- | @'ExtParser' s a@ is a type for externally provided parser of @a@.
type ExtParser s a = Tokens s -> Either String a

-- | Fixity of infix operators.
data ParseFixity n s =
  ParseFixity { ParseFixity n s -> Fixity n
fixity :: Fixity n
              , ParseFixity n s -> ExtParser s ()
parser :: ExtParser s ()
              }

-- | Parser configuration.
data ParseMode n v e s
  = ParseMode { ParseMode n v e s -> FilePath
filename        :: FilePath
              , ParseMode n v e s -> [ParseFixity n s]
fixities        :: [ParseFixity n s]
              , ParseMode n v e s -> Maybe (Tokens s, Tokens s)
blockComment    :: Maybe (Tokens s, Tokens s)
              , ParseMode n v e s -> Maybe (Tokens s)
lineComment     :: Maybe (Tokens s)
              , ParseMode n v e s -> ExtParser s v
varNameParser   :: ExtParser s v
              , ParseMode n v e s -> ExtParser s n
nameParser      :: ExtParser s n
              , ParseMode n v e s -> ExtParser s e
valueExprParser :: ExtParser s e
              }