Simplify SignalGrouping

This commit is contained in:
Peter Fajdiga
2025-11-30 11:10:38 +01:00
parent ce4884c48a
commit 679d1d488c

View File

@@ -1,43 +1,39 @@
namespace SignalGrouping { namespace SignalGrouping {
export class Group<S extends QSignal<any>[]> { export class Group {
private signalManager: SignalManager; private argsBySignal: Map<QSignal<[any]>, [[any]]> = new Map();
private argsBySignal: Map<S[number], GroupUnion<S>> = new Map();
private delayer = new Delayer(50, () => this.fire()); private delayer = new Delayer(50, () => this.fire());
constructor( constructor(
private handlers: Handler<S>[], // in order of decreasing priority private handlers: Handler<any>[], // in order of decreasing priority
) { ) {}
this.signalManager = new SignalManager();
const signals = collectSignals(handlers); public connect(manager: SignalManager) {
const signals = collectSignals(this.handlers);
for (const signal of signals) { for (const signal of signals) {
this.signalManager.connect(signal, (...args: any) => { manager.connect(signal, (...args: any) => {
this.argsBySignal.set(signal, args); this.argsBySignal.set(signal, args);
this.delayer.run(); this.delayer.run();
}); });
} }
} }
public fire() { private fire() {
for (const handler of this.handlers) { for (const handler of this.handlers) {
const args = this.getGroupArgs(handler.signals); const args = this.getGroupArgs(handler.signals);
if (args !== null) { if (args !== null) {
handler.f(...args); handler.f(args);
break; break;
} }
} }
this.argsBySignal.clear(); this.argsBySignal.clear();
} }
public destroy() { private getGroupArgs(signals: QSignal<[any]>[]) {
this.signalManager.destroy();
}
private getGroupArgs(signals: [...S]) {
const groupArgs = signals.map(signal => this.argsBySignal.get(signal)); const groupArgs = signals.map(signal => this.argsBySignal.get(signal));
if (groupArgs.some(args => args === undefined)) { if (groupArgs.some(args => args === undefined)) {
return null; return null;
} }
return groupArgs as [...GroupArgs<S>]; return groupArgs;
} }
} }
@@ -53,14 +49,14 @@ namespace SignalGrouping {
return signals; return signals;
} }
interface Handler<S extends QSignal<any>[]> { export class Handler<S extends QSignal<any>[]> {
signals: [...S]; constructor(
f: (...args: [...GroupArgs<S>]) => void; public signals: [...S],
public f: (...args: [...GroupArgs<S>]) => void,
) {}
} }
type GroupArgs<S extends QSignal<any>[]> = { type GroupArgs<S extends QSignal<any>[]> = {
[K in keyof S]: S[K] extends QSignal<infer A> ? A : never; [K in keyof S]: S[K] extends QSignal<infer A> ? A : never;
}; };
type GroupUnion<S extends QSignal<any>[]> = S[number] extends QSignal<infer A> ? A : never;
} }