Now think about click events with cursor position data. If you draw them on a timeline, they would look like this.

That, my friend, is a stream of events, kindly nicknamed "Observable".

The click events are coming from the mouse, so the stream of events as whole is immutable, in the sense that you cannot add or remove from it after it was defined.

But what if I'm only interested in click events where x < 250? Well can't we just create a new stream by filtering like we did with arrays?

filter( (event) -> event.x < 250 )

So what's the difference between immutable arrays and Observables? Not that much. You can apply map, filter, reduce to both. On Observables, you can also apply merge, delay, concat, buffer, distinct, first, last, zip, startWith, window, takeUntil, skip, scan, sample, amb, join, flatMap.

Think of it as an asynchronous immutable array.

Rx is the underscore.js for events. But wait a second, what is an event? Can't most things in your application be an event?

Event "application started", event "API response arrived", event "keyboard key pressed", event "invalidateLayout()", event "device slept", etc.

Virtually anything can be a stream of events. It's just a matter of composing and combining them properly.

And that's Rx in 2 minutes.