Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days...

75
Functional & Reactive UIs with JavaScript Lambda Days 2016

Transcript of Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days...

Page 1: Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days 2016. Survey 2. OOP: Alan Key Objects communicate by asynchronous message passing.

Functional & Reactive UIs with JavaScript

Lambda Days 2016

Page 2: Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days 2016. Survey 2. OOP: Alan Key Objects communicate by asynchronous message passing.

Survey

2

Page 3: Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days 2016. Survey 2. OOP: Alan Key Objects communicate by asynchronous message passing.

OOP: Alan KeyObjects communicate by asynchronous message passing

Page 4: Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days 2016. Survey 2. OOP: Alan Key Objects communicate by asynchronous message passing.

Zaiste@zaiste

Page 5: Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days 2016. Survey 2. OOP: Alan Key Objects communicate by asynchronous message passing.

5

Page 6: Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days 2016. Survey 2. OOP: Alan Key Objects communicate by asynchronous message passing.

6

Page 7: Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days 2016. Survey 2. OOP: Alan Key Objects communicate by asynchronous message passing.

My story

7

Page 8: Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days 2016. Survey 2. OOP: Alan Key Objects communicate by asynchronous message passing.

2005

8

Page 9: Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days 2016. Survey 2. OOP: Alan Key Objects communicate by asynchronous message passing.

PythonResearch Internship at LIMSI in Paris

9

Page 10: Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days 2016. Survey 2. OOP: Alan Key Objects communicate by asynchronous message passing.

Functional programming

10

Page 11: Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days 2016. Survey 2. OOP: Alan Key Objects communicate by asynchronous message passing.

First-class functionsFunctions as datatype: passed around, returned, etc.

Page 12: Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days 2016. Survey 2. OOP: Alan Key Objects communicate by asynchronous message passing.

OCamlIntroduction to functional programming by Marc Pouzet

12

Page 13: Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days 2016. Survey 2. OOP: Alan Key Objects communicate by asynchronous message passing.

MLDeveloped in 1970 by Robin Milner

13

Page 14: Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days 2016. Survey 2. OOP: Alan Key Objects communicate by asynchronous message passing.

ML InfluenceHaskell, Elm, …

14

Page 15: Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days 2016. Survey 2. OOP: Alan Key Objects communicate by asynchronous message passing.

UIs

15

Page 16: Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days 2016. Survey 2. OOP: Alan Key Objects communicate by asynchronous message passing.

HCIHuman-Computer Interaction

H C

Page 17: Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days 2016. Survey 2. OOP: Alan Key Objects communicate by asynchronous message passing.

Model-View-ControllerTrygve Reenskaug in the 1970s

Page 18: Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days 2016. Survey 2. OOP: Alan Key Objects communicate by asynchronous message passing.

Smalltalk-76At XEROX PARC

Page 19: Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days 2016. Survey 2. OOP: Alan Key Objects communicate by asynchronous message passing.

MVCDigital model vs Mental model

Page 20: Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days 2016. Survey 2. OOP: Alan Key Objects communicate by asynchronous message passing.

View

Model

Controller

User

Page 21: Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days 2016. Survey 2. OOP: Alan Key Objects communicate by asynchronous message passing.

Callback-basedClassical approach

Page 22: Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days 2016. Survey 2. OOP: Alan Key Objects communicate by asynchronous message passing.

Functional UIs

22

Page 23: Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days 2016. Survey 2. OOP: Alan Key Objects communicate by asynchronous message passing.

ReactGreatly improved rendering engine

Page 24: Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days 2016. Survey 2. OOP: Alan Key Objects communicate by asynchronous message passing.

DeclarativeSimple and straightforward UI representation

Page 25: Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days 2016. Survey 2. OOP: Alan Key Objects communicate by asynchronous message passing.

UI is fn of stateFunctional foundation

Page 26: Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days 2016. Survey 2. OOP: Alan Key Objects communicate by asynchronous message passing.

f(D0) -> V0

