Simplify SignalGrouping
This commit is contained in:
@@ -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;
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user