1650
1651
constructor() {
1652
>
this.emitter = new Emitter<T>({
event.ts
1653
>
onWillAddFirstListener: () => this.onFirstListenerAdd(),
1654
>
onDidRemoveLastListener: () => this.onLastListenerRemove()
1655
>
});
1656
>
}
1657
1658
get event(): Event<T> {
1659
>
return this.emitter.event;
event.ts
1660
>
}
1661
1662
add(event: Event<T>): IDisposable {
1663
>
const e = { event: event, listener: null };
event.ts
1664
>
this.events.push(e);
1665
>
1666
>
if (this.hasListeners) {
1667
this.hook(e);
1668
}
1670
>
const dispose = () => {
1671
>
if (this.hasListeners) {
1672
this.unhook(e);
1673
}
1675
>
const idx = this.events.indexOf(e);
1676
>
this.events.splice(idx, 1);
1677
>
};
1678
>
1679
>
return toDisposable(createSingleCallFunction(dispose));
1680
>
}
1681
1682
private onFirstListenerAdd(): void {
1683
>
this.hasListeners = true;
event.ts
1684
>
this.events.forEach(e => this.hook(e));
1685
>
}
1686
1687
private onLastListenerRemove(): void {
1688
>
this.hasListeners = false;
event.ts
1689
>
this.events.forEach(e => this.unhook(e));
1690
>
}
1691
1692
private hook(e: { event: Event<T>; listener: IDisposable | null }): void {
1693
>
e.listener = e.event(r => this.emitter.fire(r));
event.ts
1694
>
}
1695
1696
private unhook(e: { event: Event<T>; listener: IDisposable | null }): void {
1698
>
e.listener = null;
1699
>
}
1700
1701
dispose(): void {