{-# OPTIONS --without-K #-} open import Level open import Type hiding (★) open import Function open import Data.Product hiding (map) module Category.Monad.Continuation.Alias {t} where Cont : ∀ {a} → ★ t → ★ a → ★ _ Cont T A = (A → T) → T module _ {T : ★ t} where M : ∀ {a} → ★ a → ★ _ M = Cont T module _ {a b} {A : ★ a} {B : ★ b} where map : (A → B) → (M A → M B) map f mx k = mx λ x → k (f x) _>>=_ : M A → (A → M B) → M B (mx >>= f) k = mx λ x → (f x) k module _ {a} {A : ★ a} where return : A → M A return x k = k x join : M (M A) → M A join mmx = mmx >>= id module _ {b} {B : ★ b} where _⊛_ : M (A → B) → M A → M B mf ⊛ mx = mf >>= λ f → map f mx module _ {b} {B : A → ★ b} where _⟨,⟩_ : M A → (∀ {x} → M (B x)) → M (Σ A B) (fA ⟨,⟩ fB) f = fA (fB ∘ curry f) module _ {b} {B : ★ b} where _⟨,⟩′_ : M A → M B → M (A × B) mx ⟨,⟩′ my = mx ⟨,⟩ my module _ {a b c} {A : ★ a} {B : ★ b} {C : ★ c} where ⟪_·_·_⟫ : (A → B → C) → M A → M B → M C ⟪ f · mx · my ⟫ = map f mx ⊛ my