------------------------------------------------------------------------
-- The Agda standard library
--
-- Indexed binary relations
------------------------------------------------------------------------

-- The contents of this module should be accessed via
-- `Relation.Binary.Indexed.Heterogeneous`.

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

open import Relation.Binary.Indexed.Heterogeneous.Core

module Relation.Binary.Indexed.Heterogeneous.Structures
  {i a } {I : Set i} (A : I  Set a) (_≈_ : IRel A )
  where

open import Function.Core
open import Level using (suc; _⊔_)
open import Relation.Binary using (_⇒_)
open import Relation.Binary.PropositionalEquality.Core as P using (_≡_)
open import Relation.Binary.Indexed.Heterogeneous.Definitions

------------------------------------------------------------------------
-- Equivalences

record IsIndexedEquivalence : Set (i  a  ) where
  field
    refl  : Reflexive  A _≈_
    sym   : Symmetric  A _≈_
    trans : Transitive A _≈_

  reflexive :  {i}  _≡_  _⇒_  _≈_ {i}
  reflexive P.refl = refl


record IsIndexedPreorder {ℓ₂} (_∼_ : IRel A ℓ₂) : Set (i  a    ℓ₂) where
  field
    isEquivalence : IsIndexedEquivalence
    reflexive     :  {i j}  (_≈_ {i} {j})  _⇒_  _∼_
    trans         : Transitive A _∼_

  module Eq = IsIndexedEquivalence isEquivalence

  refl : Reflexive A _∼_
  refl = reflexive Eq.refl