Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 30 additions & 12 deletions src/lualib/Set.ts
Original file line number Diff line number Diff line change
Expand Up @@ -102,46 +102,64 @@ export class Set<T extends AnyNotNil> {
}

public entries(): IterableIterator<[T, T]> {
const getFirstKey = () => this.firstKey;
const nextKey = this.nextKey;
let key: T = this.firstKey!;
let key: T | undefined;
let started = false;
return {
[Symbol.iterator](): IterableIterator<[T, T]> {
return this;
},
next(): IteratorResult<[T, T]> {
const result = { done: !key, value: [key, key] as [T, T] };
key = nextKey.get(key);
return result;
if (!started) {
started = true;
key = getFirstKey();
} else {
key = nextKey.get(key!);
}
return { done: !key, value: [key!, key!] as [T, T] };
},
};
}

public keys(): IterableIterator<T> {
const getFirstKey = () => this.firstKey;
const nextKey = this.nextKey;
let key: T = this.firstKey!;
let key: T | undefined;
let started = false;
return {
[Symbol.iterator](): IterableIterator<T> {
return this;
},
next(): IteratorResult<T> {
const result = { done: !key, value: key };
key = nextKey.get(key);
return result;
if (!started) {
started = true;
key = getFirstKey();
} else {
key = nextKey.get(key!);
}
return { done: !key, value: key! };
},
};
}

public values(): IterableIterator<T> {
const getFirstKey = () => this.firstKey;
const nextKey = this.nextKey;
let key: T = this.firstKey!;
let key: T | undefined;
let started = false;
return {
[Symbol.iterator](): IterableIterator<T> {
return this;
},
next(): IteratorResult<T> {
const result = { done: !key, value: key };
key = nextKey.get(key);
return result;
if (!started) {
started = true;
key = getFirstKey();
} else {
key = nextKey.get(key!);
}
return { done: !key, value: key! };
},
};
}
Expand Down
13 changes: 13 additions & 0 deletions test/unit/builtins/set.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -195,6 +195,19 @@ describe.each(iterationMethods)("set.%s() preserves insertion order", iterationM
});
});

test("set iterator persists after delete", () => {
util.testFunction`
const set1 = new Set<string | number>();
set1.add(42);
set1.add("forty two");

const iterator1 = set1.values();
set1.delete(42);

return iterator1.next().value;
`.expectToMatchJsResult();
});

test("instanceof Set without creating set", () => {
util.testFunction`
const myset = 3 as any;
Expand Down