{-# LANGUAGE OverloadedStrings #-}
module Data.EDN.AST.Lexer
( dropWS
, lexeme
, symbol
, integer
, hexadecimal
, floating
) where
import Data.Text (Text)
import qualified Control.Monad.Combinators as P
import qualified Text.Megaparsec as P
import qualified Text.Megaparsec.Char as P
import qualified Text.Megaparsec.Char.Lexer as L
import Data.EDN.AST.Types (Parser)
dropWS :: Parser ()
dropWS = P.skipMany $ P.choice
[ P.hidden P.space1
, P.hidden $ () <$ P.char ','
, P.hidden $ L.skipLineComment ";"
]
lexeme :: Parser a -> Parser a
lexeme = L.lexeme dropWS
symbol :: Text -> Parser Text
symbol = L.symbol dropWS
integer :: Parser Int
integer = lexeme $ L.signed (pure ()) L.decimal
hexadecimal :: Parser Int
hexadecimal = lexeme L.hexadecimal
floating :: Parser Double
floating = lexeme $ L.signed (pure ()) L.float