module Free.Throw where open import Function open import Data.Empty open import Data.Unit open import Data.Maybe open import Free {- A throw operation. -} data ThrowOp : Set where throw : ThrowOp {- A throw effect. -} Throw : Effect Op Throw = ThrowOp Ret Throw throw = ⊥ {- Smart constructor. -} ‵throw : ⦃ Δ ∼ Throw ▸ Δ′ ⦄ → Free Δ A ‵throw ⦃ w ⦄ = impure (inj▸ₗ throw) (⊥-elim ∘ proj-ret▸ₗ ⦃ w ⦄) {- Handler -} hThrow : ⟨ A ! Throw ⇒ ⊤ ⇒ (Maybe A) ! Δ′ ⟩ ret hThrow x _ = pure (just x) hdl hThrow throw k _ = pure nothing