{-# OPTIONS --no-termination-check #-}
open import Prelude
open import Algebra
module Hyper.MonadComonadic {โ} {๐ : Type โ โ Type โ} {๐บ : Type โ โ Type โ}
(mon : Monad ๐)
(comon : Comonad ๐บ) where
infixr 1 _โฌ_ _โฌโฒ_
_โฌโฒ_ : Type โ โ Type โ โ Type โ
record _โฌ_ (A : Type โ) (B : Type โ) : Type โ
{-# NO_POSITIVITY_CHECK #-}
record _โฌ_ A B where
inductive; constructor hyp
infixl 4 _ยท_
field _ยท_ : ๐บ (B โฌโฒ A) โ B
A โฌโฒ B = ๐ (B โฌ A) โ B
open _โฌ_
open Monad mon
open Comonad comon
pure : A โ ๐ A
pure = return
_<*>_ : ๐ (A โ B) โ ๐ A โ ๐ B
fs <*> xs = do
f โ fs
x โ xs
pure (f x)
infixr 9 _โ_ _โโฒ_ _โโณ_
mutual
_โโณ_ : (B โฌโฒ C) โ ๐ (A โฌ B) โ (A โฌโฒ C)
(f โโณ g) k = f โฆ g โ k โฆ
_โโฒ_ : B โฌ C โ ๐บ (A โฌโฒ B) โ (A โฌโฒ C)
(f โโฒ g) k = f ยท cmap (_โโณ k) g
_โ_ : B โฌ C โ A โฌ B โ A โฌ C
f โ g ยท k = f ยท extend (g โโฒ_) k
k : B โ A โฌ B
k x ยท _ = x
๐ : A โฌ A
๐ ยท x = extract x โฆ ๐ โฆ
infixr 5 _โ_
_โ_ : (A โ B) โ A โฌ B โ A โฌ B
f โ xs ยท k = f (extract k โฆ xs โฆ)
โณ : (A โ B) โ A โฌ B
โณ f = f โ โณ f
โฝ : A โฌ B โ ๐บ A โ B
โฝ h x = h ยท cmap const x
cata : {C : Type โ} โ ((๐บ (๐ C โ A) โ B) โ C) โ A โฌ B โ C
cata ฯ h = ฯ ฮป k โ h ยท cmap (_โ mmap (cata ฯ)) k
ana : {C : Type โ} โ (C โ ๐บ (๐ C โ A) โ B) โ C โ A โฌ B
ana ฯ r ยท k = ฯ r (cmap (_โ mmap (ana ฯ)) k)
๐ : A โฌ A โฌ B โ A โฌ B
๐ = cata ฮป where g ยท k โ g k ยท k
๐ : A โฌ B โฌ A
๐ ยท x ยท y = extract x โฆ ๐ โฆ