# Equivalences of types equipped with endomorphisms

```agda
module structured-types.equivalences-types-equipped-with-endomorphisms where
```

<details><summary>Imports</summary>

```agda
open import foundation.action-on-identifications-functions
open import foundation.commuting-squares-of-maps
open import foundation.contractible-types
open import foundation.dependent-pair-types
open import foundation.equivalences
open import foundation.function-types
open import foundation.functoriality-dependent-pair-types
open import foundation.fundamental-theorem-of-identity-types
open import foundation.homotopies
open import foundation.homotopy-induction
open import foundation.identity-types
open import foundation.structure-identity-principle
open import foundation.subtype-identity-principle
open import foundation.torsorial-type-families
open import foundation.type-arithmetic-dependent-pair-types
open import foundation.univalence
open import foundation.universe-levels

open import structured-types.morphisms-types-equipped-with-endomorphisms
open import structured-types.types-equipped-with-endomorphisms
```

</details>

## Definition

### The predicate of being an equivalence of types equipped with endomorphisms

```agda
module _
  {l1 l2 : Level}
  (X : Type-With-Endomorphism l1)
  (Y : Type-With-Endomorphism l2)
  where

  is-equiv-hom-Type-With-Endomorphism :
    hom-Type-With-Endomorphism X Y  UU (l1  l2)
  is-equiv-hom-Type-With-Endomorphism h =
    is-equiv (map-hom-Type-With-Endomorphism X Y h)
```

### Equivalences of types equipped with endomorphisms

```agda
module _
  {l1 l2 : Level}
  (X : Type-With-Endomorphism l1)
  (Y : Type-With-Endomorphism l2)
  where

  equiv-Type-With-Endomorphism : UU (l1  l2)
  equiv-Type-With-Endomorphism =
    Σ ( type-Type-With-Endomorphism X  type-Type-With-Endomorphism Y)
      ( λ e 
        coherence-square-maps
          ( map-equiv e)
          ( endomorphism-Type-With-Endomorphism X)
          ( endomorphism-Type-With-Endomorphism Y)
          ( map-equiv e))

  equiv-Type-With-Endomorphism' : UU (l1  l2)
  equiv-Type-With-Endomorphism' =
    Σ (hom-Type-With-Endomorphism X Y) (is-equiv-hom-Type-With-Endomorphism X Y)

  compute-equiv-Type-With-Endomorphism :
    equiv-Type-With-Endomorphism'  equiv-Type-With-Endomorphism
  compute-equiv-Type-With-Endomorphism =
    equiv-right-swap-Σ

  equiv-equiv-Type-With-Endomorphism :
    equiv-Type-With-Endomorphism 
    type-Type-With-Endomorphism X  type-Type-With-Endomorphism Y
  equiv-equiv-Type-With-Endomorphism e = pr1 e

  map-equiv-Type-With-Endomorphism :
    equiv-Type-With-Endomorphism 
    type-Type-With-Endomorphism X  type-Type-With-Endomorphism Y
  map-equiv-Type-With-Endomorphism e =
    map-equiv (equiv-equiv-Type-With-Endomorphism e)

  coherence-square-equiv-Type-With-Endomorphism :
    (e : equiv-Type-With-Endomorphism) 
    coherence-square-maps
      ( map-equiv-Type-With-Endomorphism e)
      ( endomorphism-Type-With-Endomorphism X)
      ( endomorphism-Type-With-Endomorphism Y)
      ( map-equiv-Type-With-Endomorphism e)
  coherence-square-equiv-Type-With-Endomorphism e = pr2 e

  hom-equiv-Type-With-Endomorphism :
    equiv-Type-With-Endomorphism  hom-Type-With-Endomorphism X Y
  pr1 (hom-equiv-Type-With-Endomorphism e) =
    map-equiv-Type-With-Endomorphism e
  pr2 (hom-equiv-Type-With-Endomorphism e) =
    coherence-square-equiv-Type-With-Endomorphism e

  is-equiv-equiv-Type-With-Endomorphism :
    (e : equiv-Type-With-Endomorphism) 
    is-equiv-hom-Type-With-Endomorphism X Y (hom-equiv-Type-With-Endomorphism e)
  is-equiv-equiv-Type-With-Endomorphism e =
    is-equiv-map-equiv (equiv-equiv-Type-With-Endomorphism e)
```

