open import 1Lab.Path
open import 1Lab.Type
open import Data.Float.Base
open import Data.Dec.Base
open import Data.Id.Base
module Data.Reflection.Fixity where
data Associativity : Type where
left-assoc : Associativity
right-assoc : Associativity
non-assoc : Associativity
data Precedence : Type where
related : Float → Precedence
unrelated : Precedence
data Fixity : Type where
fixity : Associativity → Precedence → Fixity
{-# BUILTIN ASSOC Associativity #-}
{-# BUILTIN ASSOCLEFT left-assoc #-}
{-# BUILTIN ASSOCRIGHT right-assoc #-}
{-# BUILTIN ASSOCNON non-assoc #-}
{-# BUILTIN PRECEDENCE Precedence #-}
{-# BUILTIN PRECRELATED related #-}
{-# BUILTIN PRECUNRELATED unrelated #-}
{-# BUILTIN FIXITY Fixity #-}
{-# BUILTIN FIXITYFIXITY fixity #-}
instance
Discrete-Associativity : Discrete Associativity
Discrete-Associativity = Discreteᵢ→discrete λ where
left-assoc left-assoc → yes reflᵢ
left-assoc right-assoc → no (λ ())
left-assoc non-assoc → no (λ ())
right-assoc left-assoc → no (λ ())
right-assoc right-assoc → yes reflᵢ
right-assoc non-assoc → no (λ ())
non-assoc left-assoc → no (λ ())
non-assoc right-assoc → no (λ ())
non-assoc non-assoc → yes reflᵢ
Discrete-Precedence : Discrete Precedence
Discrete-Precedence = Discreteᵢ→discrete λ where
(related x) (related y) → case x ≡ᵢ? y of λ where
(yes reflᵢ) → yes reflᵢ
(no ¬a) → no λ { reflᵢ → ¬a reflᵢ }
(related x) unrelated → no (λ ())
unrelated (related x) → no (λ ())
unrelated unrelated → yes reflᵢ
Discrete-Fixity : Discrete Fixity
Discrete-Fixity = Discreteᵢ→discrete λ where
(fixity a p) (fixity a' p') → case (a ≡ᵢ? a' , p ≡ᵢ? p') of λ where
(yes reflᵢ , yes reflᵢ) → yes reflᵢ
(yes as , no ¬ps) → no λ { reflᵢ → ¬ps reflᵢ }
(no ¬as , _) → no λ { reflᵢ → ¬as reflᵢ }
Number-Precedence : Number Precedence
Number-Precedence .Number.Constraint _ = ⊤
Number-Precedence .Number.fromNat s = related (fromNat s)
suc-precedence : Precedence → Precedence
suc-precedence (related x) = related (x +, 1)
suc-precedence unrelated = unrelated
prec-parens : Precedence → Precedence → Bool
prec-parens (related x) (related y) = y float< x
prec-parens unrelated (related y) = true
prec-parens (related x) unrelated = false
prec-parens unrelated unrelated = true