{-# 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 โฆ ๐ โฆ