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