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 EventEmitter
, and Stream.fromDomEvent
for working with DOM events in the browser.
There are utility methods, like Stream.seq
for yielding elements from a sequence over time. The blog post, Promises + FP = Beautiful Streams explains each of the library's methods with examples first in Haskell and then in JavaScript. It also has some background on streams and reactive programming:
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.
Both of these posts will be of interest to you if you're a JavaScript programmer without much functional or reactive programming experience.