Skip to content

Commit eacfdba

Browse files
committed
Make driver stream library agnostic
1 parent 9c885ca commit eacfdba

File tree

4 files changed

+38
-18
lines changed

4 files changed

+38
-18
lines changed

README.md

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33

44
This driver for Cycle.js helps you to manage key events on the document easily.
55

6+
Cycle Keys is stream library agnostic -- you can use it with xstream, rxjs, or any other stream library you like. If you have any issues with a particular library, let me know!
7+
68
## Installation
79

810
You can install Cycle Keys with npm
@@ -46,6 +48,7 @@ function main({Keys}) { /* Your amazing main function */ }
4648
`Keys.up()` - returns a stream of keyup events.
4749

4850
`Keys.press()` - returns a stream of keypress events.
51+
4952
`Keys.isDown(key)` - returns a stream of booleans, `true` if the given key is currently _down_, `false` if the given key is currently _up_. Must be called with a key argument.
5053

5154
All methods take a key argument. Calling a method with a key argument will return a stream of key events filtered to that particular key.
@@ -73,23 +76,21 @@ In this example, a user can hit 'enter' to change the background colour. The hea
7376
```js
7477
import {run} from '@cycle/core';
7578
import {makeDOMDriver, p, h1, div} from '@cycle/dom';
76-
import {Observable} from 'rx';
7779
import {makeKeysDriver} from 'cycle-keys';
78-
import combineLatestObj from 'rx-combine-latest-obj';
80+
import xs from 'xstream';
7981

8082
function main({DOM, Keys}){
8183
const colours = ["#F6F792", "#333745", "#77C4D3", "#DAEDE2", "#EA2E49"];
8284

83-
const isDown$ = Keys.isDown('space')
84-
.startWith(false);
85+
const isDown$ = Keys.isDown('space');
8586

8687
const colour$ = Keys.press('enter')
8788
.map(ev => +1)
88-
.scan((acc, int) => acc + int, 0)
89-
.startWith(0)
89+
.fold((acc, int) => acc + int, 0)
9090
.map(int => colours[int % colours.length]);
9191

92-
const state$ = combineLatestObj({isDown$, colour$});
92+
const state$ = xs.combine(isDown$, colour$)
93+
.map(([isDown, colour]) => ({isDown, colour}));
9394

9495
return {
9596
DOM: state$.map(state => (
@@ -106,7 +107,7 @@ function main({DOM, Keys}){
106107
)
107108
)
108109
)
109-
}
110+
};
110111
}
111112

112113
const drivers = {
@@ -115,4 +116,4 @@ const drivers = {
115116
};
116117

117118
run(app, drivers);
118-
```
119+
```

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,13 @@
3333
},
3434
"homepage": "https://github.com/raquelxmoss/cycle-keys#readme",
3535
"dependencies": {
36+
"@cycle/xstream-adapter": "^3.0.3",
3637
"keycode": "^2.1.1",
3738
"xstream": "^5.3.2"
3839
},
3940
"devDependencies": {
4041
"@cycle/dom": "^12.0.3",
42+
"@cycle/rx-adapter": "^3.0.0",
4143
"@cycle/xstream-run": "^3.0.4",
4244
"babel-cli": "^6.7.7",
4345
"babel-core": "^6.7.7",

src/keys-driver.js

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
import xs from 'xstream';
22
import fromEvent from 'xstream/extra/fromEvent';
3+
import xstreamAdapter from '@cycle/xstream-adapter';
34
import keycode from 'keycode';
45

56
export function makeKeysDriver () {
6-
return function keysDriver() {
7+
return function keysDriver(sinks, streamAdapter) {
78
const methods = {};
89
const events = ['keypress', 'keyup', 'keydown'];
910

@@ -19,7 +20,7 @@ export function makeKeysDriver () {
1920
event$ = event$.filter(event => event.keyCode === code);
2021
}
2122

22-
return event$;
23+
return streamAdapter.adapt(event$, xstreamAdapter.streamSubscribe);
2324
}
2425
});
2526

@@ -34,10 +35,12 @@ export function makeKeysDriver () {
3435
.filter(ev => ev.keyCode === code)
3536
.map(ev => false);
3637

37-
return xs.merge(
38+
const isDown$ = xs.merge(
3839
down$,
3940
up$
4041
).startWith(false);
42+
43+
return streamAdapter.adapt(isDown$, xstreamAdapter.streamSubscribe);
4144
}
4245

4346
return methods;

test/keys-test.js

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import {makeKeysDriver} from '../src/keys-driver';
2+
import xstreamAdapter from '@cycle/xstream-adapter';
3+
import rxAdapter from '@cycle/rx-adapter';
24

35
import assert from 'assert';
46
import simulant from 'simulant';
@@ -11,9 +13,21 @@ const subscribe = listener => stream =>
1113
});
1214

1315
describe("makeKeysDriver", () => {
16+
describe("keysDriver", () => {
17+
it("is stream library agnostic", () => {
18+
const sources = makeKeysDriver()({}, rxAdapter);
19+
20+
sources.up('enter').take(1).subscribe(() => done());
21+
22+
const event = simulant('keyup', {keyCode: 13});
23+
24+
simulant.fire(document.body, event);
25+
});
26+
}),
27+
1428
describe("press", () => {
1529
it("returns a stream of all keypresses", () => {
16-
const sources = makeKeysDriver()();
30+
const sources = makeKeysDriver()({}, xstreamAdapter);
1731

1832
const keyCodes = [74, 75, 76];
1933
let keypressEvents;
@@ -38,7 +52,7 @@ describe("makeKeysDriver", () => {
3852
});
3953

4054
it("returns a stream of keypress events for the given key", (done) => {
41-
const sources = makeKeysDriver()();
55+
const sources = makeKeysDriver()({}, xstreamAdapter);
4256

4357
sources.press('enter').take(1)
4458
.compose(subscribe(() => done()));
@@ -49,7 +63,7 @@ describe("makeKeysDriver", () => {
4963
});
5064

5165
it("returns a stream of keyup events for the given key", (done) => {
52-
const sources = makeKeysDriver()();
66+
const sources = makeKeysDriver()({}, xstreamAdapter);
5367

5468
sources.up('enter').take(1)
5569
.compose(subscribe(() => done()));
@@ -60,7 +74,7 @@ describe("makeKeysDriver", () => {
6074
});
6175

6276
it("returns a stream of keydown events for the given key", (done) => {
63-
const sources = makeKeysDriver()();
77+
const sources = makeKeysDriver()({}, xstreamAdapter);
6478

6579
sources.down('enter').take(1)
6680
.compose(subscribe(() => done()));
@@ -71,7 +85,7 @@ describe("makeKeysDriver", () => {
7185
});
7286

7387
it("emits events only for the given key", () => {
74-
const sources = makeKeysDriver()();
88+
const sources = makeKeysDriver()({}, xstreamAdapter);
7589
let enterPressed = false;
7690

7791
sources.press('enter')
@@ -91,7 +105,7 @@ describe("makeKeysDriver", () => {
91105
});
92106

93107
it("Gives a stream of true/false for key up/down events on a given key", () => {
94-
const sources = makeKeysDriver()();
108+
const sources = makeKeysDriver()({}, xstreamAdapter);
95109
let keyIsDown = true;
96110

97111
sources.isDown('enter')

0 commit comments

Comments
 (0)