module DDC.Source.Tetra.Transform.Defix.FixTable
( FixTable (..)
, FixDef (..)
, InfixAssoc (..)
, lookupDefInfixOfSymbol
, lookupDefPrefixOfSymbol
, getInfixDefOfSymbol
, defaultFixTable)
where
import DDC.Source.Tetra.Transform.Defix.Error
import DDC.Source.Tetra.Exp.Generic
import DDC.Source.Tetra.Prim
import Data.List
import qualified DDC.Type.Exp as T
data FixTable l
= FixTable [FixDef l]
data FixDef l
= FixDefPrefix
{
fixDefSymbol :: String
, fixDefExp :: GAnnot l -> GExp l }
| FixDefInfix
{
fixDefSymbol :: String
, fixDefExp :: GAnnot l -> GExp l
, fixDefAssoc :: InfixAssoc
, fixDefPrec :: Int }
data InfixAssoc
= InfixLeft
| InfixRight
| InfixNone
deriving (Show, Eq)
lookupDefInfixOfSymbol :: FixTable l -> String -> Maybe (FixDef l)
lookupDefInfixOfSymbol (FixTable defs) str
= find (\def -> case def of
FixDefInfix{} -> fixDefSymbol def == str
_ -> False)
defs
lookupDefPrefixOfSymbol :: FixTable l -> String -> Maybe (FixDef l)
lookupDefPrefixOfSymbol (FixTable defs) str
= find (\def -> case def of
FixDefPrefix{} -> fixDefSymbol def == str
_ -> False)
defs
getInfixDefOfSymbol
:: GAnnot l
-> FixTable l
-> String
-> Either (Error l) (FixDef l)
getInfixDefOfSymbol a table str
= case lookupDefInfixOfSymbol table str of
Nothing -> Left (ErrorNoInfixDef a str)
Just def -> Right def
defaultFixTable :: GBound l ~ T.Bound Name => FixTable l
defaultFixTable
= FixTable
[ FixDefPrefix "-" (xvar "neg")
, FixDefPrefix "¬" (xvar "not")
, FixDefInfix "∘" (xvar "compose") InfixRight 9
, FixDefInfix "*" (xvar "mul") InfixLeft 7
, FixDefInfix "+" (xvar "add") InfixLeft 6
, FixDefInfix "-" (xvar "sub") InfixLeft 6
, FixDefInfix "∪" (xvar "intersect") InfixLeft 6
, FixDefInfix "∩" (xvar "union") InfixLeft 6
, FixDefInfix "==" (xvar "eq") InfixNone 4
, FixDefInfix "/=" (xvar "neq") InfixNone 4
, FixDefInfix "<" (xvar "lt") InfixNone 4
, FixDefInfix "<=" (xvar "le") InfixNone 4
, FixDefInfix ">" (xvar "gt") InfixNone 4
, FixDefInfix ">=" (xvar "ge") InfixNone 4
, FixDefInfix "/\\" (xvar "and") InfixRight 3
, FixDefInfix "∧" (xvar "and") InfixRight 3
, FixDefInfix "\\/" (xvar "or") InfixRight 3
, FixDefInfix "∨" (xvar "or") InfixRight 3
, FixDefInfix "$" (xvar "apply") InfixRight 1
, FixDefInfix "%" (xvar "paste") InfixRight 6
, FixDefInfix "%%" (xvar "pastes") InfixRight 6
]
where xvar str sp
= XVar sp (T.UName (NameVar str))