SlideShare a Scribd company logo
Cycle.js
Who am I?
Arye Lukashevski
Software Engineer @ Wix.com
Intro
What’s Reactive programming?
Foo depends on Bar
But who owns the relationship?
Foo Bar
Proactive
• Foo invokes the action
• Bar has an API for interaction
• ‘Find usages’
Foo Bar
Proactive Passive
function	onClick()	{	
	Bar.increment();	
}	
Foo
Foo Bar
Listenable Reactive
Foo.addSub('click',	()	=>	{	
	self.increment();	
});	
Bar
Reactive
• Foo emits events
• Bar subscribes
• Bar changes its state
A B
1 0 =A1 + A2
2 0 0
What’s Reactive programming?
A B
1 2 =A1 + A2
2 3 0
What’s Reactive programming?
A B
1 2 5
2 3 0
What’s Reactive programming?
Cycle.JS
Fully Reactive framework
RxJS as stream handlers
DOMDriver
main(DOM){
return fn(DOM);
}
Cycle.js data flow
DOMDriver
main(DOM){
return fn(DOM);
}
Event
Cycle.js data flow
DOMDriver
main(DOM){
return fn(DOM);
}
Event
Cycle.js data flow
DOMDriver
main(DOM){
return fn(DOM);
}
Event
Cycle.js data flow
DOMDriver
main(DOM){
return fn(DOM);
}
Event
Cycle.js data flow
DOMDriver
main(DOM){
return fn(DOM);
}
Event<li/>…<li/>
Cycle.js data flow
DOMDriver
main(DOM){
return fn(DOM);
}
<li/>…<li/>
Cycle.js data flow
DOMDriver
main(DOM){
return fn(DOM);
}
<li/>…<li/>
Cycle.js data flow
DOMDriver
main(DOM){
return fn(DOM);
}
<li/>…<li/>
Cycle.js data flow
DOMDriver
main(DOM){
return fn(DOM);
}
Cycle.js data flow
DOMDriver
main(DOM){
return fn(DOM);
}
Cycle.js data flow
DOMDriver
main(DOM){
return fn(DOM);
}
Cycle.js data flow
Demo - Pizza topping selection
Demo light - Checkbox
let main = ({DOM}) => {

const intent$ = DOM.select('input').events('change');

const model$ = intent$.map(ev => ev.target.checked)

.startWith(false);

const view$ = model$.map(toggled =>

div([

input({type: 'checkbox'}), 'Toggle me',

p(toggled ? 'ON' : 'off')

]));

return {DOM: view$};

};
Cycle.run(main,	{	
	DOM:	makeDOMDriver('#app')	
});
let main = ({DOM}) => {

const intent$ = DOM.select('input').events('change');

const model$ = intent$.map(ev => ev.target.checked)

.startWith(false);

const view$ = model$.map(toggled =>

div([

input({type: 'checkbox'}), 'Toggle me',

p(toggled ? 'ON' : 'off')

]));

return {DOM: view$};

};
Cycle.run(main,	{	
	DOM:	makeDOMDriver('#app')	
});
let main = ({DOM}) => {



















};
Cycle.run(main,	{	
	DOM:	makeDOMDriver('#app')	
});
let main = ({DOM}) => {

const intent$ = DOM.select('input').events('change');

const model$ = intent$.map(ev => ev.target.checked)

.startWith(false);

const view$ = model$.map(toggled =>

div([

input({type: 'checkbox'}), 'Toggle me',

p(toggled ? 'ON' : 'off')

]));

return {DOM: view$};

};
Cycle.run(main,	{	
	DOM:	makeDOMDriver('#app')	
});


div([

input({type: 'checkbox'}), 'Toggle me',

p(toggled ? 'ON' : 'off')

]));

let main = ({DOM}) => {



















};
Cycle.run(main,	{	
	DOM:	makeDOMDriver('#app')	
});
let main = ({DOM}) => {

const intent$ = DOM.select('input').events('change');

const model$ = intent$.map(ev => ev.target.checked)

.startWith(false);

const view$ = model$.map(toggled =>

div([

input({type: 'checkbox'}), 'Toggle me',

p(toggled ? 'ON' : 'off')

]));

return {DOM: view$};

};
Cycle.run(main,	{	
	DOM:	makeDOMDriver('#app')	
});
const intent$ = DOM.select('input').events('change');


div([

input({type: 'checkbox'}), 'Toggle me',

p(toggled ? 'ON' : 'off')

]));

let main = ({DOM}) => {



















};
Cycle.run(main,	{	
	DOM:	makeDOMDriver('#app')	
});
let main = ({DOM}) => {

const intent$ = DOM.select('input').events('change');

const model$ = intent$.map(ev => ev.target.checked)

.startWith(false);

const view$ = model$.map(toggled =>

div([

input({type: 'checkbox'}), 'Toggle me',

p(toggled ? 'ON' : 'off')

]));

return {DOM: view$};

};
Cycle.run(main,	{	
	DOM:	makeDOMDriver('#app')	
});
const intent$ = DOM.select('input').events('change');
const model$ = intent$.map(ev => ev.target.checked)



div([

input({type: 'checkbox'}), 'Toggle me',

p(toggled ? 'ON' : 'off')

]));

