{-# OPTIONS --safe #-}
module Prelude.DecEq where
open import Prelude.Init
record DecEq (A : Type) : Type where
field _≟_ : DecidableEquality A
_==_ : A → A → Bool
_==_ = ⌊_⌋ ∘₂ _≟_
_≠_ : A → A → Bool
x ≠ y = not (x == y)
≟-refl : ∀ (x : A) → (x ≟ x) ≡ yes refl
≟-refl x with refl , p ← dec-yes (x ≟ x) refl = p
_≢?_ = ¬? ∘₂ _≟_
infix 4 _≟_ _==_ _≠_ _≢?_
open import Data.List.Membership.DecPropositional _≟_ public
using (_∈?_; _∉?_)
open DecEq ⦃...⦄ public
private variable
n : ℕ
A B : Type
instance
DecEq-⊤ : DecEq ⊤
DecEq-⊤ ._≟_ _ _ = yes refl
DecEq-Bool : DecEq Bool
DecEq-Bool = record {BP}
where import Data.Bool.Properties as BP
DecEq-ℕ : DecEq ℕ
DecEq-ℕ = record {Nat}
DecEq-Fin : DecEq (Fin n)
DecEq-Fin = record {Fi}
DecEq-List : ⦃ DecEq A ⦄ → DecEq (List A)
DecEq-List ._≟_ = L.≡-dec _≟_
DecEq-Bin : DecEq Bitstring
DecEq-Bin = record {Bin}
DecEq-Maybe : ∀{A} → ⦃ DecEq A ⦄ → DecEq (Maybe A)
DecEq-Maybe ._≟_ nothing nothing = yes refl
DecEq-Maybe ._≟_ (just _) nothing = no (λ where ())
DecEq-Maybe ._≟_ nothing (just _) = no (λ where ())
DecEq-Maybe ._≟_ (just x) (just y) with x ≟ y
... | yes refl = yes refl
... | no ¬p = no (λ where refl → ¬p refl)
DecEq-Sum : ⦃ DecEq A ⦄ → ⦃ DecEq B ⦄ → DecEq (A ⊎ B)
DecEq-Sum ._≟_ (inj₁ x) (inj₁ y) with x ≟ y
... | yes refl = yes refl
... | no ¬p = no (λ where refl → ¬p refl)
DecEq-Sum ._≟_ (inj₁ x) (inj₂ y) = no (λ where ())
DecEq-Sum ._≟_ (inj₂ x) (inj₁ y) = no (λ where ())
DecEq-Sum ._≟_ (inj₂ x) (inj₂ y) with x ≟ y
... | yes refl = yes refl
... | no ¬p = no (λ where refl → ¬p refl)
DecEq-× : ⦃ DecEq A ⦄ → ⦃ DecEq B ⦄ → DecEq (A × B)
DecEq-× ._≟_ (x , y) (x′ , y′) with x ≟ x′ | y ≟ y′
... | yes refl | yes refl = yes refl
... | no ¬eq | _ = no λ where refl → ¬eq refl
... | _ | no ¬eq = no λ where refl → ¬eq refl