{-# OPTIONS --without-K --exact-split --safe #-}

open import Fragment.Algebra.Signature

module Fragment.Algebra.Homomorphism.Setoid (Σ : Signature) where

open import Fragment.Algebra.Algebra Σ
open import Fragment.Algebra.Homomorphism.Base Σ

open import Level using (Level; _⊔_)
open import Relation.Binary using (Rel; Setoid; IsEquivalence)

private
  variable
    a b ℓ₁ ℓ₂ : Level

module _
  {A : Algebra {a} {ℓ₁}}
  {B : Algebra {b} {ℓ₂}}
  where

  open Setoid  B ∥/≈

  infix 4 _≗_

  _≗_ : Rel (A  B) (a  ℓ₂)
  f  g =  f ∣⃗ ~  g ∣⃗
    where open import Fragment.Setoid.Morphism renaming (_≗_ to _~_)

  ≗-refl :  {f}  f  f
  ≗-refl = refl

  ≗-sym :  {f g}  f  g  g  f
  ≗-sym f≗g {x} = sym (f≗g {x})

  ≗-trans :  {f g h}  f  g  g  h  f  h
  ≗-trans f≗g g≗h {x} = trans (f≗g {x}) (g≗h {x})

  ≗-isEquivalence : IsEquivalence _≗_
  ≗-isEquivalence = record { refl  = λ {f}  ≗-refl {f}
                           ; sym   = λ {f g}  ≗-sym {f} {g}
                           ; trans = λ {f g h}  ≗-trans {f} {g} {h}
                           }

_⟿_/≗ : Algebra {a} {ℓ₁}  Algebra {b} {ℓ₂}  Setoid _ _
A  B /≗ = record { Carrier       = A  B
                   ; _≈_           = _≗_
                   ; isEquivalence = ≗-isEquivalence
                   }