Effect CommunityEC
Effect Communityβ€’3y agoβ€’
7 replies
Patrick Roza

Unexpected behavior of `fiberRefGetAndUpdate` returning old value instead of updated value

why would FiberRef.getAndUpdate return the old value instead of the updated value?
TLDR: one should use FiberRef.updateAndGet πŸ˜„
internally uses
export const fiberRefModify = dual<
  <A, B>(f: (a: A) => readonly [B, A]) => (self: FiberRef.FiberRef<A>) => Effect.Effect<never, never, B>,
  <A, B>(self: FiberRef.FiberRef<A>, f: (a: A) => readonly [B, A]) => Effect.Effect<never, never, B>
>(2, <A, B>(
  self: FiberRef.FiberRef<A>,
  f: (a: A) => readonly [B, A]
): Effect.Effect<never, never, B> =>
  withFiberRuntime<never, never, B>((state) => {
    const [b, a] = f(state.getFiberRef(self) as A)
    state.setFiberRef(self, a) // set a
    return succeed(b) // but return b
  }))
Was this page helpful?