diff --git a/src/equality-map.ts b/src/equality-map.ts index 7c5a869..ed850d1 100644 --- a/src/equality-map.ts +++ b/src/equality-map.ts @@ -8,6 +8,9 @@ export interface EqualityMap extends Iterable<[K, V]> { contains(key: K): boolean; remove(key: K): V | undefined; clear(): void; + keys(): IterableIterator; + values(): IterableIterator; + entries(): IterableIterator<[K, V]>; } class NativeEqualityMap implements EqualityMap { @@ -41,6 +44,18 @@ class NativeEqualityMap implements EqualityMap { this.#map.clear(); } + keys() { + return this.#map.keys(); + } + + values() { + return this.#map.values(); + } + + entries() { + return this.#map.entries(); + } + [Symbol.iterator]() { return this.#map[Symbol.iterator](); } @@ -107,8 +122,26 @@ class CustomEqualityMap implements EqualityMap { this.#list.length = 0; } - [Symbol.iterator]() { - return this.#list[Symbol.iterator](); + *keys() { + for (const entry of this.#list) { + yield entry[0]; + } + } + + *values() { + for (const entry of this.#list) { + yield entry[1]; + } + } + + entries() { + return this[Symbol.iterator](); + } + + *[Symbol.iterator]() { + for (const entry of this.#list) { + yield [entry[0], entry[1]] as [K, V]; // no entry mutation allowed! + } } } diff --git a/src/equality-set.ts b/src/equality-set.ts index 34e30b3..4575259 100644 --- a/src/equality-set.ts +++ b/src/equality-set.ts @@ -7,6 +7,7 @@ export interface EqualitySet extends Iterable { contains(obj: T): boolean; remove(obj: T): boolean; clear(): void; + values(): IterableIterator; } class NativeEqualitySet implements EqualitySet { @@ -34,6 +35,10 @@ class NativeEqualitySet implements EqualitySet { this.#set.clear(); } + values() { + return this.#set.values(); + } + [Symbol.iterator]() { return this.#set[Symbol.iterator](); } @@ -88,6 +93,10 @@ class CustomEqualitySet implements EqualitySet { this.#list.length = 0; } + values() { + return this[Symbol.iterator](); + } + [Symbol.iterator]() { return this.#list[Symbol.iterator](); }