let main = ({DOM}) => {



















};
Cycle.run(main,	{	
	DOM:	makeDOMDriver('#app')	
});
let main = ({DOM}) => {

const intent$ = DOM.select('input').events('change');

const model$ = intent$.map(ev => ev.target.checked)

.startWith(false);

const view$ = model$.map(toggled =>

div([

input({type: 'checkbox'}), 'Toggle me',

p(toggled ? 'ON' : 'off')

]));

return {DOM: view$};

};
Cycle.run(main,	{	
	DOM:	makeDOMDriver('#app')	
});
const intent$ = DOM.select('input').events('change');
const model$ = intent$.map(ev => ev.target.checked)



div([

input({type: 'checkbox'}), 'Toggle me',

p(toggled ? 'ON' : 'off')

]));

let main = ({DOM}) => {



















};
Cycle.run(main,	{	
	DOM:	makeDOMDriver('#app')	
});
const view$ = model$.map(toggled =>









return {DOM: view$};
let main = ({DOM}) => {

const intent$ = DOM.select('input').events('change');

const model$ = intent$.map(ev => ev.target.checked)

.startWith(false);

const view$ = model$.map(toggled =>

div([

input({type: 'checkbox'}), 'Toggle me',

p(toggled ? 'ON' : 'off')

]));

return {DOM: view$};

};
Cycle.run(main,	{	
	DOM:	makeDOMDriver('#app')	
});
const intent$ = DOM.select('input').events('change');
const model$ = intent$.map(ev => ev.target.checked)



div([

input({type: 'checkbox'}), 'Toggle me',

p(toggled ? 'ON' : 'off')

]));

let main = ({DOM}) => {



















};
Cycle.run(main,	{	
	DOM:	makeDOMDriver('#app')	
});
.startWith(false);
const view$ = model$.map(toggled =>









return {DOM: view$};
let main = ({DOM}) => {

const intent$ = DOM.select('input').events('change');

const model$ = intent$.map(ev => ev.target.checked)

.startWith(false);

const view$ = model$.map(toggled =>

div([

input({type: 'checkbox'}), 'Toggle me',

p(toggled ? 'ON' : 'off')

]));

return {DOM: view$};

};
Cycle.run(main,	{	
	DOM:	makeDOMDriver('#app')	
});
const intent$ = DOM.select('input').events('change');
const model$ = intent$.map(ev => ev.target.checked)



div([

input({type: 'checkbox'}), 'Toggle me',

p(toggled ? 'ON' : 'off')

]));

let main = ({DOM}) => {



















};
Cycle.run(main,	{	
	DOM:	makeDOMDriver('#app')	
});
.startWith(false);
const view$ = model$.map(toggled =>









return {DOM: view$};
let main = ({DOM}) => {

const intent$ = DOM.select('input').events('change');

const model$ = intent$.map(ev => ev.target.checked)

.startWith(false);

const view$ = model$.map(toggled =>

div([

input({type: 'checkbox'}), 'Toggle me',

p(toggled ? 'ON' : 'off')

]));

return {DOM: view$};

};
Cycle.run(main,	{	
	DOM:	makeDOMDriver('#app')	
});
const intent$ = DOM.select('input').events('change');
const model$ = intent$.map(ev => ev.target.checked)



div([

input({type: 'checkbox'}), 'Toggle me',

p(toggled ? 'ON' : 'off')

]));

let main = ({DOM}) => {



















};
Cycle.run(main,	{	
	DOM:	makeDOMDriver('#app')	
});
.startWith(false);
const view$ = model$.map(toggled =>









return {DOM: view$};
let main = ({DOM}) => {

const intent$ = DOM.select('input').events('change');

const model$ = intent$.map(ev => ev.target.checked)

.startWith(false);

const view$ = model$.map(toggled =>

div([

input({type: 'checkbox'}), 'Toggle me',

p(toggled ? 'ON' : 'off')

]));

return {DOM: view$};

};
Cycle.run(main,	{	
	DOM:	makeDOMDriver('#app')	
});
const intent$ = DOM.select('input').events('change');
const model$ = intent$.map(ev => ev.target.checked)



div([

input({type: 'checkbox'}), 'Toggle me',

p(toggled ? 'ON' : 'off')

]));

