Skip to content

Instantly share code, notes, and snippets.

@frontsideair
Created July 7, 2016 19:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save frontsideair/c1c5bf315394598b9aefabe9f16993cf to your computer and use it in GitHub Desktop.
Save frontsideair/c1c5bf315394598b9aefabe9f16993cf to your computer and use it in GitHub Desktop.
Cycle.js with reducer-like events
const Cycle = require('@cycle/core');
const {makeDOMDriver, div, button} = require('@cycle/dom');
const {Observable} = require('rx');
function intent({ DOM }) {
const incr$ = DOM
.select('.incr')
.events('click')
.map(() => prev => prev + 1);
const decr$ = DOM
.select('.decr')
.events('click')
.map(() => prev => prev - 1);
const reset$ = DOM
.select('.reset')
.events('click')
.map(() => () => 0);
return { incr$, decr$, reset$ };
}
function model({ incr$, decr$, reset$ }) {
const count$ = incr$
.merge(decr$)
.merge(reset$)
.startWith(0)
.scan((prev, change) => change(prev));
return { count$ };
}
function view({ count$ }) {
const DOM = count$.map(count =>
div('.counter', [
'Count: ' + count,
button('.incr', '+'),
button('.decr', '-'),
button('.reset', 'Reset')
])
);
return { DOM };
}
const main = sources => view(model(intent(sources)))
const sources = {
DOM: makeDOMDriver('#app')
}
Cycle.run(main, sources);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment