{-# OPTIONS --safe #-} module Prelude.Result where open import Prelude.Init open import Prelude.Decidable open import Prelude.Monad private variable A B E E₁ : Type data Result (E A : Type) : Type where Ok : A → Result E A Err : E → Result E A instance Monad-Result : Monad (Result E) Monad-Result ._>>=_ (Ok x) f = f x Monad-Result ._>>=_ (Err e) _ = Err e Monad-Result .return = Ok IsOk : Result E A → Type IsOk (Ok _) = ⊤ IsOk (Err _) = ⊥ _catch_ : Result E A → (E → Result E₁ A) → Result E₁ A Ok x catch _ = Ok x Err e catch h = h e mapErr : (E → E₁) → Result E A → Result E₁ A mapErr f (Ok x) = Ok x mapErr f (Err e) = Err (f e) _`mapErr`_ : Result E A → (E → E₁) → Result E₁ A m `mapErr` h = mapErr h m mapErr-IsOk : {r : Result E A} {f : E → E₁} → IsOk r → IsOk (mapErr f r) mapErr-IsOk {r = Ok x} ok = _ DecResult : Type → Type DecResult A = Result (¬ A) A decResult : Dec A → DecResult A decResult (yes p) = Ok p decResult (no ¬p) = Err ¬p ¿_¿ᴿ : (A : Type) → ⦃ A ⁇ ⦄ → DecResult A ¿ A ¿ᴿ = decResult ¿ A ¿ ¿_¿ᴿ:_ : (A : Type) → ⦃ A ⁇ ⦄ → (¬ A → E) → Result E A ¿ A ¿ᴿ: h = mapErr h ¿ A ¿ᴿ isJustᴿ : {A : Type} (m : Maybe A) → Result (m ≡ nothing) (∃[ x ] m ≡ just x) isJustᴿ (just x) = Ok (x , refl) isJustᴿ nothing = Err refl