{-# 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           Data.Scientific
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
             | KwText
             | KwDouble
             | KwInteger
             | KwList
             | KwNatural
             | KwBool
             | KwOptional
             | KwNatFold
             | KwNatBuild
             | KwNatIsZero
             | KwNatEven
             | KwNatOdd
             | KwNatToInteger
             | KwNatShow
             | KwIntegerShow
             | KwDoubleShow
             | KwListBuild
             | KwListFold
             | KwListLength
             | KwListHead
             | KwListLast
             | KwListIndexed
             | KwListReverse
             | KwOptionalFold
             | KwOptionalBuild
             | KwType
             | KwKind
             deriving (Eq, Show, Generic, NFData)

-- | This is a data type for tokens, stripped of any annotation.
data TokenType = IntLit !Integer
               | DoubleTok !Scientific
               | NatLit !Natural
               | BoolTok !Bool
               | EmbedFile !BSL.ByteString
               | EmbedURL !BSL.ByteString
               | TypeId !BSL.ByteString
               | QuotedId !BSL.ByteString
               | Identifier !BSL.ByteString
               | Keyword !Keyword
               | Special !BSL.ByteString
               | Operator !Operator
               | AtToken !Integer -- for e.g. @x\@0@.
               | BeginSplice -- @${@, only occurs inside a string
               | EndSplice -- @}@
               | StringChunk !BSL.ByteString
               | End
               deriving (Eq, Show, Generic, NFData)