In this chapter, we learned that Clojure futures leave a lot to be desired. More specifically, Clojure futures don't provide a way to express dependencies between results. It doesn't mean, however, that we should dismiss futures altogether.
They are still a useful abstraction and with the right semantics for asynchronous computations and a rich set of combinators, such as the ones provided by imminent, they can be an ally in building reactive applications that are performant and responsive. Sometimes, this is all we need.
For the times where we need to model data that varies over time, we turn to richer frameworks that were inspired by Functional Reactive Programming (FRP) and Compositional Event Systems (CES), such as RxJava, or Communicating Sequential Processes (CSP), such as core.async. As they have a lot more to offer, much of this book has been dedicated...