### The identity equivalence

```agda
module _
  {l1 : Level} (X : Type-With-Endomorphism l1)
  where

  id-equiv-Type-With-Endomorphism : equiv-Type-With-Endomorphism X X
  pr1 id-equiv-Type-With-Endomorphism = id-equiv
  pr2 id-equiv-Type-With-Endomorphism = refl-htpy
```

### Composition for equivalences of types equipped with endomorphisms

```agda
comp-equiv-Type-With-Endomorphism :
  {l1 l2 l3 : Level}
  (X : Type-With-Endomorphism l1)
  (Y : Type-With-Endomorphism l2)
  (Z : Type-With-Endomorphism l3) 
  equiv-Type-With-Endomorphism Y Z 
  equiv-Type-With-Endomorphism X Y 
  equiv-Type-With-Endomorphism X Z
pr1 (comp-equiv-Type-With-Endomorphism X Y Z f e) = pr1 f ∘e pr1 e
pr2 (comp-equiv-Type-With-Endomorphism X Y Z f e) =
  pasting-horizontal-coherence-square-maps
    ( map-equiv-Type-With-Endomorphism X Y e)
    ( map-equiv-Type-With-Endomorphism Y Z f)
    ( endomorphism-Type-With-Endomorphism X)
    ( endomorphism-Type-With-Endomorphism Y)
    ( endomorphism-Type-With-Endomorphism Z)
    ( map-equiv-Type-With-Endomorphism X Y e)
    ( map-equiv-Type-With-Endomorphism Y Z f)
    ( coherence-square-equiv-Type-With-Endomorphism X Y e)
    ( coherence-square-equiv-Type-With-Endomorphism Y Z f)
```

### Inverses of equivalences of types equipped with endomorphisms

```agda
inv-equiv-Type-With-Endomorphism :
  {l1 l2 : Level}
  (X : Type-With-Endomorphism l1)
  (Y : Type-With-Endomorphism l2) 
  equiv-Type-With-Endomorphism X Y  equiv-Type-With-Endomorphism Y X
pr1 (inv-equiv-Type-With-Endomorphism X Y e) =
  inv-equiv (equiv-equiv-Type-With-Endomorphism X Y e)
pr2 (inv-equiv-Type-With-Endomorphism X Y e) =
  horizontal-inv-equiv-coherence-square-maps
    ( equiv-equiv-Type-With-Endomorphism X Y e)
    ( endomorphism-Type-With-Endomorphism X)
    ( endomorphism-Type-With-Endomorphism Y)
    ( equiv-equiv-Type-With-Endomorphism X Y e)
    ( coherence-square-equiv-Type-With-Endomorphism X Y e)
```

### Homotopies of equivalences of types equipped with endomorphisms

