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

module Relation.Binary.Equivalence.PropTruncated where

open import Agda.Primitive using (Prop)
open import Prelude
open import Relation.Nullary.Stable

infix 4 _≐_
data _≐_ {a} {A : Type a} (x y : A) : Prop a where
  ∣_∣ : x  y  x  y

data ∙⊥ : Prop where

private
  variable
    x y z : A

rerel : ∙⊥  
rerel ()

∙refute : x  y  (x  y  )  ∙⊥
∙refute  x≡y  x≢y with x≢y x≡y
∙refute  x≡y  x≢y | ()

refute : x  y  ¬ (¬ (x  y))
refute x≐y x≢y = rerel (∙refute x≐y x≢y)

unsquash : Stable (x  y)  x  y  x  y
unsquash st x≐y = st (refute x≐y)

∙refl : x  x
∙refl =  refl 

∙trans : x  y  y  z  x  z
∙trans  xy   yz  =  xy ; yz 

∙sym : x  y  y  x
∙sym  p  =  sym p 

∙cong : (f : A  B)  x  y  f x  f y
∙cong f  x≡y  =  cong f x≡y 


module Reasoning where
  infixr 2 ≐˘⟨⟩-syntax ≐⟨∙⟩-syntax

  ≐˘⟨⟩-syntax :  (x : A) {y z}  y  z  y  x  x  z
  ≐˘⟨⟩-syntax _ y≡z y≡x = ∙trans (∙sym y≡x) y≡z

  syntax ≐˘⟨⟩-syntax x y≡z y≡x = x ≐˘⟨ y≡x  y≡z

  ≐⟨∙⟩-syntax :  (x : A) {y z}  y  z  x  y  x  z
  ≐⟨∙⟩-syntax _ y≡z x≡y = ∙trans x≡y y≡z

  syntax ≐⟨∙⟩-syntax x y≡z x≡y = x ≐⟨ x≡y  y≡z

  _≐⟨⟩_ :  (x : A) {y}  x  y  x  y
  _ ≐⟨⟩ x≡y = x≡y

  infix 2.5 _∎
  _∎ :  {A : Type a} (x : A)  x  x
  _∎ x = ∙refl

  infixr 2 ≡˘⟨⟩-syntax ≡⟨∙⟩-syntax

  ≡˘⟨⟩-syntax :  (x : A) {y z}  y  z  y  x  x  z
  ≡˘⟨⟩-syntax _ y≡z y≡x = ∙trans  sym y≡x  y≡z

  syntax ≡˘⟨⟩-syntax x y≡z y≡x = x ≡˘⟨ y≡x  y≡z

  ≡⟨∙⟩-syntax :  (x : A) {y z}  y  z  x  y  x  z
  ≡⟨∙⟩-syntax _ y≡z x≡y = ∙trans  x≡y  y≡z

  syntax ≡⟨∙⟩-syntax x y≡z x≡y = x ≡⟨ x≡y  y≡z