module SMR.Source.Token where
import Data.Text (Text)


-- | Tokens for for the source language.
data Token
        = KEnd                  -- ^ End of input.
        | KPunc Char            -- ^ Punctuation character.
        | KName Space Text      -- ^ A scoped name.
        | KNat  Integer         -- ^ A literal natural number.
        | KText Text            -- ^ A literal text string.
        deriving (Show, Eq)


-- | Name space of a name.
data Space
        = SVar                  -- ^ Local variable.
        | SMac                  -- ^ Macro name.
        | SSym                  -- ^ Symbol name.
        | SSet                  -- ^ Set name.
        | SPrm                  -- ^ Primitive name.
        | SKey                  -- ^ Keyword (super primitive)
        | SNom                  -- ^ Nominal name.
        deriving (Show, Eq)


-- | Check if a token is equal to the give none.
isToken :: Token -> Token -> Bool
isToken k1 k2 = k1 == k2


-- | Check is token is punctuation using the given character.
isKPunc :: Char -> Token -> Bool
isKPunc c k
 = case k of
        KPunc c' -> c == c'
        _        -> False


-- | Take the name from a token, if any.
takeNameOfToken :: Space -> Token -> Maybe Text
takeNameOfToken ss1 kk
 = case kk of
        KName ss2 n
         | ss1 == ss2   -> Just n
         | otherwise    -> Nothing
        _               -> Nothing


-- | Take the name from a token, if any.
takeAnyNameOfToken :: Token -> Maybe (Space, Text)
takeAnyNameOfToken kk
 = case kk of
        KName ss2 n     -> Just (ss2, n)
        _               -> Nothing


-- | Take the natural number from a token, if any.
takeNatOfToken :: Token -> Maybe Integer
takeNatOfToken kk
 = case kk of
        KNat n          -> Just n
        _               -> Nothing


-- | Take the text string from a token, if any.
takeTextOfToken :: Token -> Maybe Text
takeTextOfToken kk
 = case kk of
        KText tx        -> Just tx
        _               -> Nothing