38 lines
1.5 KiB
Diff
38 lines
1.5 KiB
Diff
diff --git a/dist/Deferred.js b/dist/Deferred.js
|
|
index dd5334d6e42b0881f411fca56688e639cd49c176..ea200a80d6186f07a29d0d231ff1f038433bfec3 100644
|
|
--- a/dist/Deferred.js
|
|
+++ b/dist/Deferred.js
|
|
@@ -81,8 +81,12 @@ const _await = self => internalEffect.callback(resume => {
|
|
self.resumes ??= [];
|
|
self.resumes.push(resume);
|
|
return internalEffect.sync(() => {
|
|
+ // Completion resumes every waiter and clears the array, so a cleanup
|
|
+ // that runs after completion (an interrupt racing the resume) has
|
|
+ // nothing to unregister.
|
|
+ if (!self.resumes) return;
|
|
const index = self.resumes.indexOf(resume);
|
|
- self.resumes.splice(index, 1);
|
|
+ if (index >= 0) self.resumes.splice(index, 1);
|
|
});
|
|
});
|
|
export {
|
|
diff --git a/src/Deferred.ts b/src/Deferred.ts
|
|
index f6d37948bfbe690a7998b06c562e434e1b8ae084..da91e4dc0fd32e534fbc72f7beb0514e67e4ce74 100644
|
|
--- a/src/Deferred.ts
|
|
+++ b/src/Deferred.ts
|
|
@@ -188,8 +188,12 @@ const _await = <A, E>(self: Deferred<A, E>): Effect<A, E> =>
|
|
self.resumes ??= []
|
|
self.resumes.push(resume)
|
|
return internalEffect.sync(() => {
|
|
- const index = self.resumes!.indexOf(resume)
|
|
- self.resumes!.splice(index, 1)
|
|
+ // Completion resumes every waiter and clears the array, so a cleanup
|
|
+ // that runs after completion (an interrupt racing the resume) has
|
|
+ // nothing to unregister.
|
|
+ if (!self.resumes) return
|
|
+ const index = self.resumes.indexOf(resume)
|
|
+ if (index >= 0) self.resumes.splice(index, 1)
|
|
})
|
|
})
|
|
|