feat: add commitWhenSomeNoEx?

TODO: better name?

This commit also removes the `[specialize]` annotations.
This commit is contained in:
Leonardo de Moura 2022-10-28 07:51:41 -07:00
parent 60802d83af
commit f75d59047f

View file

@ -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