{-# LANGUAGE GADTs #-}
module Terminal(Terminal(..), terminalToString, terminalToLine, terminalToCol, token_na) where

import TokenInterface

import Data.Maybe

type Line   = Int
type Column = Int

data Terminal token where  -- Todo: data Terminal token vs. data Symbol = ... | Terminal String in CFG.hs ??
  Terminal :: TokenInterface token => String -> Line -> Column -> Maybe token -> Terminal token
  -- Todo: In Maybe token, Just token for parsing, and Nothing is for syntax complection!

token_na :: [Char]
token_na = [Char]
"token n/a"

terminalToString :: TokenInterface token => Terminal token -> String
terminalToString :: Terminal token -> [Char]
terminalToString (Terminal [Char]
text Line
line Line
col (Just token
tok)) =
  [Char]
text [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
" at (" [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Line -> [Char]
forall a. Show a => a -> [Char]
show Line
line [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
", " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Line -> [Char]
forall a. Show a => a -> [Char]
show Line
col [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
"): " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ token -> [Char]
forall token. TokenInterface token => token -> [Char]
fromToken token
tok

terminalToString (Terminal [Char]
text Line
line Line
col Maybe token
Nothing) =
  [Char]
text [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
" at (" [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Line -> [Char]
forall a. Show a => a -> [Char]
show Line
line [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
", " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Line -> [Char]
forall a. Show a => a -> [Char]
show Line
col [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
"): " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
token_na

terminalToLine :: TokenInterface token => Terminal token -> Int
terminalToLine :: Terminal token -> Line
terminalToLine (Terminal [Char]
text Line
line Line
col Maybe token
tok) = Line
line

terminalToCol :: TokenInterface token => Terminal token -> Int
terminalToCol :: Terminal token -> Line
terminalToCol (Terminal [Char]
text Line
line Line
col Maybe token
tok) = Line
col