-
Notifications
You must be signed in to change notification settings - Fork 208
/
ObservableSet.ts
55 lines (47 loc) · 1.82 KB
/
ObservableSet.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
/*---------------------------------------------------------------------------------------------
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
* See LICENSE.md in the project root for license terms and full copyright notice.
*--------------------------------------------------------------------------------------------*/
/** @packageDocumentation
* @module Collections
*/
import { BeEvent } from "./BeEvent";
/** A standard [Set<T>](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set) that emits events when its contents change.
* @public
*/
export class ObservableSet<T> extends Set<T> {
/** Emitted after `item` is added to this set. */
public readonly onAdded = new BeEvent<(item: T) => void>();
/** Emitted after `item` is deleted from this set. */
public readonly onDeleted = new BeEvent<(item: T) => void>();
/** Emitted after this set's contents are cleared. */
public readonly onCleared = new BeEvent<() => void>();
/** Construct a new ObservableSet.
* @param elements Optional elements with which to populate the new set.
*/
public constructor(elements?: Iterable<T> | undefined) {
// NB: Set constructor will invoke add(). Do not override until initialized.
super(elements);
this.add = (item: T) => { // eslint-disable-line @typescript-eslint/unbound-method
const prevSize = this.size;
const ret = super.add(item);
if (this.size !== prevSize)
this.onAdded.raiseEvent(item);
return ret;
};
}
/** @internal */
public override delete(item: T): boolean {
const ret = super.delete(item);
if (ret)
this.onDeleted.raiseEvent(item);
return ret;
}
/** @internal */
public override clear(): void {
if (0 !== this.size) {
super.clear();
this.onCleared.raiseEvent();
}
}
}