{-# LANGUAGE DeriveFunctor #-}
{-# LANGUAGE OverloadedStrings #-}
module Language.Sexp.Token
( Token (..)
, Prefix (..)
) where
import Data.Text (Text)
import Data.Scientific
import Data.Text.Prettyprint.Doc
import Language.Sexp.Types (Prefix(..))
data Token
= TokLParen
| TokRParen
| TokLBracket
| TokRBracket
| TokLBrace
| TokRBrace
| TokPrefix { getPrefix :: !Prefix }
| TokNumber { getNumber :: !Scientific }
| TokString { getString :: !Text }
| TokSymbol { getSymbol :: !Text }
| TokUnknown { getUnknown :: !Char }
deriving (Show, Eq)
instance Pretty Token where
pretty TokLParen = "left paren '('"
pretty TokRParen = "right paren ')'"
pretty TokLBracket = "left bracket '['"
pretty TokRBracket = "right bracket '['"
pretty TokLBrace = "left brace '{'"
pretty TokRBrace = "right brace '}'"
pretty (TokPrefix c) = "modifier" <+> pretty (show c)
pretty (TokSymbol s) = "symbol" <+> squotes (pretty s) <> squote
pretty (TokNumber n) = "number" <+> pretty (show n)
pretty (TokString s) = "string" <+> pretty (show s)
pretty (TokUnknown u) = "unrecognized" <+> pretty (show u)