diff --git a/example/basic.js b/example/basic.js index 76790ce..44ebcdb 100644 --- a/example/basic.js +++ b/example/basic.js @@ -1,16 +1,20 @@ -import { run } from '@cycle/core'; +import { run } from '@cycle/xstream-run'; import blessed from 'blessed'; import { makeTermDriver, box } from '../src'; -import { Observable as $ } from 'rx'; +import $ from 'xstream'; let screen = blessed.screen({ smartCSR: true, useBCE: true, title: 'Hello, World!' }); let BlueBox = text => box({ border: { type: 'line', fg: 'blue' } }, text); run(({ term }) => ({ - term: $.just(BlueBox('Hello, World!')), + term: $.of(BlueBox('Hello, World!')), exit: term.on('key C-c') }), { term: makeTermDriver(screen), - exit: exit$ => exit$.forEach(::process.exit) + exit: exit$ => exit$.addListener({ + next: ::process.exit, + error: ::process.exit, + complete: ::process.exit + }) }); diff --git a/example/click.js b/example/click.js index ae6bb8d..1c97067 100644 --- a/example/click.js +++ b/example/click.js @@ -1,4 +1,4 @@ -import { run } from '@cycle/core'; +import { run } from '@cycle/xstream-run'; import blessed from 'blessed'; import { makeTermDriver, button } from '../src'; import { id, key, constant } from '../src/transform'; @@ -27,5 +27,9 @@ run(({ term: { on } }) => { }; }, { term: makeTermDriver(screen), - exit: exit$ => exit$.forEach(::process.exit) + exit: exit$ => exit$.addListener({ + next: ::process.exit, + error: ::process.exit, + complete: ::process.exit + }) }); diff --git a/example/input.js b/example/input.js index c9ef371..0a0db6e 100644 --- a/example/input.js +++ b/example/input.js @@ -1,8 +1,8 @@ -import { run } from '@cycle/core'; +import { run } from '@cycle/xstream-run'; import blessed from 'blessed'; import { makeTermDriver, form, textarea, text, button } from '../src'; import { id, view, key } from '../src/transform'; -import { Observable as $ } from 'rx'; +import $ from 'xstream'; // for the unfocus bug, see `src/index.js` for more info @@ -62,13 +62,17 @@ run(({ term: { on } }) => { let submit$ = on('*press', id('Submit')); - let result$ = text$.sample(submit$).startWith(''); + let result$ = text$.map(::submit$.mapTo).flatten().startWith(''); return { - term: $.combineLatest(text$, result$, Form), + term: $.combine(Form, text$, result$), exit: on('*keypress', key('C-c')) }; }, { term: makeTermDriver(screen), - exit: exit$ => exit$.forEach(::process.exit) + exit: exit$ => exit$.addListener({ + next: ::process.exit, + error: ::process.exit, + complete: ::process.exit + }) }); diff --git a/example/writer.js b/example/writer.js index d4e81a7..130d377 100644 --- a/example/writer.js +++ b/example/writer.js @@ -1,4 +1,4 @@ -import { run } from '@cycle/core'; +import { run } from '@cycle/xstream-run'; import blessed from 'blessed'; import { makeTermDriver, box } from '../src'; import { view, key } from '../src/transform'; @@ -16,9 +16,9 @@ let HelloBox = text => box({ } }); -run(({ term: { on } }) => { +run(({ term: { on } }) => { let text$ = on('*keypress', view(1)) - .startWith('').scan((str, char) => str + char); + .fold((str, char) => str + char, ''); return { term: text$.map(HelloBox), @@ -26,5 +26,9 @@ run(({ term: { on } }) => { } }, { term: makeTermDriver(screen), - exit: exit$ => exit$.forEach(::process.exit) + exit: exit$ => exit$.addListener({ + next: ::process.exit, + error: ::process.exit, + complete: ::process.exit + }) }); diff --git a/package.json b/package.json index e80067e..1ab7626 100644 --- a/package.json +++ b/package.json @@ -12,13 +12,13 @@ "author": "synchronous", "license": "MIT", "dependencies": { - "rx": "^4.1.0" + "xstream": "^2.4.2" }, "peerDependencies": { "blessed": "^0.1.81" }, "devDependencies": { - "@cycle/core": "^6.0.3", + "@cycle/xstream-run": "^1.1.0", "gulp": "^3.9.1", "gulp-babel": "^6.1.2" }, diff --git a/src/index.js b/src/index.js index 1fc27ee..85bd939 100644 --- a/src/index.js +++ b/src/index.js @@ -1,21 +1,27 @@ import blessed from 'blessed'; -import { Observable as $ } from 'rx'; +import $ from 'xstream'; import { isObject, singleton } from './util'; +let nop = () => {}; + let makeTermDriver = screen => { let root = h('element', { keyable: true, clickable: true, children: [] }); screen.append(root); return vt$ => { - vt$.forEach(vt => { - // TODO implement diffing - // blessed only performs simple diffing - // problem visible in `example/input.js` - // don't use blessed textarea for now; - // implement custom inputs as in `example/writer.js` - root.children = []; - root.append(vt); - screen.render(); + vt$.addListener({ + next: vt => { + // TODO implement diffing + // blessed only performs simple diffing + // problem visible in `example/input.js` + // don't use blessed textarea for now; + // implement custom inputs as in `example/writer.js` + root.children = []; + root.append(vt); + screen.render(); + }, + error: nop, + complete: nop }); let makeEvent = node => { @@ -35,9 +41,10 @@ let makeTermDriver = screen => { // otherwise create a new listener let stream = listeners[eventName] ? listeners[eventName] - : listeners[eventName] = $.create(o => - void node.on(eventName, (...args) => o.onNext(args)) - ); + : listeners[eventName] = $.create({ + start: sub => node.on(eventName, (...args) => sub.next(args)), + stop: nop + }); // if event is an object, apply the transforms // otherwise just return the raw listener diff --git a/src/transform.js b/src/transform.js index c5a70e1..2cb6073 100644 --- a/src/transform.js +++ b/src/transform.js @@ -2,16 +2,16 @@ export let id = i => s => s.filter(([el]) => el.options.id === i); export let view = (...v) => - s => s.pluck(...v); + s => v.reduce((s, k) => s.map(x => x[k]), s); export let key = k => s => s.filter(([,,ek]) => ek.full === k); export let constant = c => - s => s.map(() => c); + s => s.mapTo(c); export let init = (...i) => s => s.startWith(...i); export let toggle = i => - s => s.scan(a => !a, !i); + s => s.reduce(a => !a, !i);