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