Page 27: Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days 2016. Survey 2. OOP: Alan Key Objects communicate by asynchronous message passing.

f(D1) -> V1

Page 28: Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days 2016. Survey 2. OOP: Alan Key Objects communicate by asynchronous message passing.

diff(V0, V1) = changes

Page 29: Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days 2016. Survey 2. OOP: Alan Key Objects communicate by asynchronous message passing.

DOM

Data

Virtual DOM

Page 30: Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days 2016. Survey 2. OOP: Alan Key Objects communicate by asynchronous message passing.

View

Store

DispatcherActions

User Inputs

Callbacks

Action Creators

Page 31: Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days 2016. Survey 2. OOP: Alan Key Objects communicate by asynchronous message passing.

New ConceptsDifficult for newcomers

Page 32: Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days 2016. Survey 2. OOP: Alan Key Objects communicate by asynchronous message passing.

Reactive programming

32

Page 33: Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days 2016. Survey 2. OOP: Alan Key Objects communicate by asynchronous message passing.

A spreadsheetMost popular reactive programming tool

Page 34: Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days 2016. Survey 2. OOP: Alan Key Objects communicate by asynchronous message passing.

A B

34

Page 35: Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days 2016. Survey 2. OOP: Alan Key Objects communicate by asynchronous message passing.

PassiveB allows others to change its state

35

Page 36: Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days 2016. Survey 2. OOP: Alan Key Objects communicate by asynchronous message passing.

ReactiveB manages its state by reacting to external events

36

Page 37: Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days 2016. Survey 2. OOP: Alan Key Objects communicate by asynchronous message passing.

Separation of concernsA and B are responsible for themselves

37

Page 38: Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days 2016. Survey 2. OOP: Alan Key Objects communicate by asynchronous message passing.

EncapsulationB hides its internals

38

Page 39: Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days 2016. Survey 2. OOP: Alan Key Objects communicate by asynchronous message passing.

ReactiveIndependent, self-contained modules

39

Page 40: Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days 2016. Survey 2. OOP: Alan Key Objects communicate by asynchronous message passing.

Values over timeFirst class concept

Page 41: Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days 2016. Survey 2. OOP: Alan Key Objects communicate by asynchronous message passing.

ObservableSimple abstraction: Observer + Iterator

41

Page 42: Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days 2016. Survey 2. OOP: Alan Key Objects communicate by asynchronous message passing.

Marble Diagram

Page 43: Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days 2016. Survey 2. OOP: Alan Key Objects communicate by asynchronous message passing.

Lazy event stream0+ events, finite or infinite

43

Page 44: Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days 2016. Survey 2. OOP: Alan Key Objects communicate by asynchronous message passing.

AsynchronicityDoing more simpler

Page 45: Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days 2016. Survey 2. OOP: Alan Key Objects communicate by asynchronous message passing.

What, not howDeclarative approach to program logic

Page 46: Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days 2016. Survey 2. OOP: Alan Key Objects communicate by asynchronous message passing.

Simple compositionOutputs can be given as inputs

Page 47: Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days 2016. Survey 2. OOP: Alan Key Objects communicate by asynchronous message passing.

UnificationPromises, Callbacks, Web Workers, Web Sockets

Page 48: Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days 2016. Survey 2. OOP: Alan Key Objects communicate by asynchronous message passing.

RxJSJavaScript reactive programming library

Page 49: Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days 2016. Survey 2. OOP: Alan Key Objects communicate by asynchronous message passing.

const doubleClickObservable = clickObservable .buffer(() => clickObservable.debounce(250)) .map(arr => arr.length) .filter(x => x === 2);

49

Page 50: Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days 2016. Survey 2. OOP: Alan Key Objects communicate by asynchronous message passing.

Let’s combine

50

Page 51: Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days 2016. Survey 2. OOP: Alan Key Objects communicate by asynchronous message passing.

51

Page 52: Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days 2016. Survey 2. OOP: Alan Key Objects communicate by asynchronous message passing.

Cycle.jsFunctional and reactive UI framework in JavaScript

52

