{-# OPTIONS --no-termination-check #-}
open import Prelude
open import Algebra
module Hyper.Comonadic {g} {𝐺 : Type g → Type g} (comon : Comonad 𝐺) where
open Comonad comon
infixr 0 _↬_ _↬′_
_↬′_ : Type g → Type g → Type g
{-# NO_POSITIVITY_CHECK #-}
record _↬_ (A : Type g) (B : Type g) : Type g where
inductive
infixl 4 _·_
field _·_ : 𝐺 (B ↬′ A) → B
open _↬_
A ↬′ B = B ↬ A → B
infixr 9 _⊙_ _⊙′_
mutual
_⊙′_ : B ↬ C → 𝐺 (A ↬′ B) → 𝐺 (A ↬′ C)
f ⊙′ g = extend (λ g′ g″ → f · cmap (λ f′ k → f′ (g″ ⊙ k)) g′) g
_⊙_ : B ↬ C → A ↬ B → A ↬ C
(f ⊙ g) · k = f · (g ⊙′ k)
𝕀 : A ↬ A
𝕀 · x = extract x 𝕀
_◃_ : (𝐺 A → B) → A ↬ B → A ↬ B
(f ◃ h) · k = f (cmap (_$ h) k)
△ : (𝐺 A → B) → A ↬ B
△ f = f ◃ (△ f)
k : A → B ↬ A
k x · _ = x
▽ : A ↬ B → 𝐺 A → B
▽ h x = h · cmap const x
cata : {C : Type g} → ((𝐺 (C → A) → B) → C) → A ↬ B → C
cata ϕ h = ϕ λ k → h · cmap (_∘ cata ϕ) k
ana : {C : Type g} → (C → 𝐺 (C → A) → B) → C → A ↬ B
ana ψ r · k = ψ r (cmap (_∘ ana ψ) k)
_◂_▸_ : ∀ {A′ B′} → (𝐺 B → B′) → A ↬ B → (𝐺 A′ → A) → A′ ↬ B′
f ◂ h ▸ g = △ f ⊙ h ⊙ △ g