<A>(f: (a: A) => Option.Option<A>): (self: Ref<A>) => Effect.Effect<void>
<A>(self: Ref<A>, f: (a: A) => Option.Option<A>): Effect.Effect<void>Updates the value of the Ref atomically using the given partial function.
When to use
Use to apply a conditional Ref update without returning a value.
Details
If the partial function returns Option.some, the Ref is updated with the
new value. If it returns Option.none, the Ref is left unchanged.
Example (Conditionally updating a value)
import { Effect, Option, Ref } from "effect"
const program = Effect.gen(function*() {
const counter = yield* Ref.make(5)
// Only update if value is even
yield* Ref.updateSome(
counter,
(n) => n % 2 === 0 ? Option.some(n * 2) : Option.none()
)
let current = yield* Ref.get(counter)
console.log(current) // 5 (unchanged because 5 is odd)
// Set to even number and try again
yield* Ref.set(counter, 6)
yield* Ref.updateSome(
counter,
(n) => n % 2 === 0 ? Option.some(n * 2) : Option.none()
)
current = yield* Ref.get(counter)
console.log(current) // 12 (updated because 6 is even)
})export const const updateSome: (<A>(
f: (a: A) => Option.Option<A>
) => (self: Ref<A>) => Effect.Effect<void>) &
(<A>(
self: Ref<A>,
f: (a: A) => Option.Option<A>
) => Effect.Effect<void>)
Updates the value of the Ref atomically using the given partial function.
When to use
Use to apply a conditional Ref update without returning a value.
Details
If the partial function returns Option.some, the Ref is updated with the
new value. If it returns Option.none, the Ref is left unchanged.
Example (Conditionally updating a value)
import { Effect, Option, Ref } from "effect"
const program = Effect.gen(function*() {
const counter = yield* Ref.make(5)
// Only update if value is even
yield* Ref.updateSome(
counter,
(n) => n % 2 === 0 ? Option.some(n * 2) : Option.none()
)
let current = yield* Ref.get(counter)
console.log(current) // 5 (unchanged because 5 is odd)
// Set to even number and try again
yield* Ref.set(counter, 6)
yield* Ref.updateSome(
counter,
(n) => n % 2 === 0 ? Option.some(n * 2) : Option.none()
)
current = yield* Ref.get(counter)
console.log(current) // 12 (updated because 6 is even)
})
updateSome = import dualdual<
<function (type parameter) A in <A>(f: (a: A) => Option.Option<A>): (self: Ref<A>) => Effect.Effect<void>A>(f: (a: A) => Option.Option<A>f: (a: Aa: function (type parameter) A in <A>(f: (a: A) => Option.Option<A>): (self: Ref<A>) => Effect.Effect<void>A) => import OptionOption.type Option.Option = /*unresolved*/ anyOption<function (type parameter) A in <A>(f: (a: A) => Option.Option<A>): (self: Ref<A>) => Effect.Effect<void>A>) => (self: Ref<A>(parameter) self: {
ref: MutableRef.MutableRef<A>;
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
}
self: interface Ref<in out A>A mutable reference that provides atomic read, write, and update operations.
When to use
Use to keep shared mutable state that is read and updated inside Effect
programs.
Details
A Ref is a thread-safe mutable reference type for shared state. It supports
simple read and write operations as well as atomic transformations.
Example (Reading and updating a ref)
import { Effect, Ref } from "effect"
const program = Effect.gen(function*() {
// Create a ref with initial value
const counter = yield* Ref.make(0)
// Read the current value
const value = yield* Ref.get(counter)
console.log(value) // 0
// Update the value atomically
yield* Ref.update(counter, (n) => n + 1)
// Read the updated value
const newValue = yield* Ref.get(counter)
console.log(newValue) // 1
})
The Ref namespace containing type definitions and utilities.
When to use
Use when referring to type members nested under the Ref namespace.
Ref<function (type parameter) A in <A>(f: (a: A) => Option.Option<A>): (self: Ref<A>) => Effect.Effect<void>A>) => import EffectEffect.type Effect.Effect = /*unresolved*/ anyEffect<void>,
<function (type parameter) A in <A>(self: Ref<A>, f: (a: A) => Option.Option<A>): Effect.Effect<void>A>(self: Ref<A>(parameter) self: {
ref: MutableRef.MutableRef<A>;
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
}
self: interface Ref<in out A>A mutable reference that provides atomic read, write, and update operations.
When to use
Use to keep shared mutable state that is read and updated inside Effect
programs.
Details
A Ref is a thread-safe mutable reference type for shared state. It supports
simple read and write operations as well as atomic transformations.
Example (Reading and updating a ref)
import { Effect, Ref } from "effect"
const program = Effect.gen(function*() {
// Create a ref with initial value
const counter = yield* Ref.make(0)
// Read the current value
const value = yield* Ref.get(counter)
console.log(value) // 0
// Update the value atomically
yield* Ref.update(counter, (n) => n + 1)
// Read the updated value
const newValue = yield* Ref.get(counter)
console.log(newValue) // 1
})
The Ref namespace containing type definitions and utilities.
When to use
Use when referring to type members nested under the Ref namespace.
Ref<function (type parameter) A in <A>(self: Ref<A>, f: (a: A) => Option.Option<A>): Effect.Effect<void>A>, f: (a: A) => Option.Option<A>f: (a: Aa: function (type parameter) A in <A>(self: Ref<A>, f: (a: A) => Option.Option<A>): Effect.Effect<void>A) => import OptionOption.type Option.Option = /*unresolved*/ anyOption<function (type parameter) A in <A>(self: Ref<A>, f: (a: A) => Option.Option<A>): Effect.Effect<void>A>) => import EffectEffect.type Effect.Effect = /*unresolved*/ anyEffect<void>
>(2, <function (type parameter) A in <A>(self: Ref<A>, f: (a: A) => Option.Option<A>): anyA>(self: Ref<A>(parameter) self: {
ref: MutableRef.MutableRef<A>;
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
}
self: interface Ref<in out A>A mutable reference that provides atomic read, write, and update operations.
When to use
Use to keep shared mutable state that is read and updated inside Effect
programs.
Details
A Ref is a thread-safe mutable reference type for shared state. It supports
simple read and write operations as well as atomic transformations.
Example (Reading and updating a ref)
import { Effect, Ref } from "effect"
const program = Effect.gen(function*() {
// Create a ref with initial value
const counter = yield* Ref.make(0)
// Read the current value
const value = yield* Ref.get(counter)
console.log(value) // 0
// Update the value atomically
yield* Ref.update(counter, (n) => n + 1)
// Read the updated value
const newValue = yield* Ref.get(counter)
console.log(newValue) // 1
})
The Ref namespace containing type definitions and utilities.
When to use
Use when referring to type members nested under the Ref namespace.
Ref<function (type parameter) A in <A>(self: Ref<A>, f: (a: A) => Option.Option<A>): anyA>, f: (a: A) => Option.Option<A>f: (a: Aa: function (type parameter) A in <A>(self: Ref<A>, f: (a: A) => Option.Option<A>): anyA) => import OptionOption.type Option.Option = /*unresolved*/ anyOption<function (type parameter) A in <A>(self: Ref<A>, f: (a: A) => Option.Option<A>): anyA>) =>
import EffectEffect.sync(() => {
const const option: Option.Option<A>option = f: (a: A) => Option.Option<A>f(self: Ref<A>(parameter) self: {
ref: MutableRef.MutableRef<A>;
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
}
self.Ref<in out A>.ref: MutableRef.MutableRef<A>(property) Ref<in out A>.ref: {
current: T;
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
toString: () => string;
toJSON: () => unknown;
}
ref.current)
if (const option: Option.Option<A>option._tag === "Some") {
self: Ref<A>(parameter) self: {
ref: MutableRef.MutableRef<A>;
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
}
self.Ref<in out A>.ref: MutableRef.MutableRef<A>(property) Ref<in out A>.ref: {
current: T;
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
toString: () => string;
toJSON: () => unknown;
}
ref.current = const option: Option.Some<A>const option: {
_tag: "Some";
_op: "Some";
value: A;
valueOrUndefined: A;
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
toString: () => string;
toJSON: () => unknown;
}
option.value
}
}))