Source code on Github
{-# OPTIONS --cubical-compatible #-}
module Class.Setoid.Core where

open import Class.Core
open import Class.Prelude

record ISetoid (A : Type ) : Typeω where
  infix 4 _≈_ _≉_
  field
    {relℓ} : Level
    _≈_ : Rel A relℓ

  _≉_ : Rel A relℓ
  x  y = ¬ (x  y)

  module Alg≈ = Alg _≈_
open ISetoid ⦃...⦄ public

record SetoidLaws (A : Type )  _ : ISetoid A  : Typeω where
  field isEquivalence : IsEquivalence _≈_

  open IsEquivalence isEquivalence public
    renaming (refl to ≈-refl; sym to ≈-sym; trans to ≈-trans; reflexive to ≈-reflexive)

  mkSetoid : Setoid  relℓ
  mkSetoid = record {Carrier = A; _≈_ = _≈_; isEquivalence = isEquivalence}

  import Relation.Binary.Reasoning.Setoid as BinSetoid
  module ≈-Reasoning = BinSetoid mkSetoid
open SetoidLaws ⦃...⦄ public

_⟶_ : (A : Type ) (B : Type ℓ′)
      _ : ISetoid A    SetoidLaws A 
      _ : ISetoid B    SetoidLaws B 
     Type _
A  B = Func (mkSetoid {A = A}) (mkSetoid {A = B})
  where open import Function.Bundles

mkISetoid≡ : ISetoid A
mkISetoid≡ = λ where
  .relℓ  _
  ._≈_  _≡_

mkSetoidLaws≡ : SetoidLaws A  mkISetoid≡ 
mkSetoidLaws≡ .isEquivalence = PropEq.isEquivalence
  where import Relation.Binary.PropositionalEquality as PropEq