Missionary
A functional effect and streaming system for clojure and clojurescript.
Maturity
Experimental status, breaking changes should be expected.
Rationale
Imperative-style concurrent programming comes along with serious pitfalls. Uncontrolled process spawning requires discipline and ceremony to properly handle failure and cancellation propagation, mixing essential and accidental complexity. Popular techniques such as channels and futures/promises don't solve this problem and often introduce concurrency concerns in otherwise purely sequential logic. missionary
takes a functional approach to this problem, modelling processes as values with precise semantics.
Guidelines
- Simple, REPL-friendly, dependency-free underlying protocols : task (specification) & flow (specification coming soon), respectively single and multiple value producers.
- Strict supervision providing transparent propagation of cancellation and failure, with strong resource cleanup guarantees.
- Unified representation of multiple-value producers supporting backpressure propagation of discrete events and lazy sampling of continuous values.
- Reactive Streams compliant
- Asynchronous design for efficiency and clojurescript compatibility
- Lightweight API leveraging standard clojure primitives (collections, transducers, reducing functions, reference types, first-class
nil
) to prevent combinatorial explosion of operators - Expressive syntax
Documentation
Reference
Tutorials
Guides
Community
- clojurians slack : #missionary