which actually trigger side effects and are not simply processing data.
This is not what redux-observable sponsors in their examples.
Luca Matteis

Triggering side effects isn’t what makes code imperative vs declarative. In the original article, you use the terms “imperative” & “pure” somewhat interchangeably:

This function is imperative. Yes it’s returning a promise and you can chain it together with other promises, but fetch() is doing a call, at that specific moment in time. It is not pure.

You can write pure imperative code:

function removeOddsFromArray(arr) {
const newArr = [];
    for (var i = 0; i < arr.length; i++) {
if (arr[i] % 2 === 0) {
    return newArr;
console.log(removeOddsFromArray([1,2,3,4,5, 6]));

The console.log at the end is a side-effect, but removeOddsFromArray is a pure function: it takes an array as input and returns a new array out without modifying the original array.

But it’s imperative: it specifies exactly how we loop over the provided array and exactly how we decide whether to include an element, rather than deferring those implementation details to another function or the runtime.

redux-observable is still declarative because its functions are a description of data flow, including the data flow into and out of out of a side effect-producing stream. It may not be pure (although I suspect it is, but my grasp of that terminology is not strong enough to make that argument), but it is declarative.

One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.