feat: add commitWhenSomeNoEx?
TODO: better name? This commit also removes the `[specialize]` annotations.
This commit is contained in:
parent
60802d83af
commit
f75d59047f
1 changed files with 21 additions and 7 deletions
|
|
@ -13,19 +13,33 @@ class MonadBacktrack (s : outParam Type) (m : Type → Type) where
|
|||
|
||||
export MonadBacktrack (saveState restoreState)
|
||||
|
||||
@[specialize] def commitWhenSome? [Monad m] [MonadBacktrack s m] [MonadExcept ε m] (x? : m (Option α)) : m (Option α) := do
|
||||
/--
|
||||
Execute `x?`, but backtrack state if result is `none` or an exception was thrown.
|
||||
-/
|
||||
def commitWhenSome? [Monad m] [MonadBacktrack s m] [MonadExcept ε m] (x? : m (Option α)) : m (Option α) := do
|
||||
let s ← saveState
|
||||
try
|
||||
match (← x?) with
|
||||
| some a => pure (some a)
|
||||
| some a => return some a
|
||||
| none =>
|
||||
restoreState s
|
||||
pure none
|
||||
return none
|
||||
catch ex =>
|
||||
restoreState s
|
||||
throw ex
|
||||
|
||||
@[specialize] def commitWhen [Monad m] [MonadBacktrack s m] [MonadExcept ε m] (x : m Bool) : m Bool := do
|
||||
/--
|
||||
Execute `x?`, but backtrack state if result is `none` or an exception was thrown.
|
||||
If an exception is thrown, `none` is returned.
|
||||
That is, this function is similar to `commitWhenSome?`, but swallows the exception and returns `none`.
|
||||
-/
|
||||
def commitWhenSomeNoEx? [Monad m] [MonadBacktrack s m] [MonadExcept ε m] (x? : m (Option α)) : m (Option α) :=
|
||||
try
|
||||
commitWhenSome? x?
|
||||
catch _ =>
|
||||
return none
|
||||
|
||||
def commitWhen [Monad m] [MonadBacktrack s m] [MonadExcept ε m] (x : m Bool) : m Bool := do
|
||||
let s ← saveState
|
||||
try
|
||||
match (← x) with
|
||||
|
|
@ -37,7 +51,7 @@ export MonadBacktrack (saveState restoreState)
|
|||
restoreState s
|
||||
throw ex
|
||||
|
||||
@[specialize] def commitIfNoEx [Monad m] [MonadBacktrack s m] [MonadExcept ε m] (x : m α) : m α := do
|
||||
def commitIfNoEx [Monad m] [MonadBacktrack s m] [MonadExcept ε m] (x : m α) : m α := do
|
||||
let s ← saveState
|
||||
try
|
||||
x
|
||||
|
|
@ -45,14 +59,14 @@ export MonadBacktrack (saveState restoreState)
|
|||
restoreState s
|
||||
throw ex
|
||||
|
||||
@[specialize] def withoutModifyingState [Monad m] [MonadFinally m] [MonadBacktrack s m] (x : m α) : m α := do
|
||||
def withoutModifyingState [Monad m] [MonadFinally m] [MonadBacktrack s m] (x : m α) : m α := do
|
||||
let s ← saveState
|
||||
try
|
||||
x
|
||||
finally
|
||||
restoreState s
|
||||
|
||||
@[specialize] def observing? [Monad m] [MonadBacktrack s m] [MonadExcept ε m] (x : m α) : m (Option α) := do
|
||||
def observing? [Monad m] [MonadBacktrack s m] [MonadExcept ε m] (x : m α) : m (Option α) := do
|
||||
let s ← saveState
|
||||
try
|
||||
x
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue