{-# OPTIONS --cubical-compatible #-}
module Terra.Data.Equality where
open import Terra.Data.Level

private
  variable
     ℓ′ : Level

data _≡_ {T : Set } : T -> T -> Set  where
  refl : {x : T} -> x  x

infix 4 _≡_


{-# BUILTIN EQUALITY _≡_ #-}

≡-elim : {A : Set } {B : A -> A -> Set ℓ′} {x y : A} -> (x  y) -> ((x : A) -> B x x) -> B x y
≡-elim {x = x} refl f = f x

sym : {A : Set } {x y : A} -> x  y -> y  x
sym refl = refl

cong : { A : Set } -> {B : Set ℓ′} -> {x₁ x₂ : A} -> (f : A -> B) -> x₁  x₂ -> f x₁  f x₂
cong f refl = refl

_<≡>_ : {A : Set } {B : Set ℓ′} {x y : A} -> {f g : A -> B} -> f  g -> x  y -> f x  g y
refl <≡> refl = refl

infixl 5 _<≡>_

pure≡ : {A : Set } (x : A) -> x  x
pure≡ x = refl

_→←_ : {A : Set } {x y z : A} -> x  y -> y  z -> x  z
refl →← refl = refl

infixl 5 _→←_

transp : {A B : Set } -> A  B -> A -> B
transp refl x = x

subst : {A : Set } (B : A -> Set ℓ′) {x y : A} (eq : x  y) -> B x -> B y
subst B refl x = x

case≡_of_ : {A : Set } {B : Set ℓ′}
  -> (x : A)
  -> ((y : A) -> x  y -> B)
  -> B
case≡ s of f = f s refl

_∎ : {T : Set } (l : T) -> l  l
_∎ v = refl

_≡⟨⟩_ : {T : Set } -> {b : T} -> (a : T) -> a  b -> a  b
l ≡⟨⟩ r = r

_≡⟨_⟩_ : {T : Set } ->
  {b c : T} ->
  (a : T) ->
  a  b ->
  b  c ->
  a  c
_≡⟨_⟩_ {c = c} l j r = j →← r


infix 3 _∎
infixr 2 _≡⟨⟩_ _≡⟨_⟩_