Skip to content

Commit

Permalink
Add helper to inject signal values into a function
Browse files Browse the repository at this point in the history
  • Loading branch information
stwa committed May 12, 2019
1 parent 1bd0cab commit 9a3a48e
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 2 deletions.
24 changes: 24 additions & 0 deletions src/connector.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,30 @@ import * as registry from "./internal/registry";

const kind = Symbol.for("connector");

/**
* Returns a function that calls `fn` with a list of values extracted from the
* provided signals returned by `inputsFn`. Arguments passed to the returned
* function are transparently passed to `fn`. `inputsFn` is a function that
* returns one or many input signals.
*
* @example
*
* let fn = withInputSignals(
* () => signal("foo"),
* (s, arg) => s + arg,
* );
* fn("bar"); // "foobar"
*/
export function withInputSignals(inputsFn, fn) {
return (...args) => {
let inputs = inputsFn(...args);
let values = Array.isArray(inputs)
? inputs.map(s => s.value())
: inputs.value();
return fn(values, ...args);
};
}

/**
* Connects to the connector identified by `connectorId`. As a result, a signal
* is returned which can then be used to access a stream of values reactively
Expand Down
25 changes: 24 additions & 1 deletion src/connector.test.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,33 @@
import { clearConnectors, connect, connector, rawConnector } from "./connector";
import {
clearConnectors,
connect,
connector,
rawConnector,
withInputSignals,
} from "./connector";
import { signal, signalFn } from "./signal";

global.console.warn = jest.fn();

beforeEach(() => clearConnectors());

describe("withInputSignals", () => {
it("injects extracted value from single input signal", () => {
let fn = withInputSignals(
() => signal("foo"),
(s, ...args) => s + args.join(""),
);
expect(fn("bar")).toBe("foobar");
});
it("injects extracted values from multiple input signals", () => {
let fn = withInputSignals(
() => [signal("foo"), signal("bar")],
([s1, s2], ...args) => s1 + s2 + args.join(""),
);
expect(fn("baz")).toBe("foobarbaz");
});
});

describe("connect", () => {
it("returns connector signal", () => {
connector("foo", () => "bar");
Expand Down
7 changes: 6 additions & 1 deletion src/index.js
Original file line number Diff line number Diff line change
@@ -1,2 +1,7 @@
export {
connect,
connector,
rawConnector,
withInputSignals,
} from "./connector";
export { signal, signalFn } from "./signal";
export { connect, connector, rawConnector } from "./connector";

0 comments on commit 9a3a48e

Please sign in to comment.