module Drasil.Code.CodeExpr.Precedence (precA, precB, eprec) where

import Drasil.Code.CodeExpr.Lang (CodeExpr(..))
import Language.Drasil.Expr.Precedence (prec2Arith, prec2Eq,
  prec2LA, prec2Ord, prec2VVV, prec2VVN, prec2NVV, prec2ESS, prec2ESB,
  precA, precB, 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

-- | eprec - "Expression" precedence.
eprec :: CodeExpr -> Int
eprec :: CodeExpr -> Int
eprec Lit{}                  = Int
500
eprec (AssocA AssocArithOper
op [CodeExpr]
_)          = AssocArithOper -> Int
precA AssocArithOper
op
eprec (AssocB AssocBoolOper
op [CodeExpr]
_)          = AssocBoolOper -> Int
precB AssocBoolOper
op
eprec (AssocC AssocConcatOper
op [CodeExpr]
_)          = AssocConcatOper -> Int
precC AssocConcatOper
op
eprec C{}                    = Int
500
eprec FCall{}                = Int
210
eprec New{}                  = Int
210
eprec Message{}              = Int
210
eprec Field{}                = Int
210
eprec Case{}                 = Int
200
eprec Matrix{}               = Int
220
eprec Set{}                  = Int
220
eprec (Variable String
_ CodeExpr
_)         = Int
220
eprec (UnaryOp UFunc
fn CodeExpr
_)         = UFunc -> Int
prec1 UFunc
fn
eprec (UnaryOpB UFuncB
fn CodeExpr
_)        = UFuncB -> Int
prec1B UFuncB
fn
eprec (UnaryOpVV UFuncVV
fn CodeExpr
_)       = UFuncVV -> Int
prec1VV UFuncVV
fn
eprec (UnaryOpVN UFuncVN
fn CodeExpr
_)       = UFuncVN -> Int
prec1VN UFuncVN
fn
eprec (Operator AssocArithOper
o DiscreteDomainDesc CodeExpr CodeExpr
_ CodeExpr
_)       = AssocArithOper -> Int
precA AssocArithOper
o
eprec (ArithBinaryOp ArithBinOp
bo CodeExpr
_ CodeExpr
_) = ArithBinOp -> Int
prec2Arith ArithBinOp
bo
eprec (EqBinaryOp EqBinOp
bo CodeExpr
_ CodeExpr
_)    = EqBinOp -> Int
prec2Eq EqBinOp
bo
eprec (LABinaryOp LABinOp
bo CodeExpr
_ CodeExpr
_)    = LABinOp -> Int
prec2LA LABinOp
bo
eprec (OrdBinaryOp OrdBinOp
bo CodeExpr
_ CodeExpr
_)   = OrdBinOp -> Int
prec2Ord OrdBinOp
bo
eprec (VVVBinaryOp VVVBinOp
bo CodeExpr
_ CodeExpr
_)   = VVVBinOp -> Int
prec2VVV VVVBinOp
bo
eprec (VVNBinaryOp VVNBinOp
bo CodeExpr
_ CodeExpr
_)   = VVNBinOp -> Int
prec2VVN VVNBinOp
bo
eprec (NVVBinaryOp NVVBinOp
bo CodeExpr
_ CodeExpr
_)   = NVVBinOp -> Int
prec2NVV NVVBinOp
bo
eprec (ESSBinaryOp ESSBinOp
bo CodeExpr
_ CodeExpr
_)   = ESSBinOp -> Int
prec2ESS ESSBinOp
bo
eprec (ESBBinaryOp ESBBinOp
bo CodeExpr
_ CodeExpr
_)   = ESBBinOp -> Int
prec2ESB ESBBinOp
bo
eprec RealI{}                = Int
170