module Calf.Computation.Pullback where

open import Calf.Value
open import Calf.Value.Sigma public
open import Calf.Computation

Pullback :  {A B C}  (f : A  C) (g : B  C)  𝒞
Pullback {A} {B} {C} f g .U =
  Σ[ a  U A ] Σ[ b  U B ] U f a  U g b
Pullback {A} {B} {C} f g .is-set =
  isSetΣ (A .is-set) λ a 
  isSetΣ (B .is-set) λ b 
  isProp→isSet (C .is-set (U f a) (U g b))
Pullback {A} {B} {C} f g .charge c (a , b , p) =
  A .charge c a ,
  B .charge c b ,
  f .charge c a  cong (C .charge c) p  sym (g .charge c b)
Pullback {A} {B} {C} f g .charge/0 =
  ΣPathP (A .charge/0 , ΣPathP (B .charge/0 ,
    isProp→PathP  i  C .is-set _ _) _ _))
Pullback {A} {B} {C} f g .charge/+ =
  ΣPathP (A .charge/+ , ΣPathP (B .charge/+ ,
    isProp→PathP  i  C .is-set _ _) _ _))