{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveGeneric  #-}

module Language.Dhall.Lexer.Types ( Operator (..)
                                  , Keyword (..)
                                  , TokenType (..)
                                  ) where

import           Control.DeepSeq      (NFData)
import qualified Data.ByteString.Lazy as BSL
import           GHC.Generics         (Generic)
import           GHC.Natural          (Natural)

-- | The operator type holds some special builtin symbols.
data Operator = CombineTok
              | PreferTok
              | ArrowTok -- @→@ or @->@
              | LambdaTok -- @λ@ or @\\@
              | AndTok -- @&&@
              | OrTok -- @||@
              | EqTok -- @==@
              | NeqTok -- @!=@
              | AppendTok -- @++@
              deriving (Eq, Show, Generic, NFData)

-- | Data type for reserved keywords.
data Keyword = KwLet
             | KwIn
             | KwConstructors
             | KwMerge
             | KwForall -- @forall@ or @∀@
             | KwIf
             | KwThen
             | KwElse
             deriving (Eq, Show, Generic, NFData)

-- | This is a data type for tokens, stripped of any annotation.
data TokenType = IntLit !Integer
               | DoubleLit !Double
               | NatLit !Natural
               | BoolLit !Bool
               | Embedded !BSL.ByteString
               | StringLit !BSL.ByteString
               | TypeId !BSL.ByteString
               | QuotedId !BSL.ByteString
               | Identifier !BSL.ByteString
               | Keyword !Keyword
               | Special !BSL.ByteString
               | Operator !Operator
               | BeginSplice -- @${@, only occurs inside a string
               | EndSplice -- @}@
               | StringChunk !BSL.ByteString
               | End
               deriving (Eq, Show, Generic, NFData)