functional & reactive uis with javascript · functional & reactive uis with javascript...

75
Functional & Reactive UIs with JavaScript Lambda Days 2016

Upload: others

Post on 09-Jun-2020

17 views

Category:

Documents


0 download

TRANSCRIPT

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