```agda
module _
  {l1 l2 : Level}
  (X : Type-With-Endomorphism l1)
  (Y : Type-With-Endomorphism l2)
  where

  htpy-equiv-Type-With-Endomorphism :
    (e f : equiv-Type-With-Endomorphism X Y)  UU (l1  l2)
  htpy-equiv-Type-With-Endomorphism e f =
    htpy-hom-Type-With-Endomorphism X Y
      ( hom-equiv-Type-With-Endomorphism X Y e)
      ( hom-equiv-Type-With-Endomorphism X Y f)

  refl-htpy-equiv-Type-With-Endomorphism :
    ( e : equiv-Type-With-Endomorphism X Y) 
    htpy-equiv-Type-With-Endomorphism e e
  refl-htpy-equiv-Type-With-Endomorphism e =
    refl-htpy-hom-Type-With-Endomorphism X Y
      ( hom-equiv-Type-With-Endomorphism X Y e)

  htpy-eq-equiv-Type-With-Endomorphism :
    (e f : equiv-Type-With-Endomorphism X Y) 
    e  f  htpy-equiv-Type-With-Endomorphism e f
  htpy-eq-equiv-Type-With-Endomorphism e .e refl =
    refl-htpy-equiv-Type-With-Endomorphism e

  is-torsorial-htpy-equiv-Type-With-Endomorphism :
    (e : equiv-Type-With-Endomorphism X Y) 
    is-torsorial (htpy-equiv-Type-With-Endomorphism e)
  is-torsorial-htpy-equiv-Type-With-Endomorphism e =
    is-contr-equiv
      ( Σ ( Σ ( hom-Type-With-Endomorphism X Y)
              ( λ f  is-equiv (map-hom-Type-With-Endomorphism X Y f)))
          ( λ f 
            htpy-hom-Type-With-Endomorphism X Y
              ( hom-equiv-Type-With-Endomorphism X Y e)
              ( pr1 f)))
      ( equiv-Σ
        ( λ f 
          htpy-hom-Type-With-Endomorphism X Y
            ( hom-equiv-Type-With-Endomorphism X Y e)
            ( pr1 f))
        ( equiv-right-swap-Σ)
        ( λ f  id-equiv))
      ( is-torsorial-Eq-subtype
        ( is-torsorial-htpy-hom-Type-With-Endomorphism X Y
          ( hom-equiv-Type-With-Endomorphism X Y e))
        ( λ f  is-property-is-equiv (pr1 f))
        ( hom-equiv-Type-With-Endomorphism X Y e)
        ( refl-htpy-hom-Type-With-Endomorphism X Y
          ( hom-equiv-Type-With-Endomorphism X Y e))
        ( pr2 (pr1 e)))

  is-equiv-htpy-eq-equiv-Type-With-Endomorphism :
    (e f : equiv-Type-With-Endomorphism X Y) 
    is-equiv (htpy-eq-equiv-Type-With-Endomorphism e f)
  is-equiv-htpy-eq-equiv-Type-With-Endomorphism e =
    fundamental-theorem-id
      ( is-torsorial-htpy-equiv-Type-With-Endomorphism e)
      ( htpy-eq-equiv-Type-With-Endomorphism e)

  extensionality-equiv-Type-With-Endomorphism :
    (e f : equiv-Type-With-Endomorphism X Y) 
    (e  f)  htpy-equiv-Type-With-Endomorphism e f
  pr1 (extensionality-equiv-Type-With-Endomorphism e f) =
    htpy-eq-equiv-Type-With-Endomorphism e f
  pr2 (extensionality-equiv-Type-With-Endomorphism e f) =
    is-equiv-htpy-eq-equiv-Type-With-Endomorphism e f

  eq-htpy-equiv-Type-With-Endomorphism :
    (e f : equiv-Type-With-Endomorphism X Y) 
    htpy-equiv-Type-With-Endomorphism e f  e  f
  eq-htpy-equiv-Type-With-Endomorphism e f =
    map-inv-equiv (extensionality-equiv-Type-With-Endomorphism e f)
```

## Properties

### Unit laws for composition of equivalences of types equipped with endomorphisms

