Skip to content

Commit 217147e

Browse files
authoredApr 10, 2024··
ensure FIFO ordering when a Deferred is resolved (#2499)
1 parent e983740 commit 217147e

File tree

2 files changed

+16
-12
lines changed

2 files changed

+16
-12
lines changed
 

‎.changeset/giant-papayas-lie.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"effect": patch
3+
---
4+
5+
ensure FIFO ordering when a Deferred is resolved

‎packages/effect/src/internal/core.ts

+11-12
Original file line numberDiff line numberDiff line change
@@ -2877,10 +2877,8 @@ export const deferredAwait = <A, E>(self: Deferred.Deferred<A, E>): Effect.Effec
28772877
return resume(state.effect)
28782878
}
28792879
case DeferredOpCodes.OP_STATE_PENDING: {
2880-
pipe(
2881-
self.state,
2882-
MutableRef.set(deferred.pending([resume, ...state.joiners]))
2883-
)
2880+
// we can push here as the internal state is mutable
2881+
state.joiners.push(resume)
28842882
return deferredInterruptJoiner(self, resume)
28852883
}
28862884
}
@@ -2908,8 +2906,8 @@ export const deferredCompleteWith = dual<
29082906
return false
29092907
}
29102908
case DeferredOpCodes.OP_STATE_PENDING: {
2911-
pipe(self.state, MutableRef.set(deferred.done(effect)))
2912-
for (let i = 0; i < state.joiners.length; i++) {
2909+
MutableRef.set(self.state, deferred.done(effect))
2910+
for (let i = 0, len = state.joiners.length; i < len; i++) {
29132911
state.joiners[i](effect)
29142912
}
29152913
return true
@@ -3005,8 +3003,8 @@ export const deferredSync = dual<
30053003
export const deferredUnsafeDone = <A, E>(self: Deferred.Deferred<A, E>, effect: Effect.Effect<A, E>): void => {
30063004
const state = MutableRef.get(self.state)
30073005
if (state._tag === DeferredOpCodes.OP_STATE_PENDING) {
3008-
pipe(self.state, MutableRef.set(deferred.done(effect)))
3009-
for (let i = state.joiners.length - 1; i >= 0; i--) {
3006+
MutableRef.set(self.state, deferred.done(effect))
3007+
for (let i = 0, len = state.joiners.length; i < len; i++) {
30103008
state.joiners[i](effect)
30113009
}
30123010
}
@@ -3019,10 +3017,11 @@ const deferredInterruptJoiner = <A, E>(
30193017
sync(() => {
30203018
const state = MutableRef.get(self.state)
30213019
if (state._tag === DeferredOpCodes.OP_STATE_PENDING) {
3022-
pipe(
3023-
self.state,
3024-
MutableRef.set(deferred.pending(state.joiners.filter((j) => j !== joiner)))
3025-
)
3020+
const index = state.joiners.indexOf(joiner)
3021+
if (index >= 0) {
3022+
// we can splice here as the internal state is mutable
3023+
state.joiners.splice(index, 1)
3024+
}
30263025
}
30273026
})
30283027

0 commit comments

Comments
 (0)
Please sign in to comment.