-- | Defines operator precedence.
module Language.Drasil.ModelExpr.Precedence where

import Language.Drasil.ModelExpr.Lang
import Language.Drasil.Expr.Lang (ArithBinOp(..))
import Language.Drasil.Expr.Precedence (prec2Arith, prec2Eq,
  prec2LA, prec2Ord, prec2VVV, prec2VVN, prec2NVV, prec2ESS, prec2ESB,
  precA, precC, prec1, prec1B, prec1VV, prec1VN)

-- These precedences are inspired from Haskell/F#
-- as documented at http://kevincantu.org/code/operators.html
-- They are all multiplied by 10, to leave room to weave things in between

-- | precB - precedence for boolean-related Binary-Associative (Commutative) operators.
precB :: AssocBoolOper -> Int
precB :: AssocBoolOper -> Int
precB AssocBoolOper
And         = Int
120
precB AssocBoolOper
Or          = Int
110
precB AssocBoolOper
Equivalence = Int
100

prec2Spc :: SpaceBinOp -> Int
prec2Spc :: SpaceBinOp -> Int
prec2Spc SpaceBinOp
_ = Int
170

prec2Stat :: StatBinOp -> Int
prec2Stat :: StatBinOp -> Int
prec2Stat StatBinOp
_ = Int
130

-- | eprec - `ModelExpr` precedence.
mePrec :: ModelExpr -> Int
mePrec :: ModelExpr -> Int
mePrec Lit{}                  = Int
500
mePrec Spc{}                  = Int
500
mePrec (AssocA AssocArithOper
op [ModelExpr]
_)          = AssocArithOper -> Int
precA AssocArithOper
op
mePrec (AssocB AssocBoolOper
op [ModelExpr]
_)          = AssocBoolOper -> Int
precB AssocBoolOper
op
mePrec (AssocC AssocConcatOper
op [ModelExpr]
_)          = AssocConcatOper -> Int
precC AssocConcatOper
op
mePrec C{}                    = Int
500
mePrec Deriv{}                = ArithBinOp -> Int
prec2Arith ArithBinOp
Frac
mePrec FCall{}                = Int
210
mePrec Case{}                 = Int
200
mePrec Matrix{}               = Int
220
mePrec Set{}                  = Int
220
mePrec (Variable String
_ ModelExpr
_)         = Int
220
mePrec (UnaryOp UFunc
fn ModelExpr
_)         = UFunc -> Int
prec1 UFunc
fn
mePrec (UnaryOpB UFuncB
fn ModelExpr
_)        = UFuncB -> Int
prec1B UFuncB
fn
mePrec (UnaryOpVV UFuncVV
fn ModelExpr
_)       = UFuncVV -> Int
prec1VV UFuncVV
fn
mePrec (UnaryOpVN UFuncVN
fn ModelExpr
_)       = UFuncVN -> Int
prec1VN UFuncVN
fn
mePrec (Operator AssocArithOper
o DomainDesc t ModelExpr ModelExpr
_ ModelExpr
_)       = AssocArithOper -> Int
precA AssocArithOper
o
mePrec (ArithBinaryOp ArithBinOp
bo ModelExpr
_ ModelExpr
_) = ArithBinOp -> Int
prec2Arith ArithBinOp
bo
mePrec (EqBinaryOp EqBinOp
bo ModelExpr
_ ModelExpr
_)    = EqBinOp -> Int
prec2Eq EqBinOp
bo
mePrec (LABinaryOp LABinOp
bo ModelExpr
_ ModelExpr
_)    = LABinOp -> Int
prec2LA LABinOp
bo
mePrec (SpaceBinaryOp SpaceBinOp
bo ModelExpr
_ ModelExpr
_) = SpaceBinOp -> Int
prec2Spc SpaceBinOp
bo
mePrec (StatBinaryOp StatBinOp
bo ModelExpr
_ ModelExpr
_)  = StatBinOp -> Int
prec2Stat StatBinOp
bo
mePrec (OrdBinaryOp OrdBinOp
bo ModelExpr
_ ModelExpr
_)   = OrdBinOp -> Int
prec2Ord OrdBinOp
bo
mePrec (VVVBinaryOp VVVBinOp
bo ModelExpr
_ ModelExpr
_)   = VVVBinOp -> Int
prec2VVV VVVBinOp
bo
mePrec (VVNBinaryOp VVNBinOp
bo ModelExpr
_ ModelExpr
_)   = VVNBinOp -> Int
prec2VVN VVNBinOp
bo
mePrec (NVVBinaryOp NVVBinOp
bo ModelExpr
_ ModelExpr
_)   = NVVBinOp -> Int
prec2NVV NVVBinOp
bo
mePrec (ESSBinaryOp ESSBinOp
bo ModelExpr
_ ModelExpr
_)   = ESSBinOp -> Int
prec2ESS ESSBinOp
bo
mePrec (ESBBinaryOp ESBBinOp
bo ModelExpr
_ ModelExpr
_)   = ESBBinOp -> Int
prec2ESB ESBBinOp
bo
mePrec RealI{}                = Int
170
mePrec ForAll{}               = Int
130