org.sbrubbles.conditio
A simple condition library.
Example usage:
(require '[org.sbrubbles.conditio :as c])
;; ...
(c/handle [:condition #(c/restart :restart (:n %))]
(c/with [:restart inc]
(assert (= (c/signal :condition :n 1)
2))))
*handlers*
dynamic
A map with the available handlers, stored as handler chains. Use handle
to install new handlers.
A handler is a function which takes a condition and returns the value signal
should return. A handler chain is a list of handlers, to be run one at a time until the first non-(skip)
value is returned.
*restarts*
dynamic
A map with the available restarts. Use with
to install new restarts, and restart
to run them.
A restart is a function which recovers from conditions, expected to be called from a handler.
abort
(abort)
(abort c)
Throws an exception, taking an optional argument. The 1-arity version also works as a handler.
condition
(condition c)
(condition id & {:as args})
Creates a new condition, or returns it unchanged if it’s the sole argument. id
cannot be nil.
condition?
(condition? v)
Checks if the given value is a condition: a map with :org.sbrubbles.conditio/id
mapped to a non-nil
value.
handle
macro
(handle bindings & body)
Takes a map of keyword/handler pairs. This macro:
- installs the given handlers as a thread-local binding;
- executes the given body;
- pops the given handlers after body was evaluated; and
- returns the value of body.
restart
(restart option & args)
Searches for a restart mapped to option
, and then runs it with args
.
Signals :org.sbrubbles.conditio/restart-not-found
if no restart mapped to option could be found.
signal
(signal id & {:as args})
Signals a condition, searching for a handler and returning whatever it returns. id
and args
will be used to create the condition, as in condition
.
Signals :org.sbrubbles.conditio/handler-not-found
if a handler couldn’t be found.
skip
(skip)
(skip _)
Returns a value which, when returned by a handler, means that it opted not to handle the condition, and the handler chain should try the next one in line.
The 1-arity version works as a handler, and returns the same value.
with
macro
(with bindings & body)
Takes a map of keyword/restart pairs, and then:
- installs the given restarts as a thread-local binding;
- executes the given body;
- pops the given restarts after body was evaluated; and
- returns the value of body.
with-fn
(with-fn restart-map f)
Returns a function, which will install the given restarts and then run f
. This may be used to define a helper function which runs on a different thread, but needs the given restarts in place.