{-# LANGUAGE OverloadedStrings #-}
module Axel.Haskell.Macros where
import Axel
       (applyInfix_AXEL_AUTOGENERATED_MACRO_DEFINITION,
        def_AXEL_AUTOGENERATED_MACRO_DEFINITION)
import Axel.Haskell.Language
       (haskellOperatorSymbols, haskellSyntaxSymbols, isOperator)
import qualified Axel.Parse as Parse (syntaxSymbols)
import Data.List (foldl')
import qualified Data.Text as T
       (isSuffixOf, pack, replace, singleton, unpack)
hygenisizeMacroName oldName
  = (let suffix
           = if (isOperator oldName) then "%%%%%%%%%%" else
               "_AXEL_AUTOGENERATED_MACRO_DEFINITION"
         suffixedName
           = if (T.isSuffixOf (T.pack suffix) (T.pack oldName)) then oldName
               else ((<>) oldName suffix)
       in
       (T.unpack
          (foldl'
             (\ acc ((,) old new) ->
                (T.replace (T.singleton old) (T.pack new) acc))
             (T.pack suffixedName)
             (filter (\ ((,) sym _) -> (notElem sym Parse.syntaxSymbols))
                ((<>) haskellSyntaxSymbols haskellOperatorSymbols)))))
  where

hygenisizeMacroName :: ((->) String String)