Reactive in Elixir

Hi all
In those days a lot people is talking about Rective Programming.
I want to ask, does elixir support the pattern too?


1 Like

Which kind of reactive programming are you asking about?

If you are referring to the the Reactive Programming as in the Reactive Manifesto, the manifesto is seen by many as mostly a marketing spin on patterns that Erlang and the Erlang VM have been doing for almost 3 decades. And Elixir inherits all of that. For example, you use supervisors for resiliency, Erlang’s preemptive processes allows us to better predict latency and therefore responsiveness, etc. Even when we look at key aspects, such as being as event-driven, in Erlang/Elixir is part an integral part of the language and of the runtime via message passing, instead of something bolt on top.

However, if you are referring to the reactive programming related to data flows, as seen in Excel spreadsheets or language like Elm, Elixir has limited supported. Projects like GenStage and Flow are starting to explore such areas but there is a lot more to learn and work on.


There was another thread about this question recently, you may want to look there: Is Phoenix 'Reactive' like the Play framework?


I guess somewhat related, I’ve been wondering for a while what an Rx library in Elixir would look like.


Thanks for clarify jose.

Well we have GenEvent and a few similar libraries…

In my early talks about data flows and parallel processing in Elixir, Rx was constantly mentioned as a reference. The goal was to have functions that introduce state or asynchronicity in the Stream module. But in order to have async or state, we need processes and then we need to think about supervision trees. At some point it became clearer Rx/Stream was not the way to go and we focused more directly on what became GenStage today. Unless I am mistaken, I briefly explored those topics in ElixirConf EU 2015 (in Krakow).

When going from Streams to Flows in Elixir, we are going from lazy+purely functional to async+parallel. There is definitely a gap in there, which are collections that are async or stateful but not yet parallel. That’s where Rx would fit in.

While I am not confident it is a gap worth exploring, given we have Streams and Flows at the boundaries, an Rx like system could (should?) be implemented using GenStage, as it would transparently handle most the data exchange concerns.


Thanks, that makes sense. I am really interested in digging into GenStage and Flow especially after seeing the slides from your ElixirConf presentation. I think both are going to lead to some very interesting things