@snap/camera-kit
Version:
Camera Kit Web
29 lines • 1.27 kB
JavaScript
import { TypedCustomEvent } from "./TypedCustomEvent";
import { TypedEventTarget } from "./TypedEventTarget";
export const scan = (seedState) => (source, eventTypes, accumulator) => {
let state = seedState;
const sink = new TypedEventTarget();
const listener = (event) => {
state = accumulator(state, event);
sink.dispatchEvent(new TypedCustomEvent("state", state));
};
let hasListener = false;
sink.addEventListener = new Proxy(sink.addEventListener, {
apply: (target, thisArg, args) => {
if (hasListener)
throw new Error("Cannot add another event listener. The TypedEventTarget returned by scan only " +
"supports a single listener, and one has already been added.");
hasListener = true;
eventTypes.forEach((eventType) => source.addEventListener(eventType, listener));
target.apply(thisArg, args);
},
});
sink.removeEventListener = new Proxy(sink.removeEventListener, {
apply: (target, thisArg, args) => {
eventTypes.forEach((eventType) => source.removeEventListener(eventType, listener));
target.apply(thisArg, args);
},
});
return sink;
};
//# sourceMappingURL=scan.js.map