A Clojure and ClojureScript library that extends core.async with a number of convenience functions.
Exception handling is an area for which core.async doesn't have extensive
support out of the box. If something within a go block throws an exception, it
will be logged but the block will simply return nil, hiding any information
about the actual exception. You could wrap the body of each go block within an
exception handler but that's not very convenient. full.async provides a set of
helper functions and macros for dealing with exceptions in a simple manner:
go-try: equivalent ofgobut catches any exceptions thrown and returns via the resulting channel<?,alts?,<??: equivalents of<!,alts!and<!!but if the value is an exception, it will get thrown
Sometimes it may be necessary to retry certain things when they fail,
especially in distributed systems. The go-retry macro lets you achieve that,
for example:
(go-retry
{:should-retry-fn (fn [res] (= 409 (:status res)))
:retries 3
:delay 5}
(<? (make-some-http-request>)))The above method will invoke (<? (make-some-http-request>) in a go block. If
it returns {:status 409}, go-retry will wait 5 seconds and try invoking
(<? (make-some-http-request>) again. If it still fails after 3 attempts, the
last will be returned via the result channel.
Channels by themselves are quite similar to sequences however converting between
them may sometimes be cumbersome. full.async provides a set of convenience
methods for this:
<<!,<<?: takes all items from the channel and returns them as a collection. Must be used within agoblock.<<!!,<<??: takes all items from the channel and returns as a lazy sequence. Returns immediately.<!*,<?*,<!!*,<??*takes one item from each input channel and returns them in a single collection. Results have the same ordering as input channels.
pmap>> lets you apply an async function (ie. function that returns channel) to
channel's output with a specified parallelism, returning a new channel with
results.
debounce>> takes input channel and only passes through values at specified
rate, dropping the rest.
For readability of code, full.async follows these conventions:
- Async operators that throw exceptions use
?in place of!, for example throwing counterpart of<!is<?. - Functions that return channel that will contain zero or one value (typically
result of
goblocks) are sufixed with>. Similarly operators that expect zero/single value channel as input are prefixed with<(for example<?). - Functions that return channel that will contain zero to many values are
sufixed with
>>. Similarly operators that expect zero to many value channel as input are prefixed with<<(for example<<?).
See CHANGES.md.
Copyright (C) 2016 FullContact. Distributed under the Eclipse Public License, the same as Clojure.