More libraries are starting to blend ideas from functional programming, streams, and reactive programming. Yassine Elouafi sent in ADT Streams (License: MIT, npm: adtstream), a library that offers a stream API using promises and algebraic data types. It has methods for wrapping other streams, like
Stream.fromReadable for use with Node's Readable streams,
Stream.fromEmitter for objects that extend
Stream.fromDomEvent for working with DOM events in the browser.
There are utility methods, like
The basic idea is that you can represent different asynchronous data like events or http responses by an unifying concept called observable collections. Then you can manipulate those collections by standard array operations like map, filter, reduce, forEach ...etc.
By using Yassine's library, you can compose streams with different sources: you can mix events and readable streams with the same API.
The author also wrote From callback to (Future -> Functor -> Monad), which argues why callbacks are not composable and alternative solutions:
With composition, you never hit a wall, because you must always ask yourself "What is the return value of this function?", or put another way "What is the meaning of this thing?"
I don't mind using callbacks in my code. In fact, callbacks are great for things such as representing side effects or event notification, but once your start using them to manage your control flow, you're trapped, why? because they do not compose.