module Util.Precedence (
    Precedence(..),
    Associativity(..),
) where

-- | The associativity of an operator
data Associativity = AssocNone | AssocLeft | AssocRight
    deriving (Eq, Ord, Show)

class Precedence a where
    -- | Returns the binding strength of the operator. Higher numbers bind more
    -- loosely.
    precedence :: a -> Int
    precedence _ = 0

    -- | Returns the associativity of the operator.
    associativity :: a -> Associativity
    associativity _ = AssocNone

    -- | True if the two items are the same operator. This is used to decide
    -- when to paranthesise.
    sameOperator :: a -> a -> Bool
    sameOperator _ _ = False