lean4-htt/Lake/Util/OptionIO.lean

44 lines
1.4 KiB
Text
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/-
Copyright (c) 2021 Mac Malone. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Mac Malone
-/
namespace Lake
/-- Conceptually identical `OptionT BaseIO`, but practically more efficient. -/
def OptionIO := EIO PUnit
instance : Monad OptionIO := inferInstanceAs (Monad (EIO PUnit))
instance : MonadLift BaseIO OptionIO := inferInstanceAs (MonadLift BaseIO (EIO PUnit))
namespace OptionIO
@[inline] def mk (x : EIO PUnit α) : OptionIO α :=
x
@[inline] def toBaseIO (self : OptionIO α) : BaseIO (Option α) :=
fun s => match self s with
| EStateM.Result.ok a s => EStateM.Result.ok (some a) s
| EStateM.Result.error _ s => EStateM.Result.ok none s
@[inline] def toEIO (self : OptionIO α) : EIO PUnit α :=
self
@[inline] def toIO (f : Unit → IO.Error) (self : OptionIO α) : IO α :=
self.toEIO.toIO f
@[inline] def catchFailure (f : Unit → BaseIO α) (self : OptionIO α) : BaseIO α :=
self.toEIO.catchExceptions f
protected def failure : OptionIO α :=
mk <| throw ()
protected def orElse (self : OptionIO α) (f : Unit → OptionIO α) : OptionIO α :=
mk <| tryCatch self.toEIO f
instance : Alternative OptionIO where
failure := OptionIO.failure
orElse := OptionIO.orElse
def asTask (self : OptionIO α) (prio := Task.Priority.dedicated) : BaseIO (Task (Option α)) :=
self.toBaseIO.asTask prio