{-# OPTIONS --allow-unsolved-metas #-}

open import Cubical.Foundations.Prelude
open import Cubical.Foundations.Equiv
open import Cubical.Foundations.Function
open import Cubical.Foundations.Univalence using (ua)
open import Cubical.Data.Equality.Conversion using (eqToPath)
open import Cubical.Data.Nat

module Calf.Computation.CList2 where

open import Calf.Core.Cost
open import Calf.Value
open import Calf.Value.List
open import Calf.Value.Nat
import Calf.Value.Closed as 
import Calf.Value.Open as 
open import Calf.Computation
open import Calf.Computation.Free as F
open import Calf.Computation.Copower
open import Calf.Computation.Open as ◯ᶜ
open import Calf.Computation.Closed as ●ᶜ
open import Calf.Computation.Glue
open import Calf.Computation.Abstraction
open import Calf.Computation.Potential
open import Calf.Computation.Credit

-- binom2 : ℕ → ℕ
-- binom2 zero = zero
-- binom2 (suc n) = n + binom2 n

-- clist₂-potential : ℂ → ℂ → ℕ → ℂ
-- clist₂-potential c-linear c-quadratic n =
--   (n ⊙ c-linear) +ℂ (binom2 n ⊙ c-quadratic)

-- module _ where
--   clist₂-potential-suc
--     : ∀ n c-linear c-quadratic
--     → clist₂-potential c-linear c-quadratic (suc n)
--       ≡ c-linear +ℂ clist₂-potential (c-quadratic +ℂ c-linear) c-quadratic n
--   clist₂-potential-suc n c-linear c-quadratic =
--       clist₂-potential c-linear c-quadratic (suc n)
--     ≡⟨ refl ⟩
--       (c-linear +ℂ (n ⊙ c-linear))
--         +ℂ ((n + binom2 n) ⊙ c-quadratic)
--     ≡⟨ cong
--         ((c-linear +ℂ (n ⊙ c-linear)) +ℂ_)
--         (⊙-+-left n (binom2 n) c-quadratic) ⟩
--       (c-linear +ℂ (n ⊙ c-linear))
--         +ℂ ((n ⊙ c-quadratic) +ℂ (binom2 n ⊙ c-quadratic))
--     ≡⟨ +ℂ-assoc c-linear (n ⊙ c-linear)
--         ((n ⊙ c-quadratic) +ℂ (binom2 n ⊙ c-quadratic)) ⟩
--       c-linear +ℂ
--         ((n ⊙ c-linear)
--           +ℂ ((n ⊙ c-quadratic) +ℂ (binom2 n ⊙ c-quadratic)))
--     ≡⟨ cong (c-linear +ℂ_)
--         (sym (+ℂ-assoc (n ⊙ c-linear) (n ⊙ c-quadratic) (binom2 n ⊙ c-quadratic))) ⟩
--       c-linear +ℂ
--         (((n ⊙ c-linear) +ℂ (n ⊙ c-quadratic))
--           +ℂ (binom2 n ⊙ c-quadratic))
--     ≡⟨ cong
--         (λ c → c-linear +ℂ (c +ℂ (binom2 n ⊙ c-quadratic)))
--         (+ℂ-comm (n ⊙ c-linear) (n ⊙ c-quadratic)) ⟩
--       c-linear +ℂ
--         (((n ⊙ c-quadratic) +ℂ (n ⊙ c-linear))
--           +ℂ (binom2 n ⊙ c-quadratic))
--     ≡⟨ cong (c-linear +ℂ_)
--         (cong (_+ℂ (binom2 n ⊙ c-quadratic))
--           (sym (⊙-+ n c-quadratic c-linear))) ⟩
--       c-linear +ℂ clist₂-potential (c-quadratic +ℂ c-linear) c-quadratic n
--     ∎

opaque
  CList₂ :     𝒱  𝒞
  CList₂ c-linear c-quadratic X = ?
    -- Potential {List X} (clist₂-potential c-linear c-quadratic ∘ length)

  cnil₂ :  {c-lin c-quad}  U (CList₂ c-lin c-quad X)
  cnil₂ {X} {c-lin} {c-quad} = ?
    -- triangleᶜ'
    --   (ret [])
    --   (ret [])
    --   $
    --     bind' (λ l → F _ .charge (clist₂-potential c-lin c-quad (length l)) (ret l)) .U (ret [])
    --   ≡⟨ bind'/β ⟩
    --     F _ .charge (0ℂ +ℂ 0ℂ) (ret [])
    --   ≡⟨ cong (λ c → F _ .charge c (ret [])) (+ℂ-identityˡ 0ℂ) ⟩
    --     F _ .charge 0ℂ (ret [])
    --   ≡⟨ F _ .charge/0 ⟩
    --     ret []
    --   ∎

  ccons₂ :  {c-lin c-quad}  X  ▷[ c-lin ] (CList₂ (c-quad +ℂ c-lin) c-quad X)  CList₂ c-lin c-quad X
  ccons₂ {X} {c-lin} {c-quad} x = ?
    -- subst (_⊸ CList₂ c-lin c-quad X)
    --   ( Abstractionᶜ (F (List X)) (F (List X))
    --       (CHARGE c-lin ⨾ᶜ bind' (λ l → F _ .charge (clist₂-potential (c-quad +ℂ c-lin) c-quad (length l)) (ret l)))
    --   ≡⟨ cong (Abstractionᶜ _ _) (CHARGE-commute _ _) ⟩
    --     Abstractionᶜ (F (List X)) (F (List X))
    --       (bind' (λ l → F _ .charge (clist₂-potential (c-quad +ℂ c-lin) c-quad (length l)) (ret l)) ⨾ᶜ CHARGE c-lin)
    --   ≡⟨ sym Abstractionᶜ-Abstractionᶜ ⟩
    --     Abstractionᶜ
    --       (CList₂ (c-quad +ℂ c-lin) c-quad X)
    --       (CList₂ (c-quad +ℂ c-lin) c-quad X)
    --       (squareᶜ'
    --         (CHARGE c-lin)
    --         (CHARGE c-lin)
    --         (λ e → bind' (λ l → F _ .charge (clist₂-potential (c-quad +ℂ c-lin) c-quad (length l)) (ret l)) .charge c-lin e))
    --   ≡⟨ cong (Abstractionᶜ _ _) (squareᶜ'-charge _) ⟩
    --     ▷[ c-lin ] (CList₂ (c-quad +ℂ c-lin) c-quad X)
    --   ∎) $
    -- squareᶜ'
    --   (F.map (x ∷_))
    --   (F.map (x ∷_))
    --   λ e →
    --     bind' (λ l → F (List X) .charge (clist₂-potential c-lin c-quad (length l)) (ret l)) .U (F.map (x ∷_) .U e)
    --   ≡⟨ refl ⟩
    --     bind' (λ l → F (List X) .charge (clist₂-potential c-lin c-quad (length l)) (ret l)) .U (bind' (ret ∘ (x ∷_)) .U e)
    --   ≡⟨ bind'-assoc _ _ _ ⟩
    --     bind' (λ l →
    --       bind' (λ l →
    --         F (List X) .charge (clist₂-potential c-lin c-quad (length l)) (ret l))
    --       .U (ret (x ∷ l)))
    --     .U e
    --   ≡⟨ cong (λ h → bind' {A = F (List X)} h .U e) (funExt λ _ → bind'/β) ⟩
    --     bind' (λ l →
    --       F (List X) .charge (clist₂-potential c-lin c-quad (length (x ∷ l))) (ret (x ∷ l)))
    --     .U e
    --   ≡⟨ cong (λ h → bind' {A = F (List X)} h .U e)
    --         (funExt λ l →
    --           cong (λ c → F (List X) .charge c (ret (x ∷ l)))
    --             (clist₂-potential-suc (length l) c-lin c-quad)) ⟩
    --     bind' (λ l →
    --       F (List X) .charge
    --         (c-lin +ℂ clist₂-potential (c-quad +ℂ c-lin) c-quad (length l))
    --         (ret (x ∷ l)))
    --     .U e
    --   ≡⟨ cong (λ h → bind' {A = F (List X)} h .U e) (funExt λ l → F (List X) .charge/+) ⟩
    --     bind' (λ l →
    --       F (List X) .charge c-lin
    --         (F (List X) .charge
    --           (clist₂-potential (c-quad +ℂ c-lin) c-quad (length l))
    --           (ret (x ∷ l))))
    --     .U e
    --   ≡⟨ bind'-charge _ _ _ ⟩
    --     bind' (λ l →
    --       F (List X) .charge
    --         (clist₂-potential (c-quad +ℂ c-lin) c-quad (length l))
    --         (ret (x ∷ l)))
    --     .U (F (List X) .charge c-lin e)
    --   ≡⟨ sym
    --         (cong (λ h → bind' {A = F (List X)} h .U (F (List X) .charge c-lin e))
    --           (funExt λ l →
    --             cong (F (List X) .charge (clist₂-potential (c-quad +ℂ c-lin) c-quad (length l))) bind'/β)) ⟩
    --     bind' (λ l →
    --       F (List X) .charge
    --         (clist₂-potential (c-quad +ℂ c-lin) c-quad (length l))
    --         (F.map (x ∷_) .U (ret l)))
    --     .U (F (List X) .charge c-lin e)
    --   ≡⟨ sym
    --         (cong (λ h → bind' {A = F (List X)} h .U (F (List X) .charge c-lin e))
    --           (funExt λ l →
    --             F.map (x ∷_) .charge (clist₂-potential (c-quad +ℂ c-lin) c-quad (length l)) (ret l))) ⟩
    --     bind' (λ l →
    --       F.map (x ∷_) .U
    --         (F (List X) .charge (clist₂-potential (c-quad +ℂ c-lin) c-quad (length l)) (ret l)))
    --     .U (F (List X) .charge c-lin e)
    --   ≡⟨ sym (bind'-assoc _ _ _) ⟩
    --     F.map (x ∷_) .U
    --       (bind' (λ l →
    --         F (List X) .charge (clist₂-potential (c-quad +ℂ c-lin) c-quad (length l)) (ret l))
    --       .U (F (List X) .charge c-lin e))
    --   ∎

  cfoldr₂ :  {c-lin c-quad} (A :   𝒞)
     (∀ c-lin  U (A c-lin))
     (∀ c-lin  X  (▷[ c-lin ] (A (c-quad +ℂ c-lin)))  A c-lin)
     CList₂ c-lin c-quad X  A c-lin
  cfoldr₂ {X = X} {c-lin = c-lin} {c-quad = c-quad} A e-nil e-cons = ?
    -- subst (CList₂ c-lin c-quad X ⊸_) (𝒞-glue-fracture-retract (A c-lin)) $
    -- squareᶜ (go• c-lin) (go◦ c-lin) go-•⊸◦
    -- where
    --   costᶜ-at : ℂ → F (List X) ⊸ F (List X)
    --   costᶜ-at c =
    --     bind' {A = F _} λ l →
    --     CHARGE {A = F _} (clist₂-potential c c-quad (length l)) .U (ret l)

    --   costᶜ : F (List X) ⊸ F (List X)
    --   costᶜ = costᶜ-at c-lin

    --   fold• : (List X) → (c : ℂ) → U (●ᶜ (A c))
    --   fold• =
    --     foldr
    --       (λ x rec c →
    --         ●.map (e-cons c x .U)
    --           (transport
    --             (cong U (sym (▷-●ᶜ c (A (c-quad +ℂ c)))))
    --             (rec (c-quad +ℂ c))))
    --       (λ c → η• (e-nil c))

    --   go• : (c : ℂ) → ●ᶜ (F (List X)) ⊸ ●ᶜ (A c)
    --   go• c =
    --     ●ᶜ.bind $
    --     bind' (λ l → fold• l c)

    --   open-econs : (c : ℂ) → X → ◯ᶜ (A (c-quad +ℂ c)) ⊸ ◯ᶜ (A c)
    --   open-econs c x .U a◦ =
    --     ◯.map (e-cons c x .U)
    --       (transport (cong U (sym (▷-◯ᶜ c (A (c-quad +ℂ c))))) a◦)
    --   open-econs c x .charge d a◦ = funExt λ abs →
    --       e-cons c x .U
    --         (transport (cong U (sym (▷-◯ᶜ c (A (c-quad +ℂ c)))))
    --           (◯ᶜ (A (c-quad +ℂ c)) .charge d a◦)
    --           abs)
    --     ≡⟨ cong (λ q → e-cons c x .U (q abs))
    --           (transport-charge (sym (▷-◯ᶜ c (A (c-quad +ℂ c)))) d a◦) ⟩
    --       e-cons c x .U
    --         ((◯ᶜ (▷[ c ] (A (c-quad +ℂ c))) .charge d
    --           (transport (cong U (sym (▷-◯ᶜ c (A (c-quad +ℂ c))))) a◦)) abs)
    --     ≡⟨ e-cons c x .charge d
    --           (transport (cong U (sym (▷-◯ᶜ c (A (c-quad +ℂ c))))) a◦ abs) ⟩
    --       A c .charge d
    --         (e-cons c x .U
    --           (transport (cong U (sym (▷-◯ᶜ c (A (c-quad +ℂ c))))) a◦ abs))
    --     ∎

    --   fold◦ : (List X) → (c : ℂ) → U (◯ᶜ (A c))
    --   fold◦ =
    --     foldr
    --       (λ x rec c → open-econs c x .U (rec (c-quad +ℂ c)))
    --       (λ c → η◦ (e-nil c))

    --   go◦ : (c : ℂ) → ◯ᶜ (F (List X)) ⊸ ◯ᶜ (A c)
    --   go◦ c =
    --     ◯ᶜ.bind {A = F _} {B = A c} $
    --     bind' (λ l → fold◦ l c)

    --   fold•ᶜ : (c : ℂ) → F (List X) ⊸ ●ᶜ (A c)
    --   fold•ᶜ c = bind' (λ l → fold• l c)

    --   go-•⊸◦ :
    --     go• c-lin ⨾ᶜ ●ᶜ.map η◦ᶜ ≡ ●ᶜ.map (costᶜ ⨾ᶜ η◦ᶜ) ⨾ᶜ ●ᶜ.map (go◦ c-lin)
    --   go-•⊸◦ =
    --       go• c-lin ⨾ᶜ ●ᶜ.map η◦ᶜ
    --     ≡⟨ refl ⟩
    --       ●ᶜ.bind (fold•ᶜ c-lin) ⨾ᶜ ●ᶜ.map η◦ᶜ
    --     ≡⟨ ●ᶜ.bind-map _ _ ⟩
    --       ●ᶜ.bind (fold•ᶜ c-lin ⨾ᶜ ●ᶜ.map η◦ᶜ)
    --     ≡⟨ cong ●ᶜ.bind (bind'-path _ _ (funExt (fold•-coherence c-lin))) ⟩
    --       ●ᶜ.bind (costᶜ ⨾ᶜ η◦ᶜ ⨾ᶜ go◦ c-lin ⨾ᶜ η•ᶜ)
    --     ≡⟨ ●ᶜ.bind-η• _ ⟩
    --       ●ᶜ.map (costᶜ ⨾ᶜ η◦ᶜ ⨾ᶜ go◦ c-lin)
    --     ≡⟨ sym (●ᶜ.map-∘ _ _) ⟩
    --       ●ᶜ.map (costᶜ ⨾ᶜ η◦ᶜ) ⨾ᶜ ●ᶜ.map (go◦ c-lin)
    --     ∎
    --     where
    --       cost-nil : ∀ c → costᶜ-at c .U (ret []) ≡ ret []
    --       cost-nil c =
    --           costᶜ-at c .U (ret [])
    --         ≡⟨ bind'/β ⟩
    --           F (List X) .charge (0ℂ +ℂ 0ℂ) (ret [])
    --         ≡⟨ cong (λ c → F (List X) .charge c (ret [])) (+ℂ-identityˡ 0ℂ) ⟩
    --           F (List X) .charge 0ℂ (ret [])
    --         ≡⟨ F (List X) .charge/0 ⟩
    --           ret []
    --         ∎

    --       cost-cons : ∀ c x l →
    --         CHARGE {A = F _} c .U
    --           (F.map (x ∷_) .U (costᶜ-at (c-quad +ℂ c) .U (ret l)))
    --         ≡ costᶜ-at c .U (ret (x ∷ l))
    --       cost-cons c x l =
    --           CHARGE {A = F _} c .U
    --             (F.map (x ∷_) .U (costᶜ-at (c-quad +ℂ c) .U (ret l)))
    --         ≡⟨ cong (λ e → CHARGE {A = F _} c .U (F.map (x ∷_) .U e)) bind'/β ⟩
    --           CHARGE {A = F _} c .U
    --             (F.map (x ∷_) .U
    --               (CHARGE {A = F _} (clist₂-potential (c-quad +ℂ c) c-quad (length l)) .U (ret l)))
    --         ≡⟨ cong (CHARGE {A = F _} c .U)
    --               (cong ((_$ ret l) ∘ U)
    --                 (CHARGE-commute
    --                   (clist₂-potential (c-quad +ℂ c) c-quad (length l))
    --                   (F.map (x ∷_)))) ⟩
    --           CHARGE {A = F _} c .U
    --             (CHARGE {A = F _} (clist₂-potential (c-quad +ℂ c) c-quad (length l)) .U
    --               (F.map (x ∷_) .U (ret l)))
    --         ≡⟨ cong (λ e → CHARGE {A = F _} c .U
    --               (CHARGE {A = F _} (clist₂-potential (c-quad +ℂ c) c-quad (length l)) .U e))
    --               bind'/β ⟩
    --           CHARGE {A = F _} c .U
    --             (CHARGE {A = F _} (clist₂-potential (c-quad +ℂ c) c-quad (length l)) .U
    --               (ret (x ∷ l)))
    --         ≡⟨ sym (cong ((_$ ret (x ∷ l)) ∘ U)
    --               (CHARGE-+ {A = F _} c (clist₂-potential (c-quad +ℂ c) c-quad (length l)))) ⟩
    --           CHARGE {A = F _}
    --             (c +ℂ clist₂-potential (c-quad +ℂ c) c-quad (length l)) .U
    --             (ret (x ∷ l))
    --         ≡⟨ cong (λ c → CHARGE {A = F _} c .U (ret (x ∷ l)))
    --               (sym (clist₂-potential-suc (length l) c c-quad)) ⟩
    --           CHARGE {A = F _}
    --             (clist₂-potential c c-quad (length (x ∷ l))) .U
    --             (ret (x ∷ l))
    --         ≡⟨ sym bind'/β ⟩
    --           costᶜ-at c .U (ret (x ∷ l))
    --         ∎

    --       go◦-cons : ∀ c x (e : U (F (List X))) →
    --         go◦ c .U (η◦ᶜ {A = F _} .U (F.map (x ∷_) .U e))
    --         ≡ open-econs c x .U (go◦ (c-quad +ℂ c) .U (η◦ᶜ {A = F _} .U e))
    --       go◦-cons c x e =
    --           go◦ c .U (η◦ᶜ {A = F _} .U (F.map (x ∷_) .U e))
    --         ≡⟨ refl ⟩
    --           bind' (λ l → fold◦ l c) .U (F.map (x ∷_) .U e)
    --         ≡⟨ bind'-assoc _ _ _ ⟩
    --           bind' (λ l →
    --             bind' (λ l → fold◦ l c) .U (ret (x ∷ l)))
    --           .U e
    --         ≡⟨ cong (λ h → bind' {A = ◯ᶜ (A c)} h .U e) (funExt λ l → bind'/β) ⟩
    --           bind' (λ l →
    --             open-econs c x .U (fold◦ l (c-quad +ℂ c)))
    --           .U e
    --         ≡⟨ sym (bind'-map (open-econs c x) _ _) ⟩
    --           open-econs c x .U (bind' (λ l → fold◦ l (c-quad +ℂ c)) .U e)
    --         ≡⟨ refl ⟩
    --           open-econs c x .U (go◦ (c-quad +ℂ c) .U (η◦ᶜ {A = F _} .U e))
    --         ∎

    --       open-cons-charge : ∀ c x l →
    --         ◯.map (e-cons c x .U)
    --           (transport (cong U (sym (▷-◯ᶜ c (A (c-quad +ℂ c)))))
    --             (CHARGE {A = ◯ᶜ (A (c-quad +ℂ c))} c .U
    --               ((costᶜ-at (c-quad +ℂ c) ⨾ᶜ η◦ᶜ ⨾ᶜ go◦ (c-quad +ℂ c)) .U (ret l))))
    --         ≡ (costᶜ-at c ⨾ᶜ η◦ᶜ ⨾ᶜ go◦ c) .U (ret (x ∷ l))
    --       open-cons-charge c x l =
    --         let
    --           e = costᶜ-at (c-quad +ℂ c) .U (ret l)
    --           s = go◦ (c-quad +ℂ c) .U (η◦ᶜ {A = F _} .U e)
    --         in
    --           open-econs c x .U (CHARGE {A = ◯ᶜ (A (c-quad +ℂ c))} c .U s)
    --         ≡⟨ cong ((_$ s) ∘ U) (CHARGE-commute c (open-econs c x)) ⟩
    --           CHARGE {A = ◯ᶜ (A c)} c .U (open-econs c x .U s)
    --         ≡⟨ cong (CHARGE {A = ◯ᶜ (A c)} c .U)
    --               (sym (go◦-cons c x e)) ⟩
    --           CHARGE {A = ◯ᶜ (A c)} c .U
    --             (go◦ c .U (η◦ᶜ {A = F _} .U (F.map (x ∷_) .U e)))
    --         ≡⟨ sym (cong ((_$ η◦ᶜ {A = F _} .U (F.map (x ∷_) .U e)) ∘ U)
    --               (CHARGE-commute c (go◦ c))) ⟩
    --           go◦ c .U
    --             (η◦ᶜ {A = F _} .U
    --               (CHARGE {A = F _} c .U (F.map (x ∷_) .U e)))
    --         ≡⟨ cong (λ e → go◦ c .U (η◦ᶜ {A = F _} .U e)) (cost-cons c x l) ⟩
    --           go◦ c .U (η◦ᶜ {A = F _} .U (costᶜ-at c .U (ret (x ∷ l))))
    --         ∎

    --       fold•-coherence : ∀ c l →
    --         (fold•ᶜ c ⨾ᶜ ●ᶜ.map η◦ᶜ) .U (ret l)
    --         ≡ (costᶜ-at c ⨾ᶜ η◦ᶜ ⨾ᶜ go◦ c ⨾ᶜ η•ᶜ) .U (ret l)
    --       fold•-coherence c [] =
    --           (fold•ᶜ c ⨾ᶜ ●ᶜ.map η◦ᶜ) .U (ret [])
    --         ≡⟨ cong (●.map (η◦ᶜ {A = A c} .U)) bind'/β ⟩
    --           η•ᶜ {A = ◯ᶜ (A c)} .U (η◦ᶜ {A = A c} .U (e-nil c))
    --         ≡⟨ cong (η•ᶜ {A = ◯ᶜ (A c)} .U) (sym bind'/β) ⟩
    --           η•ᶜ {A = ◯ᶜ (A c)} .U
    --             (bind' (λ l → fold◦ l c) .U (ret []))
    --         ≡⟨ refl ⟩
    --           η•ᶜ {A = ◯ᶜ (A c)} .U
    --             (go◦ c .U (η◦ᶜ {A = F _} .U (ret [])))
    --         ≡⟨ cong
    --               (λ e → η•ᶜ {A = ◯ᶜ (A c)} .U
    --                 (go◦ c .U (η◦ᶜ {A = F _} .U e)))
    --               (sym (cost-nil c)) ⟩
    --           η•ᶜ {A = ◯ᶜ (A c)} .U
    --             (go◦ c .U (η◦ᶜ {A = F _} .U
    --               (costᶜ-at c .U (ret []))))
    --         ≡⟨ refl ⟩
    --           (costᶜ-at c ⨾ᶜ η◦ᶜ ⨾ᶜ go◦ c ⨾ᶜ η•ᶜ) .U (ret [])
    --         ∎
    --       fold•-coherence c (x ∷ l) =
    --           (fold•ᶜ c ⨾ᶜ ●ᶜ.map η◦ᶜ) .U (ret (x ∷ l))
    --         ≡⟨ cong (●.map (η◦ᶜ {A = A c} .U)) bind'/β ⟩
    --           ●.map (η◦ᶜ {A = A c} .U)
    --             (●.map (e-cons c x .U)
    --               (transport (cong U (sym (▷-●ᶜ c (A (c-quad +ℂ c)))))
    --                 (fold• l (c-quad +ℂ c))))
    --         ≡⟨ cong
    --             (λ q → ●.map (η◦ᶜ {A = A c} .U)
    --               (●.map (e-cons c x .U)
    --                 (transport (cong U (sym (▷-●ᶜ c (A (c-quad +ℂ c))))) q)))
    --             (sym bind'/β) ⟩
    --           ●.map (η◦ᶜ {A = A c} .U)
    --             (●.map (e-cons c x .U)
    --               (transport (cong U (sym (▷-●ᶜ c (A (c-quad +ℂ c)))))
    --                 (fold•ᶜ (c-quad +ℂ c) .U (ret l))))
    --         ≡⟨ (
    --           let
    --               q▷• =
    --                 transport
    --                   (cong U (sym (▷-●ᶜ c (A (c-quad +ℂ c)))))
    --                   (fold•ᶜ (c-quad +ℂ c) .U (ret l))
    --               q▷◦ =
    --                 transport
    --                   (cong U (sym (▷-◯ᶜ c (A (c-quad +ℂ c)))))
    --                   (CHARGE {A = ◯ᶜ (A (c-quad +ℂ c))} c .U
    --                     ((costᶜ-at (c-quad +ℂ c) ⨾ᶜ η◦ᶜ ⨾ᶜ go◦ (c-quad +ℂ c)) .U (ret l)))
    --               tr▷◦ =
    --                 transport
    --                   (cong (λ C → U (●ᶜ C)) (sym (▷-◯ᶜ c (A (c-quad +ℂ c)))))

    --               q▷-coh : ●ᶜ.map (η◦ᶜ {A = ▷[ c ] (A (c-quad +ℂ c))}) .U q▷• ≡ η• q▷◦
    --               q▷-coh =
    --                   ●ᶜ.map (η◦ᶜ {A = ▷[ c ] (A (c-quad +ℂ c))}) .U q▷•
    --                 ≡⟨ ? ⟩  -- transport-▷ c (A (c-quad +ℂ c)) (fold•ᶜ (c-quad +ℂ c) .U (ret l)) ⟩
    --                   tr▷◦
    --                     ((▷-FRAC c (A (c-quad +ℂ c)) .𝒞-FRACTURE.α•) .U
    --                       (fold•ᶜ (c-quad +ℂ c) .U (ret l)))
    --                 ≡⟨ cong tr▷◦
    --                     (sym (●.map-∘
    --                       (η◦ᶜ {A = A (c-quad +ℂ c)} .U)
    --                       (◯ᶜ (A (c-quad +ℂ c)) .charge c)
    --                       (fold•ᶜ (c-quad +ℂ c) .U (ret l)))) ⟩
    --                   tr▷◦
    --                     (●.map (CHARGE {A = ◯ᶜ (A (c-quad +ℂ c))} c .U)
    --                       ((fold•ᶜ (c-quad +ℂ c) ⨾ᶜ ●ᶜ.map η◦ᶜ) .U (ret l)))
    --                 ≡⟨ cong tr▷◦
    --                     (cong (●.map (CHARGE {A = ◯ᶜ (A (c-quad +ℂ c))} c .U))
    --                       (fold•-coherence (c-quad +ℂ c) l)) ⟩
    --                   η• q▷◦
    --                 ∎
    --             in
    --             fracture-map-coh (e-cons c x) q▷• q▷◦ q▷-coh
    --         ) ⟩
    --           η•ᶜ {A = ◯ᶜ (A c)} .U
    --             (◯.map (e-cons c x .U)
    --               (transport (cong U (sym (▷-◯ᶜ c (A (c-quad +ℂ c)))))
    --                 (CHARGE {A = ◯ᶜ (A (c-quad +ℂ c))} c .U
    --                   ((costᶜ-at (c-quad +ℂ c) ⨾ᶜ η◦ᶜ ⨾ᶜ go◦ (c-quad +ℂ c)) .U (ret l)))))
    --         ≡⟨ cong (η•ᶜ {A = ◯ᶜ (A c)} .U) (open-cons-charge c x l) ⟩
    --           (costᶜ-at c ⨾ᶜ η◦ᶜ ⨾ᶜ go◦ c ⨾ᶜ η•ᶜ) .U (ret (x ∷ l))
    --         ∎