The APIs in this proposal can be delivered either as a library or as an extension to the Clojure language.
Extending the Clojure language has the benefits of enhancing the existing
future in a standard way. Having a standard mechanism for callbacks at the language level will facilitate sharing callbacks across different libraries and frameworks.
A callback function (really, any function) can do one of three things:
Promises do not provide an API to report partial progress during a long-running operation. Progress reporting can be handled through other means such as watches.
Promises can be implemented in ClojureScript, subject to the following limitations:
- There is no notion of executors Callbacks execute either synchronously or asynchronously apart from "execute immediately" or "execute asynchronously" (e.g., with with
derefon an unrealized promise cannot block; instead it throws an exception
- Promise/Futures with callbacks (Clojure-dev group)
- lamina and channels-driven concurrency with clojure (Clojure group)
- reactive programing (dev.clojure.org)
- can a better Future be exposed by API? (Datomic group)
References / Related Work
- C# / .NET
Comparison to Guava ListenableFuture
Guava's ListenableFuture takes the same basic approach of passing a Runnable and an Executor for the callback. It should be trivial to extend the INotify and IDeliver protocols to Guava's ListenableFuture and SettableFuture.