# Operations on span diagrams

```agda
module foundation-core.operations-span-diagrams where
```

<details><summary>Imports</summary>

```agda
open import foundation.dependent-pair-types
open import foundation.morphisms-arrows
open import foundation.operations-spans
open import foundation.span-diagrams
open import foundation.spans
open import foundation.universe-levels

open import foundation-core.function-types
```

</details>

## Idea

This file contains some operations on
[span diagrams](foundation.span-diagrams.md) that produce new span diagrams from
given span diagrams and possibly other data.

## Definitions

### Concatenating span diagrams and maps on both sides

Consider a [span diagram](foundation.span-diagrams.md) `𝒮` given by

```text
       f       g
  A <----- S -----> B
```

and maps `i : A → A'` and `j : B → B'`. The
{{#concept "concatenation-span-diagram" Disambiguation="span diagram" Agda=concat-span-diagram}}
of `𝒮`, `i`, and `j` is the span diagram

```text
       i ∘ f     j ∘ g
  A' <------- S -------> B'.
```

```agda
module _
  {l1 l2 l3 l4 l5 : Level}
  where

  concat-span-diagram :
    (𝒮 : span-diagram l1 l2 l3)
    {A' : UU l4} (f : domain-span-diagram 𝒮  A')
    {B' : UU l5} (g : codomain-span-diagram 𝒮  B') 
    span-diagram l4 l5 l3
  pr1 (concat-span-diagram 𝒮 {A'} f {B'} g) =
    A'
  pr1 (pr2 (concat-span-diagram 𝒮 {A'} f {B'} g)) =
    B'
  pr2 (pr2 (concat-span-diagram 𝒮 {A'} f {B'} g)) =
    concat-span (span-span-diagram 𝒮) f g
```

### Concatenating span diagrams and maps on the left

Consider a [span diagram](foundation.span-diagrams.md) `𝒮` given by

```text
       f       g
  A <----- S -----> B
```

and a map `i : A → A'`. The
{{#concept "left concatenation" Disambiguation="span diagram" Agda=left-concat-span-diagram}}
of `𝒮` and `i` is the span diagram

```text
       i ∘ f      g
  A' <------- S -----> B.
```

```agda
module _
  {l1 l2 l3 l4 : Level}
  where

  left-concat-span-diagram :
    (𝒮 : span-diagram l1 l2 l3) {A' : UU l4} 
    (domain-span-diagram 𝒮  A')  span-diagram l4 l2 l3
  left-concat-span-diagram 𝒮 f = concat-span-diagram 𝒮 f id
```

### Concatenating span diagrams and maps on the right

Consider a [span diagram](foundation.span-diagrams.md) `𝒮` given by

```text
       f       g
  A <----- S -----> B
```

and a map `j : B → B'`. The
{{#concept "right concatenation" Disambiguation="span diagram" Agda=right-concat-span-diagram}}
of `𝒮` by `j` is the span diagram

```text
        f      j ∘ g
  A' <----- S -------> B'.
```

```agda
module _
  {l1 l2 l3 l4 : Level}
  where

  right-concat-span-diagram :
    (𝒮 : span-diagram l1 l2 l3) {B' : UU l4} 
    (codomain-span-diagram 𝒮  B')  span-diagram l1 l4 l3
  right-concat-span-diagram 𝒮 g = concat-span-diagram 𝒮 id g
```

### Concatenation of span diagrams and morphisms of arrows on the left

Consider a span diagram `𝒮` given by

```text
       f       g
  A <----- S -----> B
```

and a [morphism of arrows](foundation.morphisms-arrows.md) `h : hom-arrow f' f`
as indicated in the diagram

```text
          f'
     A' <---- S'
     |        |
  h₀ |        | h₁
     ∨        ∨
     A <----- S -----> B.
          f       g
```

Then we obtain a span diagram `A' <- S' -> B`.

```agda
module _
  {l1 l2 l3 l4 l5 : Level} (𝒮 : span-diagram l1 l2 l3)
  {S' : UU l4} {A' : UU l5} (f' : S'  A')
  (h : hom-arrow f' (left-map-span-diagram 𝒮))
  where

  domain-left-concat-hom-arrow-span-diagram : UU l5
  domain-left-concat-hom-arrow-span-diagram = A'

  codomain-left-concat-hom-arrow-span-diagram : UU l2
  codomain-left-concat-hom-arrow-span-diagram = codomain-span-diagram 𝒮

  span-left-concat-hom-arrow-span-diagram :
    span l4
      ( domain-left-concat-hom-arrow-span-diagram)
      ( codomain-left-concat-hom-arrow-span-diagram)
  span-left-concat-hom-arrow-span-diagram =
    left-concat-hom-arrow-span
      ( span-span-diagram 𝒮)
      ( f')
      ( h)

  left-concat-hom-arrow-span-diagram : span-diagram l5 l2 l4
  pr1 left-concat-hom-arrow-span-diagram =
    domain-left-concat-hom-arrow-span-diagram
  pr1 (pr2 left-concat-hom-arrow-span-diagram) =
    codomain-left-concat-hom-arrow-span-diagram
  pr2 (pr2 left-concat-hom-arrow-span-diagram) =
    span-left-concat-hom-arrow-span-diagram

  spanning-type-left-concat-hom-arrow-span-diagram : UU l4
  spanning-type-left-concat-hom-arrow-span-diagram =
    spanning-type-span-diagram left-concat-hom-arrow-span-diagram

  left-map-left-concat-hom-arrow-span-diagram :
    spanning-type-left-concat-hom-arrow-span-diagram 
    domain-left-concat-hom-arrow-span-diagram
  left-map-left-concat-hom-arrow-span-diagram =
    left-map-span-diagram left-concat-hom-arrow-span-diagram

  right-map-left-concat-hom-arrow-span-diagram :
    spanning-type-left-concat-hom-arrow-span-diagram 
    codomain-left-concat-hom-arrow-span-diagram
  right-map-left-concat-hom-arrow-span-diagram =
    right-map-span-diagram left-concat-hom-arrow-span-diagram
```

### Concatenation of span diagrams and morphisms of arrows on the right

Consider a span diagram `𝒮` given by

```text
       f       g
  A <----- S -----> B
```

and a [morphism of arrows](foundation.morphisms-arrows.md) `h : hom-arrow g' g`
as indicated in the diagram

```text
               g'
           S' ----> B'
           |        |
        h₀ |        | h₁
           ∨        ∨
  A <----- S -----> B.
       f       g
```

Then we obtain a span diagram `A <- S' -> B'`.

```agda
module _
  {l1 l2 l3 l4 l5 : Level} (𝒮 : span-diagram l1 l2 l3)
  {S' : UU l4} {B' : UU l5} (g' : S'  B')
  (h : hom-arrow g' (right-map-span-diagram 𝒮))
  where

  domain-right-concat-hom-arrow-span-diagram : UU l1
  domain-right-concat-hom-arrow-span-diagram = domain-span-diagram 𝒮

  codomain-right-concat-hom-arrow-span-diagram : UU l5
  codomain-right-concat-hom-arrow-span-diagram = B'

  span-right-concat-hom-arrow-span-diagram :
    span l4
      ( domain-right-concat-hom-arrow-span-diagram)
      ( codomain-right-concat-hom-arrow-span-diagram)
  span-right-concat-hom-arrow-span-diagram =
    right-concat-hom-arrow-span
      ( span-span-diagram 𝒮)
      ( g')
      ( h)

  right-concat-hom-arrow-span-diagram : span-diagram l1 l5 l4
  pr1 right-concat-hom-arrow-span-diagram =
    domain-right-concat-hom-arrow-span-diagram
  pr1 (pr2 right-concat-hom-arrow-span-diagram) =
    codomain-right-concat-hom-arrow-span-diagram
  pr2 (pr2 right-concat-hom-arrow-span-diagram) =
    span-right-concat-hom-arrow-span-diagram

  spanning-type-right-concat-hom-arrow-span-diagram : UU l4
  spanning-type-right-concat-hom-arrow-span-diagram =
    spanning-type-span-diagram right-concat-hom-arrow-span-diagram

  left-map-right-concat-hom-arrow-span-diagram :
    spanning-type-right-concat-hom-arrow-span-diagram 
    domain-right-concat-hom-arrow-span-diagram
  left-map-right-concat-hom-arrow-span-diagram =
    left-map-span-diagram right-concat-hom-arrow-span-diagram

  right-map-right-concat-hom-arrow-span-diagram :
    spanning-type-right-concat-hom-arrow-span-diagram 
    codomain-right-concat-hom-arrow-span-diagram
  right-map-right-concat-hom-arrow-span-diagram =
    right-map-span-diagram right-concat-hom-arrow-span-diagram
```