{-# OPTIONS --cubical --safe #-}

module Data.Ternary where

open import Prelude
open import Relation.Nullary.Discrete.FromBoolean

infixl 5 _,0 _,1 _,2
data Tri : Type where
  0t : Tri
  _,0 _,1 _,2 : Tri  Tri

module EqTri where
  infix 4 _≡ᴮ_
  _≡ᴮ_ : Tri  Tri  Bool
  0t   ≡ᴮ 0t   = true
  x ,0 ≡ᴮ y ,0 = x ≡ᴮ y
  x ,1 ≡ᴮ y ,1 = x ≡ᴮ y
  x ,2 ≡ᴮ y ,2 = x ≡ᴮ y
  _    ≡ᴮ _    = false

  sound :  x y  T (x ≡ᴮ y)  x  y
  sound 0t     0t     p = refl
  sound (x ,0) (y ,0) p = cong _,0 (sound x y p)
  sound (x ,1) (y ,1) p = cong _,1 (sound x y p)
  sound (x ,2) (y ,2) p = cong _,2 (sound x y p)

  complete :  x  T (x ≡ᴮ x)
  complete 0t = tt
  complete (x ,0) = complete x
  complete (x ,1) = complete x
  complete (x ,2) = complete x

_≟_ : (x y : Tri)  Dec (x  y)
_≟_ = from-bool-eq record { EqTri }