diff --git a/src/connector.js b/src/connector.js index 04c0528..2233793 100644 --- a/src/connector.js +++ b/src/connector.js @@ -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 diff --git a/src/connector.test.js b/src/connector.test.js index 87f12a1..0ba9f27 100644 --- a/src/connector.test.js +++ b/src/connector.test.js @@ -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"); diff --git a/src/index.js b/src/index.js index a421930..d969066 100644 --- a/src/index.js +++ b/src/index.js @@ -1,2 +1,7 @@ +export { + connect, + connector, + rawConnector, + withInputSignals, +} from "./connector"; export { signal, signalFn } from "./signal"; -export { connect, connector, rawConnector } from "./connector";