Page 53: Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days 2016. Survey 2. OOP: Alan Key Objects communicate by asynchronous message passing.

ConciseBoth the framework and applications built with it

Page 54: Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days 2016. Survey 2. OOP: Alan Key Objects communicate by asynchronous message passing.

Simple APICycle.run()

Page 55: Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days 2016. Survey 2. OOP: Alan Key Objects communicate by asynchronous message passing.

fn : input -> outputConstant dialogue

http://cycle.js.org/dialogue.html

Page 56: Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days 2016. Survey 2. OOP: Alan Key Objects communicate by asynchronous message passing.

computer()fn : inputDevices -> outputDevices

Page 57: Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days 2016. Survey 2. OOP: Alan Key Objects communicate by asynchronous message passing.

human()fn : senses -> actuators

Page 58: Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days 2016. Survey 2. OOP: Alan Key Objects communicate by asynchronous message passing.

UIs as « cycles »Natural way for interactions

Page 59: Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days 2016. Survey 2. OOP: Alan Key Objects communicate by asynchronous message passing.

main()Your application as a pure function

Page 60: Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days 2016. Survey 2. OOP: Alan Key Objects communicate by asynchronous message passing.

function computer(userEventsObservable) { return userEventsObservable .map(event => /* ... */) .filter(somePredicate) .flatMap(transformItToScreenPixels);}

Page 61: Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days 2016. Survey 2. OOP: Alan Key Objects communicate by asynchronous message passing.

Sourcesinputs: read effects from the external world

Page 62: Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days 2016. Survey 2. OOP: Alan Key Objects communicate by asynchronous message passing.

Sinksoutputs: write effects to apply to the external world

Page 63: Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days 2016. Survey 2. OOP: Alan Key Objects communicate by asynchronous message passing.

DriversPlugins that manage the side effects

Page 64: Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days 2016. Survey 2. OOP: Alan Key Objects communicate by asynchronous message passing.

Model-View-IntentParts of the main() function

Page 65: Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days 2016. Survey 2. OOP: Alan Key Objects communicate by asynchronous message passing.

IntentProcessing inputs from the external world

Page 66: Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days 2016. Survey 2. OOP: Alan Key Objects communicate by asynchronous message passing.

ModelIt represents the state

Page 67: Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days 2016. Survey 2. OOP: Alan Key Objects communicate by asynchronous message passing.

Viewit creates the output e.g. virtual dom

Page 68: Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days 2016. Survey 2. OOP: Alan Key Objects communicate by asynchronous message passing.

ComposableDataflow components

Page 69: Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days 2016. Survey 2. OOP: Alan Key Objects communicate by asynchronous message passing.

Demo

Page 70: Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days 2016. Survey 2. OOP: Alan Key Objects communicate by asynchronous message passing.

function main() { return { DOM: Rx.Observable.interval(1000) .map(i => CycleDOM.h1('' + i + ' seconds elapsed')) };}

Page 71: Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days 2016. Survey 2. OOP: Alan Key Objects communicate by asynchronous message passing.

function main(sources) { return { DOM: sources.DOM.select('.field').events('input') .map(ev => ev.target.value) .startWith('') .map(name => div([ input('.field', {attributes: {type: 'text'}}), h1('Hello ' + name), ]) ) };}

Page 72: Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days 2016. Survey 2. OOP: Alan Key Objects communicate by asynchronous message passing.

FunctionalApplications made of pure functions

72

Page 73: Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days 2016. Survey 2. OOP: Alan Key Objects communicate by asynchronous message passing.

ReactiveObservables simplify events, async & errors handling

73

Page 74: Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days 2016. Survey 2. OOP: Alan Key Objects communicate by asynchronous message passing.

Limitationshttp://lambda-the-ultimate.org/node/4900

Page 75: Functional & Reactive UIs with JavaScript · Functional & Reactive UIs with JavaScript Lambda Days 2016. Survey 2. OOP: Alan Key Objects communicate by asynchronous message passing.

Q? / Thank you

75