…if you were writing in a pure functional language and composed a chain of functions, and one of those functions created an IO monad that you mapped over its result to do some additional processing of the data, it would still be declarative.
This is not what redux-observable sponsors in their examples. Mid-way through a chain of observables you have other observables which actually trigger side effects and are not simply processing data.
If redux-observable simply “described” without the “triggering” then it would be declarative. But when the flow gets to that .mergeMap(), it’s gonna trigger an HTTP request. Hence imperative.