module Quox.Syntax.Qty.Three import Quox.Pretty import public Quox.Syntax.Qty import Generics.Derive %default total %language ElabReflection public export data Three = Zero | One | Any %name Three pi, rh %runElab derive "Three" [Generic, Meta, Eq, Ord, DecEq, Show] export PrettyHL Three where prettyM pi = hl Qty <$> case pi of Zero => ifUnicode "𝟬" "0" One => ifUnicode "𝟭" "1" Any => ifUnicode "𝛚" "*" public export plus : Three -> Three -> Three plus Zero rh = rh plus pi Zero = pi plus _ _ = Any public export times : Three -> Three -> Three times Zero _ = Zero times _ Zero = Zero times One rh = rh times pi One = pi times Any Any = Any public export data Compat3 : Rel Three where CmpRefl : Compat3 rh rh CmpAny : Compat3 rh Any public export compat3 : Dec2 Compat3 compat3 pi rh with (decEq pi rh) | (decEq rh Any) compat3 pi pi | Yes Refl | _ = Yes CmpRefl compat3 pi Any | No _ | Yes Refl = Yes CmpAny compat3 pi rh | No ne | No na = No $ \case CmpRefl => ne Refl; CmpAny => na Refl public export data IsSubj3 : Pred Three where SZero : IsSubj3 Zero SOne : IsSubj3 One public export isSubj3 : Dec1 IsSubj3 isSubj3 Zero = Yes SZero isSubj3 One = Yes SOne isSubj3 Any = No $ \case _ impossible public export timesSubj3 : forall pi, rh. IsSubj3 pi -> IsSubj3 rh -> IsSubj3 (times pi rh) timesSubj3 SZero SZero = SZero timesSubj3 SZero SOne = SZero timesSubj3 SOne SZero = SZero timesSubj3 SOne SOne = SOne public export data IsGlobal3 : Pred Three where GZero : IsGlobal3 Zero GAny : IsGlobal3 Any isGlobal3 : Dec1 IsGlobal3 isGlobal3 Zero = Yes GZero isGlobal3 One = No $ \case _ impossible isGlobal3 Any = Yes GAny public export IsQty Three where zero = Zero one = One (+) = plus (*) = times IsZero = Equal Zero isZero = decEq Zero zeroIsZero = Refl Compat = Compat3 compat = compat3 IsSubj = IsSubj3 isSubj = isSubj3 zeroIsSubj = SZero oneIsSubj = SOne timesSubj = timesSubj3 IsGlobal = IsGlobal3 isGlobal = isGlobal3 zeroIsGlobal = GZero export Uninhabited (IsGlobal3 One) where uninhabited _ impossible export Uninhabited (IsSubj3 Any) where uninhabited _ impossible