let main = ({DOM}) => {



















};
Cycle.run(main,	{	
	DOM:	makeDOMDriver('#app')	
});
.startWith(false);
const view$ = model$.map(toggled =>









return {DOM: view$};
Driver
Intent$
model$
view$
Driver
Intent$
model$
view$
checked:	true,	
target:	input
Driver
Intent$
model$
view$
checked:	true,	
target:	input
Driver
Intent$
model$
view$
checked:	true,	
target:	input
Driver
Intent$
model$
view$
Driver
Intent$
model$
view$
true
Driver
Intent$
model$
view$true
Driver
Intent$
model$
view$
Driver
Intent$
model$
view$<input type=“checkbox” …>
Driver
Intent$
model$
view$
<input type=“checkbox” …>
Driver
Intent$
model$
view$
Driver
Intent$
model$
view$
Component
• Cycle app can be used as a component in a larger Cycle app
const main = ({DOM}) => {

const intent$ = DOM.select('input').events('change');

const model$ = intent$.map(ev => ev.target.checked)

.startWith(false);

const view$ = model$.map(toggled =>

div([

input({type: 'checkbox'}), 'Toggle me',

p(toggled ? 'ON' : 'off')

]));

return {DOM: view$};

};
const main = ({DOM}) => ({DOM:...});
const Toggle = ({DOM}) => ({DOM:...});
const Toggle = ({DOM}) => ({DOM:...});
const main = ({DOM}) => {

























};
const Toggle = ({DOM}) => ({DOM:...});
const main = ({DOM}) => {

const toggleOlives = Toggle({DOM});























};
const Toggle = ({DOM}) => ({DOM:...});
const main = ({DOM}) => {

const toggleOlives = Toggle({DOM});

const toggleMushrooms = Toggle({DOM});




















};
const Toggle = ({DOM}) => ({DOM:...});
const main = ({DOM}) => {

const toggleOlives = Toggle({DOM});

const toggleMushrooms = Toggle({DOM});
const view$ = $.combineLatest(toggleOlives.DOM, toggleMushrooms.DOM,



















};
const Toggle = ({DOM}) => ({DOM:...});
const main = ({DOM}) => {

const toggleOlives = Toggle({DOM});

const toggleMushrooms = Toggle({DOM});
const view$ = $.combineLatest(toggleOlives.DOM, toggleMushrooms.DOM,
(toggleOlives, toggleMushrooms) =>

div([

toggleOlives,

toggleMushrooms

])

);






};
const Toggle = ({DOM}) => ({DOM:...});
const main = ({DOM}) => {

const toggleOlives = Toggle({DOM});

const toggleMushrooms = Toggle({DOM});
const view$ = $.combineLatest(toggleOlives.DOM, toggleMushrooms.DOM,
(toggleOlives, toggleMushrooms) =>

div([

toggleOlives,

toggleMushrooms

])

);
return {

DOM: view$

}

};
DOM.select('input')const Toggle = ({DOM}) => ({DOM:...});
const main = ({DOM}) => {

const toggleOlives = Toggle({DOM});

const toggleMushrooms = Toggle({DOM});
const view$ = $.combineLatest(toggleOlives.DOM, toggleMushrooms.DOM,
(toggleOlives, toggleMushrooms) =>

div([

toggleOlives,

toggleMushrooms

])

);
return {

DOM: view$

}

};
const Toggle = ({DOM}) => ({DOM:...});
const main = ({DOM}) => {

const toggleOlives = Toggle({DOM: DOM.select('.olives')});

const toggleMushrooms = Toggle({DOM});
const view$ = $.combineLatest(toggleOlives.DOM, toggleMushrooms.DOM,
(toggleOlives, toggleMushrooms) =>

div([

toggleOlives,

toggleMushrooms

])

);
return {

DOM: view$

}

};
const Toggle = ({DOM}) => ({DOM:...});
const main = ({DOM}) => {

const toggleOlives = Toggle({DOM: DOM.select('.olives')});

const toggleMushrooms = Toggle({DOM});
const view$ = $.combineLatest(toggleOlives.DOM, toggleMushrooms.DOM,
(toggleOlives, toggleMushrooms) =>

div([

div('.olives', [toggleOlives]),

toggleMushrooms

])

);
return {

DOM: view$

}

};
const Toggle = ({DOM}) => ({DOM:...});
const main = ({DOM}) => {

const toggleOlives = Toggle({DOM: DOM.select(‘.olives')});
const toggleMushrooms = Toggle({DOM: DOM.select('.mushrooms')});

const view$ = $.combineLatest(toggleOlives.DOM, toggleMushrooms.DOM,

(toggleOlives, toggleMushrooms) =>

div([

div('.olives', [toggleOlives]),

div('.mushrooms', [toggleMushrooms])

])

);

return {

DOM: view$

}

};
Component I/O
const props$ = $.of({

name: 'Pineapple'

})
const props$ = $.of({

name: 'Pineapple'

})
const Toggle = ({DOM, }) => {

const intent$ = DOM.select('input').events('change');

const model$ = intent$.map(ev => ev.target.checked).startWith(false);

const view$ = $.combineLatest(model$,

(toggled, ) =>

div([input({type: 'checkbox'}),

,

p(toggled ? 'ON' : 'off')]));

return {

DOM: view$, 



}

};
const props$ = $.of({

name: 'Pineapple'

})
const Toggle = ({DOM, props$}) => {

const intent$ = DOM.select('input').events('change');

const model$ = intent$.map(ev => ev.target.checked).startWith(false);

const view$ = $.combineLatest(model$, 

(toggled, ) =>

div([input({type: 'checkbox'}),

,

p(toggled ? 'ON' : 'off')]));

return {

DOM: view$, 



}

};
const props$ = $.of({

name: 'Pineapple'

})
const Toggle = ({DOM, props$}) => {

const intent$ = DOM.select('input').events('change');

const model$ = intent$.map(ev => ev.target.checked).startWith(false);

const view$ = $.combineLatest(model$, props$,

(toggled, ) =>

div([input({type: 'checkbox'}),

,

p(toggled ? 'ON' : 'off')]));

return {

DOM: view$, 



}

};
const props$ = $.of({

name: 'Pineapple'

})
const Toggle = ({DOM, props$}) => {

const intent$ = DOM.select('input').events('change');

const model$ = intent$.map(ev => ev.target.checked).startWith(false);

const view$ = $.combineLatest(model$, props$,

(toggled, props) =>

div([input({type: 'checkbox'}),

,

p(toggled ? 'ON' : 'off')]));

return {

DOM: view$, 



}

};
const props$ = $.of({

name: 'Pineapple'

})
const Toggle = ({DOM, props$}) => {

const intent$ = DOM.select('input').events('change');

const model$ = intent$.map(ev => ev.target.checked).startWith(false);

const view$ = $.combineLatest(model$, props$,

(toggled, props) =>

div([input({type: 'checkbox'}),

props.name,

p(toggled ? 'ON' : 'off')]));

return {

DOM: view$, 



}

};
const props$ = $.of({

name: 'Pineapple'

})
const Toggle = ({DOM, props$}) => {

const intent$ = DOM.select('input').events('change');

const model$ = intent$.map(ev => ev.target.checked).startWith(false);

const view$ = $.combineLatest(model$, props$,

(toggled, props) =>

div([input({type: 'checkbox'}),

props.name,

p(toggled ? 'ON' : 'off')]));

return {

DOM: view$, 

value$: model$
}

};
const props$ = $.of({

name: 'Pineapple'

})
const Toggle = ({DOM, props$}) => {

const intent$ = DOM.select('input').events('change');

const model$ = intent$.map(ev => ev.target.checked).startWith(false);

const view$ = $.combineLatest(model$, props$,

(toggled, props) =>

div([input({type: 'checkbox'}),

props.name,

p(toggled ? 'ON' : 'off')]));

return {

DOM: view$, 

value$: model$
}

};
const props$ = $.of({

name: 'Pineapple'

})
toggleOlives.value$.map(...)
Next
• More Drivers: HTTP, Storage, React Native
• HTML to hyperscript
• cyc - Generator
• awesome-cyclers: Lots of info
Questions?
Thank you!

More Related Content

PDF
Symfony CoP: Form component
PDF
How I started to love design patterns
PDF
CQRS and Event Sourcing in a Symfony application
PPTX
AngularJS $Provide Service
PDF
Decoupling the Ulabox.com monolith. From CRUD to DDD
PDF
jQuery: out with the old, in with the new
PDF
Intro programacion funcional
PDF
前端MVC 豆瓣说
Symfony CoP: Form component
How I started to love design patterns
CQRS and Event Sourcing in a Symfony application
AngularJS $Provide Service
Decoupling the Ulabox.com monolith. From CRUD to DDD
jQuery: out with the old, in with the new
Intro programacion funcional
前端MVC 豆瓣说

What's hot (20)

PDF
Silex meets SOAP & REST
PDF
Design how your objects talk through mocking
PDF
Design Patterns avec PHP 5.3, Symfony et Pimple
KEY
Advanced jQuery
PDF
Mulberry: A Mobile App Development Toolkit
PDF
AngularJs
PDF
A New Baseline for Front-End Devs
PPTX
PDF
PHPUnit でよりよくテストを書くために
PDF
How I started to love design patterns
PPT
Building Robust jQuery Plugins
PDF
How Kris Writes Symfony Apps
PPTX
AngularJS Animations
PDF
Introduction to CQRS and Event Sourcing
PPTX
Presentation1
PPTX
Template syntax in Angular 2.0
PDF
Building Large jQuery Applications
PDF
Mocking Demystified
PDF
Functionality Focused Code Organization
PDF
Be lazy, be ESI: HTTP caching and Symfony2 @ PHPDay 2011 05-13-2011
Silex meets SOAP & REST
Design how your objects talk through mocking
Design Patterns avec PHP 5.3, Symfony et Pimple
Advanced jQuery
Mulberry: A Mobile App Development Toolkit
AngularJs
A New Baseline for Front-End Devs
PHPUnit でよりよくテストを書くために
How I started to love design patterns
Building Robust jQuery Plugins
How Kris Writes Symfony Apps
AngularJS Animations
Introduction to CQRS and Event Sourcing
Presentation1
Template syntax in Angular 2.0
Building Large jQuery Applications
Mocking Demystified
Functionality Focused Code Organization
Be lazy, be ESI: HTTP caching and Symfony2 @ PHPDay 2011 05-13-2011
Ad

Similar to Cyclejs introduction (20)

PPTX
Getting Reactive with Cycle.js and xstream
PPTX
Getting Reactive with CycleJS and XStream
PDF
Cycle.js: Functional and Reactive
PDF
Reduxing UI: Borrowing the Best of Web to Make Android Better
PDF
Mobx Internals
PDF
React state management with Redux and MobX
PPTX
ReactJS.NET - Fast and Scalable Single Page Applications
PDF
React JS and why it's awesome
PDF
React for Dummies
PDF
Functional Web Development
PDF
Mattia Manzati - Real-World MobX Project Architecture - Codemotion Rome 2019
PDF
Workshop 19: ReactJS Introduction
PDF
PDF
Reactive Programming - ReactFoo 2020 - Aziz Khambati
PDF
Corso su ReactJS
PDF
Tech Talk on ReactJS
PDF
Content-Driven Apps with React
PPTX
JavaScript patterns chapter 8 of mine
PPTX
React js - The Core Concepts
PDF
Reactjs workshop (1)
Getting Reactive with Cycle.js and xstream
Getting Reactive with CycleJS and XStream
Cycle.js: Functional and Reactive
Reduxing UI: Borrowing the Best of Web to Make Android Better
Mobx Internals
React state management with Redux and MobX
ReactJS.NET - Fast and Scalable Single Page Applications
React JS and why it's awesome
React for Dummies
Functional Web Development
Mattia Manzati - Real-World MobX Project Architecture - Codemotion Rome 2019
Workshop 19: ReactJS Introduction
Reactive Programming - ReactFoo 2020 - Aziz Khambati
Corso su ReactJS
Tech Talk on ReactJS
Content-Driven Apps with React
JavaScript patterns chapter 8 of mine
React js - The Core Concepts
Reactjs workshop (1)
Ad

Recently uploaded (20)

DOCX
ASol_English-Language-Literature-Set-1-27-02-2023-converted.docx
PDF
SM_6th-Sem__Cse_Internet-of-Things.pdf IOT
PDF
PRIZ Academy - 9 Windows Thinking Where to Invest Today to Win Tomorrow.pdf
PPTX
UNIT 4 Total Quality Management .pptx
PDF
Model Code of Practice - Construction Work - 21102022 .pdf
PPTX
Geodesy 1.pptx...............................................
PDF
PPT on Performance Review to get promotions
PDF
keyrequirementskkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
PDF
Digital Logic Computer Design lecture notes
PPTX
Sustainable Sites - Green Building Construction
PPTX
OOP with Java - Java Introduction (Basics)
PPTX
bas. eng. economics group 4 presentation 1.pptx
PDF
Mohammad Mahdi Farshadian CV - Prospective PhD Student 2026
PPTX
Construction Project Organization Group 2.pptx
DOCX
573137875-Attendance-Management-System-original
PPTX
UNIT-1 - COAL BASED THERMAL POWER PLANTS
PDF
Embodied AI: Ushering in the Next Era of Intelligent Systems
PDF
R24 SURVEYING LAB MANUAL for civil enggi
PPTX
Engineering Ethics, Safety and Environment [Autosaved] (1).pptx
PPTX
M Tech Sem 1 Civil Engineering Environmental Sciences.pptx
ASol_English-Language-Literature-Set-1-27-02-2023-converted.docx
SM_6th-Sem__Cse_Internet-of-Things.pdf IOT
PRIZ Academy - 9 Windows Thinking Where to Invest Today to Win Tomorrow.pdf
UNIT 4 Total Quality Management .pptx
Model Code of Practice - Construction Work - 21102022 .pdf
Geodesy 1.pptx...............................................
PPT on Performance Review to get promotions
keyrequirementskkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
Digital Logic Computer Design lecture notes
Sustainable Sites - Green Building Construction
OOP with Java - Java Introduction (Basics)
bas. eng. economics group 4 presentation 1.pptx
Mohammad Mahdi Farshadian CV - Prospective PhD Student 2026
Construction Project Organization Group 2.pptx
573137875-Attendance-Management-System-original
UNIT-1 - COAL BASED THERMAL POWER PLANTS
Embodied AI: Ushering in the Next Era of Intelligent Systems
R24 SURVEYING LAB MANUAL for civil enggi
Engineering Ethics, Safety and Environment [Autosaved] (1).pptx
M Tech Sem 1 Civil Engineering Environmental Sciences.pptx

Cyclejs introduction

  • 2. Who am I? Arye Lukashevski Software Engineer @ Wix.com
  • 4. What’s Reactive programming? Foo depends on Bar But who owns the relationship? Foo Bar
  • 5. Proactive • Foo invokes the action • Bar has an API for interaction • ‘Find usages’ Foo Bar Proactive Passive function onClick() { Bar.increment(); } Foo
  • 6. Foo Bar Listenable Reactive Foo.addSub('click', () => { self.increment(); }); Bar Reactive • Foo emits events • Bar subscribes • Bar changes its state
  • 7. A B 1 0 =A1 + A2 2 0 0 What’s Reactive programming?
  • 8. A B 1 2 =A1 + A2 2 3 0 What’s Reactive programming?
  • 9. A B 1 2 5 2 3 0 What’s Reactive programming?
  • 23. Demo - Pizza topping selection
  • 24. Demo light - Checkbox
  • 25. let main = ({DOM}) => {
 const intent$ = DOM.select('input').events('change');
 const model$ = intent$.map(ev => ev.target.checked)
 .startWith(false);
 const view$ = model$.map(toggled =>
 div([
 input({type: 'checkbox'}), 'Toggle me',
 p(toggled ? 'ON' : 'off')
 ]));
 return {DOM: view$};
 }; Cycle.run(main, { DOM: makeDOMDriver('#app') });
  • 26. let main = ({DOM}) => {
 const intent$ = DOM.select('input').events('change');
 const model$ = intent$.map(ev => ev.target.checked)
 .startWith(false);
 const view$ = model$.map(toggled =>
 div([
 input({type: 'checkbox'}), 'Toggle me',
 p(toggled ? 'ON' : 'off')
 ]));
 return {DOM: view$};
 }; Cycle.run(main, { DOM: makeDOMDriver('#app') }); let main = ({DOM}) => {
 
 
 
 
 
 
 
 
 
 }; Cycle.run(main, { DOM: makeDOMDriver('#app') });
  • 27. let main = ({DOM}) => {
 const intent$ = DOM.select('input').events('change');
 const model$ = intent$.map(ev => ev.target.checked)
 .startWith(false);
 const view$ = model$.map(toggled =>
 div([
 input({type: 'checkbox'}), 'Toggle me',
 p(toggled ? 'ON' : 'off')
 ]));
 return {DOM: view$};
 }; Cycle.run(main, { DOM: makeDOMDriver('#app') }); 
 div([
 input({type: 'checkbox'}), 'Toggle me',
 p(toggled ? 'ON' : 'off')
 ]));
 let main = ({DOM}) => {
 
 
 
 
 
 
 
 
 
 }; Cycle.run(main, { DOM: makeDOMDriver('#app') });
  • 28. let main = ({DOM}) => {
 const intent$ = DOM.select('input').events('change');
 const model$ = intent$.map(ev => ev.target.checked)
 .startWith(false);
 const view$ = model$.map(toggled =>
 div([
 input({type: 'checkbox'}), 'Toggle me',
 p(toggled ? 'ON' : 'off')
 ]));
 return {DOM: view$};
 }; Cycle.run(main, { DOM: makeDOMDriver('#app') }); const intent$ = DOM.select('input').events('change'); 
 div([
 input({type: 'checkbox'}), 'Toggle me',
 p(toggled ? 'ON' : 'off')
 ]));
 let main = ({DOM}) => {
 
 
 
 
 
 
 
 
 
 }; Cycle.run(main, { DOM: makeDOMDriver('#app') });
  • 29. let main = ({DOM}) => {
 const intent$ = DOM.select('input').events('change');
 const model$ = intent$.map(ev => ev.target.checked)
 .startWith(false);
 const view$ = model$.map(toggled =>
 div([
 input({type: 'checkbox'}), 'Toggle me',
 p(toggled ? 'ON' : 'off')
 ]));
 return {DOM: view$};
 }; Cycle.run(main, { DOM: makeDOMDriver('#app') }); const intent$ = DOM.select('input').events('change'); const model$ = intent$.map(ev => ev.target.checked)
 
 div([
 input({type: 'checkbox'}), 'Toggle me',
 p(toggled ? 'ON' : 'off')
 ]));
 let main = ({DOM}) => {
 
 
 
 
 
 
 
 
 
 }; Cycle.run(main, { DOM: makeDOMDriver('#app') });
  • 30. let main = ({DOM}) => {
 const intent$ = DOM.select('input').events('change');
 const model$ = intent$.map(ev => ev.target.checked)
 .startWith(false);
 const view$ = model$.map(toggled =>
 div([
 input({type: 'checkbox'}), 'Toggle me',
 p(toggled ? 'ON' : 'off')
 ]));
 return {DOM: view$};
 }; Cycle.run(main, { DOM: makeDOMDriver('#app') }); const intent$ = DOM.select('input').events('change'); const model$ = intent$.map(ev => ev.target.checked)
 
 div([
 input({type: 'checkbox'}), 'Toggle me',
 p(toggled ? 'ON' : 'off')
 ]));
 let main = ({DOM}) => {
 
 
 
 
 
 
 
 
 
 }; Cycle.run(main, { DOM: makeDOMDriver('#app') }); const view$ = model$.map(toggled =>
 
 
 
 
 return {DOM: view$};
  • 31. let main = ({DOM}) => {
 const intent$ = DOM.select('input').events('change');
 const model$ = intent$.map(ev => ev.target.checked)
 .startWith(false);
 const view$ = model$.map(toggled =>
 div([
 input({type: 'checkbox'}), 'Toggle me',
 p(toggled ? 'ON' : 'off')
 ]));
 return {DOM: view$};
 }; Cycle.run(main, { DOM: makeDOMDriver('#app') }); const intent$ = DOM.select('input').events('change'); const model$ = intent$.map(ev => ev.target.checked)
 
 div([
 input({type: 'checkbox'}), 'Toggle me',
 p(toggled ? 'ON' : 'off')
 ]));
 let main = ({DOM}) => {
 
 
 
 
 
 
 
 
 
 }; Cycle.run(main, { DOM: makeDOMDriver('#app') }); .startWith(false); const view$ = model$.map(toggled =>
 
 
 
 
 return {DOM: view$};
  • 32. let main = ({DOM}) => {
 const intent$ = DOM.select('input').events('change');
 const model$ = intent$.map(ev => ev.target.checked)
 .startWith(false);
 const view$ = model$.map(toggled =>
 div([
 input({type: 'checkbox'}), 'Toggle me',
 p(toggled ? 'ON' : 'off')
 ]));
 return {DOM: view$};
 }; Cycle.run(main, { DOM: makeDOMDriver('#app') }); const intent$ = DOM.select('input').events('change'); const model$ = intent$.map(ev => ev.target.checked)
 
 div([
 input({type: 'checkbox'}), 'Toggle me',
 p(toggled ? 'ON' : 'off')
 ]));
 let main = ({DOM}) => {
 
 
 
 
 
 
 
 
 
 }; Cycle.run(main, { DOM: makeDOMDriver('#app') }); .startWith(false); const view$ = model$.map(toggled =>
 
 
 
 
 return {DOM: view$};
  • 33. let main = ({DOM}) => {
 const intent$ = DOM.select('input').events('change');
 const model$ = intent$.map(ev => ev.target.checked)
 .startWith(false);
 const view$ = model$.map(toggled =>
 div([
 input({type: 'checkbox'}), 'Toggle me',
 p(toggled ? 'ON' : 'off')
 ]));
 return {DOM: view$};
 }; Cycle.run(main, { DOM: makeDOMDriver('#app') }); const intent$ = DOM.select('input').events('change'); const model$ = intent$.map(ev => ev.target.checked)
 
 div([
 input({type: 'checkbox'}), 'Toggle me',
 p(toggled ? 'ON' : 'off')
 ]));
 let main = ({DOM}) => {
 
 
 
 
 
 
 
 
 
 }; Cycle.run(main, { DOM: makeDOMDriver('#app') }); .startWith(false); const view$ = model$.map(toggled =>
 
 
 
 
 return {DOM: view$};
  • 34. let main = ({DOM}) => {
 const intent$ = DOM.select('input').events('change');
 const model$ = intent$.map(ev => ev.target.checked)
 .startWith(false);
 const view$ = model$.map(toggled =>
 div([
 input({type: 'checkbox'}), 'Toggle me',
 p(toggled ? 'ON' : 'off')
 ]));
 return {DOM: view$};
 }; Cycle.run(main, { DOM: makeDOMDriver('#app') }); const intent$ = DOM.select('input').events('change'); const model$ = intent$.map(ev => ev.target.checked)
 
 div([
 input({type: 'checkbox'}), 'Toggle me',
 p(toggled ? 'ON' : 'off')
 ]));
 let main = ({DOM}) => {
 
 
 
 
 
 
 
 
 
 }; Cycle.run(main, { DOM: makeDOMDriver('#app') }); .startWith(false); const view$ = model$.map(toggled =>
 
 
 
 
 return {DOM: view$};
  • 47. Component • Cycle app can be used as a component in a larger Cycle app
  • 48. const main = ({DOM}) => {
 const intent$ = DOM.select('input').events('change');
 const model$ = intent$.map(ev => ev.target.checked)
 .startWith(false);
 const view$ = model$.map(toggled =>
 div([
 input({type: 'checkbox'}), 'Toggle me',
 p(toggled ? 'ON' : 'off')
 ]));
 return {DOM: view$};
 };
  • 49. const main = ({DOM}) => ({DOM:...});
  • 50. const Toggle = ({DOM}) => ({DOM:...});
  • 51. const Toggle = ({DOM}) => ({DOM:...}); const main = ({DOM}) => {
 
 
 
 
 
 
 
 
 
 
 
 
 };
  • 52. const Toggle = ({DOM}) => ({DOM:...}); const main = ({DOM}) => {
 const toggleOlives = Toggle({DOM});
 
 
 
 
 
 
 
 
 
 
 
 };
  • 53. const Toggle = ({DOM}) => ({DOM:...}); const main = ({DOM}) => {
 const toggleOlives = Toggle({DOM});
 const toggleMushrooms = Toggle({DOM}); 
 
 
 
 
 
 
 
 
 
 };
  • 54. const Toggle = ({DOM}) => ({DOM:...}); const main = ({DOM}) => {
 const toggleOlives = Toggle({DOM});
 const toggleMushrooms = Toggle({DOM}); const view$ = $.combineLatest(toggleOlives.DOM, toggleMushrooms.DOM,
 
 
 
 
 
 
 
 
 
 };
  • 55. const Toggle = ({DOM}) => ({DOM:...}); const main = ({DOM}) => {
 const toggleOlives = Toggle({DOM});
 const toggleMushrooms = Toggle({DOM}); const view$ = $.combineLatest(toggleOlives.DOM, toggleMushrooms.DOM, (toggleOlives, toggleMushrooms) =>
 div([
 toggleOlives,
 toggleMushrooms
 ])
 ); 
 
 
 };
  • 56. const Toggle = ({DOM}) => ({DOM:...}); const main = ({DOM}) => {
 const toggleOlives = Toggle({DOM});
 const toggleMushrooms = Toggle({DOM}); const view$ = $.combineLatest(toggleOlives.DOM, toggleMushrooms.DOM, (toggleOlives, toggleMushrooms) =>
 div([
 toggleOlives,
 toggleMushrooms
 ])
 ); return {
 DOM: view$
 }
 };
  • 57. DOM.select('input')const Toggle = ({DOM}) => ({DOM:...}); const main = ({DOM}) => {
 const toggleOlives = Toggle({DOM});
 const toggleMushrooms = Toggle({DOM}); const view$ = $.combineLatest(toggleOlives.DOM, toggleMushrooms.DOM, (toggleOlives, toggleMushrooms) =>
 div([
 toggleOlives,
 toggleMushrooms
 ])
 ); return {
 DOM: view$
 }
 };
  • 58. const Toggle = ({DOM}) => ({DOM:...}); const main = ({DOM}) => {
 const toggleOlives = Toggle({DOM: DOM.select('.olives')});
 const toggleMushrooms = Toggle({DOM}); const view$ = $.combineLatest(toggleOlives.DOM, toggleMushrooms.DOM, (toggleOlives, toggleMushrooms) =>
 div([
 toggleOlives,
 toggleMushrooms
 ])
 ); return {
 DOM: view$
 }
 };
  • 59. const Toggle = ({DOM}) => ({DOM:...}); const main = ({DOM}) => {
 const toggleOlives = Toggle({DOM: DOM.select('.olives')});
 const toggleMushrooms = Toggle({DOM}); const view$ = $.combineLatest(toggleOlives.DOM, toggleMushrooms.DOM, (toggleOlives, toggleMushrooms) =>
 div([
 div('.olives', [toggleOlives]),
 toggleMushrooms
 ])
 ); return {
 DOM: view$
 }
 };
  • 60. const Toggle = ({DOM}) => ({DOM:...}); const main = ({DOM}) => {
 const toggleOlives = Toggle({DOM: DOM.select(‘.olives')}); const toggleMushrooms = Toggle({DOM: DOM.select('.mushrooms')});
 const view$ = $.combineLatest(toggleOlives.DOM, toggleMushrooms.DOM,
 (toggleOlives, toggleMushrooms) =>
 div([
 div('.olives', [toggleOlives]),
 div('.mushrooms', [toggleMushrooms])
 ])
 );
 return {
 DOM: view$
 }
 };
  • 62. const props$ = $.of({
 name: 'Pineapple'
 })
  • 63. const props$ = $.of({
 name: 'Pineapple'
 })
  • 64. const Toggle = ({DOM, }) => {
 const intent$ = DOM.select('input').events('change');
 const model$ = intent$.map(ev => ev.target.checked).startWith(false);
 const view$ = $.combineLatest(model$,
 (toggled, ) =>
 div([input({type: 'checkbox'}),
 ,
 p(toggled ? 'ON' : 'off')]));
 return {
 DOM: view$, 
 
 }
 }; const props$ = $.of({
 name: 'Pineapple'
 })
  • 65. const Toggle = ({DOM, props$}) => {
 const intent$ = DOM.select('input').events('change');
 const model$ = intent$.map(ev => ev.target.checked).startWith(false);
 const view$ = $.combineLatest(model$, 
 (toggled, ) =>
 div([input({type: 'checkbox'}),
 ,
 p(toggled ? 'ON' : 'off')]));
 return {
 DOM: view$, 
 
 }
 }; const props$ = $.of({
 name: 'Pineapple'
 })
  • 66. const Toggle = ({DOM, props$}) => {
 const intent$ = DOM.select('input').events('change');
 const model$ = intent$.map(ev => ev.target.checked).startWith(false);
 const view$ = $.combineLatest(model$, props$,
 (toggled, ) =>
 div([input({type: 'checkbox'}),
 ,
 p(toggled ? 'ON' : 'off')]));
 return {
 DOM: view$, 
 
 }
 }; const props$ = $.of({
 name: 'Pineapple'
 })
  • 67. const Toggle = ({DOM, props$}) => {
 const intent$ = DOM.select('input').events('change');
 const model$ = intent$.map(ev => ev.target.checked).startWith(false);
 const view$ = $.combineLatest(model$, props$,
 (toggled, props) =>
 div([input({type: 'checkbox'}),
 ,
 p(toggled ? 'ON' : 'off')]));
 return {
 DOM: view$, 
 
 }
 }; const props$ = $.of({
 name: 'Pineapple'
 })
  • 68. const Toggle = ({DOM, props$}) => {
 const intent$ = DOM.select('input').events('change');
 const model$ = intent$.map(ev => ev.target.checked).startWith(false);
 const view$ = $.combineLatest(model$, props$,
 (toggled, props) =>
 div([input({type: 'checkbox'}),
 props.name,
 p(toggled ? 'ON' : 'off')]));
 return {
 DOM: view$, 
 
 }
 }; const props$ = $.of({
 name: 'Pineapple'
 })
  • 69. const Toggle = ({DOM, props$}) => {
 const intent$ = DOM.select('input').events('change');
 const model$ = intent$.map(ev => ev.target.checked).startWith(false);
 const view$ = $.combineLatest(model$, props$,
 (toggled, props) =>
 div([input({type: 'checkbox'}),
 props.name,
 p(toggled ? 'ON' : 'off')]));
 return {
 DOM: view$, 
 value$: model$ }
 }; const props$ = $.of({
 name: 'Pineapple'
 })
  • 70. const Toggle = ({DOM, props$}) => {
 const intent$ = DOM.select('input').events('change');
 const model$ = intent$.map(ev => ev.target.checked).startWith(false);
 const view$ = $.combineLatest(model$, props$,
 (toggled, props) =>
 div([input({type: 'checkbox'}),
 props.name,
 p(toggled ? 'ON' : 'off')]));
 return {
 DOM: view$, 
 value$: model$ }
 }; const props$ = $.of({
 name: 'Pineapple'
 }) toggleOlives.value$.map(...)
  • 71. Next • More Drivers: HTTP, Storage, React Native • HTML to hyperscript • cyc - Generator • awesome-cyclers: Lots of info