```agda
module _
  {l1 l2 : Level}
  (X : Type-With-Endomorphism l1)
  (Y : Type-With-Endomorphism l2)
  where

  left-unit-law-comp-equiv-Type-With-Endomorphism :
    (e : equiv-Type-With-Endomorphism X Y) 
    comp-equiv-Type-With-Endomorphism X Y Y
      ( id-equiv-Type-With-Endomorphism Y) e 
    e
  left-unit-law-comp-equiv-Type-With-Endomorphism e =
    eq-htpy-equiv-Type-With-Endomorphism X Y
      ( comp-equiv-Type-With-Endomorphism X Y Y
        ( id-equiv-Type-With-Endomorphism Y)
        ( e))
      ( e)
      ( pair
        ( refl-htpy)
        ( λ x 
          inv
            ( ( right-unit) 
              ( right-unit) 
              ( ap-id
                ( coherence-square-equiv-Type-With-Endomorphism X Y e x)))))

  right-unit-law-comp-equiv-Type-With-Endomorphism :
    (e : equiv-Type-With-Endomorphism X Y) 
    comp-equiv-Type-With-Endomorphism X X Y e
      ( id-equiv-Type-With-Endomorphism X) 
    e
  right-unit-law-comp-equiv-Type-With-Endomorphism e =
    eq-htpy-equiv-Type-With-Endomorphism X Y
      ( comp-equiv-Type-With-Endomorphism X X Y e
        ( id-equiv-Type-With-Endomorphism X))
      ( e)
      ( pair
        ( refl-htpy)
        ( λ x  inv right-unit))
```

### Extensionality of types equipped with endomorphisms

```agda
module _
  {l1 : Level} (X : Type-With-Endomorphism l1)
  where

  equiv-eq-Type-With-Endomorphism :
    ( Y : Type-With-Endomorphism l1) 
    X  Y  equiv-Type-With-Endomorphism X Y
  equiv-eq-Type-With-Endomorphism .X refl =
    id-equiv-Type-With-Endomorphism X

  is-torsorial-equiv-Type-With-Endomorphism :
    is-torsorial (equiv-Type-With-Endomorphism X)
  is-torsorial-equiv-Type-With-Endomorphism =
    is-torsorial-Eq-structure
      ( is-torsorial-equiv (type-Type-With-Endomorphism X))
      ( type-Type-With-Endomorphism X , id-equiv)
      ( is-torsorial-htpy (endomorphism-Type-With-Endomorphism X))

  is-equiv-equiv-eq-Type-With-Endomorphism :
    ( Y : Type-With-Endomorphism l1) 
    is-equiv (equiv-eq-Type-With-Endomorphism Y)
  is-equiv-equiv-eq-Type-With-Endomorphism =
    fundamental-theorem-id
      is-torsorial-equiv-Type-With-Endomorphism
      equiv-eq-Type-With-Endomorphism

  extensionality-Type-With-Endomorphism :
    (Y : Type-With-Endomorphism l1) 
    (X  Y)  equiv-Type-With-Endomorphism X Y
  pr1 (extensionality-Type-With-Endomorphism Y) =
    equiv-eq-Type-With-Endomorphism Y
  pr2 (extensionality-Type-With-Endomorphism Y) =
    is-equiv-equiv-eq-Type-With-Endomorphism Y

  eq-equiv-Type-With-Endomorphism :
    (Y : Type-With-Endomorphism l1)  equiv-Type-With-Endomorphism X Y  X  Y
  eq-equiv-Type-With-Endomorphism Y =
    map-inv-is-equiv (is-equiv-equiv-eq-Type-With-Endomorphism Y)

module _
  {l : Level}
  (X : Type-With-Endomorphism l)
  (Y : Type-With-Endomorphism l)
  (Z : Type-With-Endomorphism l)
  where

  preserves-concat-equiv-eq-Type-With-Endomorphism :
    (p : X  Y) (q : Y  Z) 
    ( equiv-eq-Type-With-Endomorphism X Z (p  q)) 
    ( comp-equiv-Type-With-Endomorphism X Y Z
      ( equiv-eq-Type-With-Endomorphism Y Z q)
      ( equiv-eq-Type-With-Endomorphism X Y p))
  preserves-concat-equiv-eq-Type-With-Endomorphism refl q =
    inv
      ( right-unit-law-comp-equiv-Type-With-Endomorphism X Z
        ( equiv-eq-Type-With-Endomorphism X Z q))
```