first, let’s look at
something maybe
completely
unexpected…
(functional) reactive programming
as the only true way to overcome
ever-changing data
pavlo.baron@codecentric.de
@pavlobaron
what is non-reactive
programming?
a = 1!
b = a + 1!
// a == 1, b == 2
a = a + 1!
// a == 2, b == 2
what is reactive
programming?
a = 1!
b = a + 1!
// a == 1, b == 2
a = a + 1!
// a == 2, b == 3
or even…
a = 1!
b = a + 1!
c = b + 1!
// a == 1, b == 2, c == 3
a = a + 1!
// a == 2, b == 3, c == 4
and so on.
you get the point
what is functional
reactive programming?
!

f(g(h(i(j(a)))))!
!

with a changing over time
how can this be
modelled?
time,
signal,
event,
flow,
transport,
logic
are separated
values change over time. Logic
doesn’t explicitly take time
into account
every value change
signals/triggers re-computation
of the subgraph
of the logic relying
on the value
events are recurrent
or non-recurrent, not backing
any specific value.
They can be similar to signals,
but can also lead to
dynamic flow modification,
configuration propagation etc.
flow is
a dynamic graph of logic,
with routing rules based
on value dependencies
transport is
an infrastructural detail.
Transports implement flows in
a specific environment, be it a single
machine or a distributed system
logic defines what happens
when a value changes,
be it normal
or exceptional behaviour
2 example foundations
for (F)RP
disclaimer
!

no real code examples here,
as they don’t contribute to the communication of
concepts, but instead tend to end up in
discussions about syntax and programming
language theory.
!

Also, real code on slides, you know..
Erlang
(erlang.org)
there is no value re-assignment in Erlang.
Values changing
over time can be
“encapsulated” in the
process (actor) loop
signals can be modelled in Erlang
as messages sent to actor groups
with
every holding actor’s loop run
events can be modelled as
messages sent to relevant actors or
whole groups. Some events are
already provided by the runtime
flow can be modelled as hierarchy of
actors and their groups, with the ability to
dynamically change it,
add new actors or even modify
their code at runtime
transport is what the runtime already
offers out-of-the-box: message
delivery to local actors or remote ones,
with location transparency
logic can be implemented as
pattern-matched functions,
called as actors’ callbacks on
arriving messages
Erlang doesn’t implement (F)RP
abstractions as first-class citizens,
but it offers more general
abstractions to model these
Elm
(elm-lang.org)
little example from
Elm web page.
!

(hope it still works,
‘cause sometimes live demos
just don’t work..)
values changing over time
represent UI elements, time ticks,
mouse position and other values
that can (interactively) change
signals and events are
combined, simplifying
programming interface
flow is combination of signals,
through the nature of programming
for the web-browser configurable
and changeable
signal transportation is done trough
“lifting” of signals through functions,
out-of-the-box available HTTP
communication with a “server”
logic are reusable, minimal,
theoretically sequentially
combinable, regular functions
Elm implements FRP
pragmatically, focused on webbrowser applications and UIbased interactions
more example foundations exist,
implementing the
concepts partially or fully,
adopting them as far as possible
for a particular platform.
!

Rx*, Reactor, Akka, Bacon.js +++
thought experiment:
modelling immediate,
continuous analytics on never
ending streams of data
values changing over time
appear as payloads on streams
from different channels
signals are notifications sent to a
component’s downstream whenever
it has computed a value based on
its upstream. Signal is an indication
of new / modified value availability
events are recurrent time
ticks, configuration and
flow modifications etc.
flow is a topology of
components, connected
through streams
transport is inner-process, inter-process
and distributed communication through
embedded or external messaging
middleware
logic are reusable, theoretically
sequentially combinable components
that implement minimal pieces such
as statistics, filters, aggregates,
parts of continuous queries etc.
what problem domains
can be addressed by
(F)RP?
interaction
streaming
robotics
continuous analytics
M2M communication
++
theoretically every problem where complex,
hierarchical/staged logic needs to be
reapplied when some values constantly change
what are implications
of (F)RP on architecture?
reaction
paradigm switch
declarative flow control
different approach to testing
harder to debug
overflow protection
high componentisation
thank you

(Functional) reactive programming (@pavlobaron)