{-# 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)