A Clojure library providing deferreds and streams for asynchronous programming and interoperability between event-driven abstractions.
Manifold is a Clojure library that provides core abstractions for asynchronous programming, specifically deferreds and streams. It solves the problem of interoperability between different event-driven libraries by acting as a translation layer, allowing developers to integrate systems that use incompatible asynchronous models seamlessly.
Clojure developers building asynchronous applications, especially those needing to bridge multiple event-driven libraries like core.async, Java BlockingQueues, or custom stream implementations.
Developers choose Manifold for its robust abstractions that simplify asynchronous composition and its unique ability to interoperate between disparate event-driven systems, reducing integration overhead and boilerplate code.
A compatibility layer for event-driven abstractions
Open-Awesome is built by the community, for the community. Submit a project, suggest an awesome list, or help improve the catalog on GitHub.
Converts between Java BlockingQueues, Clojure sequences, and core.async channels using methods like ->source and connect, as demonstrated in the README examples, simplifying integration across disparate systems.
Provides operators for deferred values that eliminate manual callback management, emphasized in the deferred documentation where it states 'no one should ever need to use on-realized'.
Supports Clojure transducers and stream-specific functions like zip, reduce, buffer, batch, and throttle, enabling advanced asynchronous data processing with built-in transforms.
Streams handle backpressure through asynchronous puts and takes with timeouts, ensuring controlled data flow in event-driven architectures without blocking operations.
The ClojureScript implementation is maintained separately in the dm3/manifold-cljs repository, which may lead to version mismatches, delayed updates, or inconsistent features compared to the Clojure version.
As a translation layer, it introduces additional complexity and potential performance overhead when interoperating between async models, which might not be necessary for projects using a single, well-supported library like core.async.
Despite being maintained since 2014, it remains at version 0.5.0, suggesting possible API instability or breaking changes, as often seen in pre-1.0 software that may not guarantee long-term compatibility.