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
}))
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
}))