Repair error caused by mutation of a set mid-iteration
This commit is contained in:
parent
a64a8177eb
commit
5d2e776ecf
|
@ -75,6 +75,12 @@ export class Graph<SubjectId, ObjectId> {
|
||||||
subjectObjects.forEach((oid: ObjectId) => MapSet.del(this.edgesForward, oid, subjectId));
|
subjectObjects.forEach((oid: ObjectId) => MapSet.del(this.edgesForward, oid, subjectId));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
observersOf(objectId: ObjectId): Array<SubjectId> {
|
||||||
|
const subjects = this.edgesForward.get(objectId);
|
||||||
|
if (subjects === void 0) return [];
|
||||||
|
return Array.from(subjects);
|
||||||
|
}
|
||||||
|
|
||||||
repairDamage(repairNode: (subjectId: SubjectId) => void) {
|
repairDamage(repairNode: (subjectId: SubjectId) => void) {
|
||||||
let repairedThisRound = new FlexSet(this.objectIdCanonicalizer);
|
let repairedThisRound = new FlexSet(this.objectIdCanonicalizer);
|
||||||
while (true) {
|
while (true) {
|
||||||
|
@ -92,8 +98,7 @@ export class Graph<SubjectId, ObjectId> {
|
||||||
if (workSet.size === 0) break;
|
if (workSet.size === 0) break;
|
||||||
|
|
||||||
workSet.forEach(objectId => {
|
workSet.forEach(objectId => {
|
||||||
const subjects = this.edgesForward.get(objectId) ?? [] as Array<SubjectId>;
|
this.observersOf(objectId).forEach((subjectId: SubjectId) => {
|
||||||
subjects.forEach((subjectId: SubjectId) => {
|
|
||||||
this.forgetSubject(subjectId);
|
this.forgetSubject(subjectId);
|
||||||
this.withSubject(subjectId, () => repairNode(subjectId));
|
this.withSubject(subjectId, () => repairNode(subjectId));
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in New Issue