content: module Axel.Haskell.Language where
  
  import Axel.Prelude
  
  import Data.Char (isSymbol, toUpper)
  
  -- https://stackoverflow.com/questions/10548170/what-characters-are-permitted-for-haskell-operators
  isOperator :: String -> Bool
  isOperator = all $ \x -> isSymbol x || x `elem` map fst haskellOperatorSymbols
  
  type SymbolReplacementMap = [(String, String)]
  
  mkHygenicReplacementMap :: [(a, String)] -> [(a, String)]
  mkHygenicReplacementMap =
    map (\(symbol, name) -> (symbol, "aXEL_SYMBOL_" <> map toUpper name <> "_"))
  
  haskellOperatorSymbols :: [(Char, String)]
  haskellOperatorSymbols =
    mkHygenicReplacementMap
      [ (':', "colon")
      , ('!', "bang")
      , ('#', "hash")
      , ('$', "dollar")
      , ('%', "percent")
      , ('&', "ampersand")
      , ('+', "plus")
      , ('*', "asterisk")
      , ('/', "slash")
      , ('<', "lessThan")
      , ('>', "greaterThan")
      , ('=', "equals")
      , ('\\', "backslash")
      , ('@', "at")
      , ('?', "questionMark")
      , ('^', "caret")
      , ('-', "hyphen")
      , ('|', "pipe")
      , ('~', "tilde")
      , ('.', "dot")
      , (',', "comma")
      ]
  
  haskellSyntaxSymbols :: [(Char, String)]
  haskellSyntaxSymbols =
    mkHygenicReplacementMap
      [ (';', "semicolon")
      , ('[', "leftBracket")
      , (']', "rightBracket")
      , ('{', "rightBrace")
      , ('}', "leftBrace")
      , ('`', "tilde")
      ]
  
  -- TODO Add a test that this list has no duplicates.
  haskellKeywords :: [(String, String)]
  haskellKeywords =
    mkHygenicReplacementMap $ map (\x -> (x, x)) ["do", "if", "let"]
  