// ets_tracing: off import type * as Tp from "../Collections/Immutable/Tuple/index.js" import { succeedWith } from "../Effect/core.js" import type { UIO } from "../Effect/effect.js" import type * as O from "../Option/index.js" import type { Atomic } from "./XRef.js" export function getAndSet(self: Atomic, a: A): UIO { return succeedWith(() => { const v = self.value.get self.value.set(a) return v }) } export function getAndUpdate(self: Atomic, f: (a: A) => A): UIO { return succeedWith(() => { const v = self.value.get self.value.set(f(v)) return v }) } export function getAndUpdateSome(self: Atomic, f: (a: A) => O.Option): UIO { return succeedWith(() => { const v = self.value.get const o = f(v) if (o._tag === "Some") { self.value.set(o.value) } return v }) } export function modify(self: Atomic, f: (a: A) => Tp.Tuple<[B, A]>): UIO { return succeedWith(() => { const v = self.value.get const o = f(v) self.value.set(o.get(1)) return o.get(0) }) } export function modifySome( self: Atomic, def: B, f: (a: A) => O.Option> ) { return succeedWith(() => { const v = self.value.get const o = f(v) if (o._tag === "Some") { self.value.set(o.value.get(1)) return o.value.get(0) } return def }) } export function update(self: Atomic, f: (a: A) => A): UIO { return succeedWith(() => { self.value.set(f(self.value.get)) }) } export function updateAndGet(self: Atomic, f: (a: A) => A): UIO { return succeedWith(() => { self.value.set(f(self.value.get)) return self.value.get }) } export function updateSome(self: Atomic, f: (a: A) => O.Option): UIO { return succeedWith(() => { const o = f(self.value.get) if (o._tag === "Some") { self.value.set(o.value) } }) } export function updateSomeAndGet(self: Atomic, f: (a: A) => O.Option): UIO { return succeedWith(() => { const o = f(self.value.get) if (o._tag === "Some") { self.value.set(o.value) } return self.value.get }) } export function unsafeUpdate(self: Atomic, f: (a: A) => A) { self.value.set(f(self.value.get)) }