0a312b4f40
This is a well-worn idea: use a `promise-channel` of `[result nil]` or `[nil error]` pairs. The `go-pair` and `<?` macros handle catching exceptions (important, given that synchronous CLJ code expects to throw rather than return an error promise or similar), allowing code like: ``` (go-pair (let [result (<? (pair-chan-fn))] (when (not result) (throw (Exception. "No result!"))) (transform result))) ``` to be expressed naturally. These are the equivalents of `async` and `await` in JS. The implementation is complicated by significant incompatibilities between CLJ and CLJS. The solution presented here takes care to separate the macro definitions into CLJ. Sadly, this requires namespacing the per-environment symbols explicitly; but we hope to minimize such code in files like this. The most significant restriction to this approach is that consumers must require the transitive dependencies of the macro-defining modules. See the included tests (both CLJ and CLJS) for the appropriate incantations (for pair-chan, core.async, and test).
7 lines
217 B
Clojure
7 lines
217 B
Clojure
(ns datomish.test
|
|
(:require
|
|
[doo.runner :refer-macros [doo-tests doo-all-tests]]
|
|
[cljs.test :as t :refer-macros [is are deftest testing]]
|
|
datomish.test-macros-test))
|
|
|
|
(doo-tests 'datomish.test-macros-test)
|