# Double arrows

```agda
module foundation.double-arrows where
```

<details><summary>Imports</summary>

```agda
open import foundation.cartesian-product-types
open import foundation.dependent-pair-types
open import foundation.universe-levels
```

</details>

## Idea

A {{#concept "double arrow" Disambiguation="between types" Agda=double-arrow}}
is a [pair](foundation.dependent-pair-types.md) of types `A`, `B`
[equipped](foundation.structure.md) with a pair of
[maps](foundation.function-types.md) `f, g : A → B`.

We draw a double arrow as

```text
     A
    | |
  f | | g
    | |
    ∨ ∨
     B
```

where `f` is the first map in the structure and `g` is the second map in the
structure. We also call `f` the _left map_ and `g` the _right map_. By
convention, [homotopies](foundation-core.homotopies.md) go from left to right.

## Definitions

### Double arrows

```agda
double-arrow : (l1 l2 : Level)  UU (lsuc l1  lsuc l2)
double-arrow l1 l2 = Σ (UU l1)  A  Σ (UU l2)  B  (A  B) × (A  B)))

module _
  {l1 l2 : Level} {A : UU l1} {B : UU l2}
  (f : A  B) (g : A  B)
  where

  make-double-arrow : double-arrow l1 l2
  make-double-arrow = (A , B , f , g)

  {-# INLINE make-double-arrow #-}
```

### Components of a double arrow

```agda
module _
  {l1 l2 : Level} (a : double-arrow l1 l2)
  where

  domain-double-arrow : UU l1
  domain-double-arrow = pr1 a

  codomain-double-arrow : UU l2
  codomain-double-arrow = pr1 (pr2 a)

  left-map-double-arrow : domain-double-arrow  codomain-double-arrow
  left-map-double-arrow = pr1 (pr2 (pr2 a))

  right-map-double-arrow : domain-double-arrow  codomain-double-arrow
  right-map-double-arrow = pr2 (pr2 (pr2 a))
```

## See also

- Colimits of double arrows are
  [coequalizers](synthetic-homotopy-theory.coequalizers.md)