<A>(self: TxChunk<A>): Effect.Effect<boolean>Checks whether the TxChunk is empty.
Example (Checking for an empty chunk)
import { Effect, TxChunk } from "effect"
const program = Effect.gen(function*() {
const emptyChunk = yield* TxChunk.empty<number>()
const nonEmptyChunk = yield* TxChunk.fromIterable([1, 2, 3])
// Check if chunks are empty - automatically transactional
const isEmpty1 = yield* TxChunk.isEmpty(emptyChunk)
const isEmpty2 = yield* TxChunk.isEmpty(nonEmptyChunk)
console.log(isEmpty1) // true
console.log(isEmpty2) // false
})export const const isEmpty: <A>(
self: TxChunk<A>
) => Effect.Effect<boolean>
Checks whether the TxChunk is empty.
Example (Checking for an empty chunk)
import { Effect, TxChunk } from "effect"
const program = Effect.gen(function*() {
const emptyChunk = yield* TxChunk.empty<number>()
const nonEmptyChunk = yield* TxChunk.fromIterable([1, 2, 3])
// Check if chunks are empty - automatically transactional
const isEmpty1 = yield* TxChunk.isEmpty(emptyChunk)
const isEmpty2 = yield* TxChunk.isEmpty(nonEmptyChunk)
console.log(isEmpty1) // true
console.log(isEmpty2) // false
})
isEmpty = <function (type parameter) A in <A>(self: TxChunk<A>): Effect.Effect<boolean>A>(self: TxChunk<A>(parameter) self: {
ref: TxRef.TxRef<Chunk.Chunk<A>>;
toString: () => string;
toJSON: () => unknown;
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 TxChunk<in out A>TxChunk is a transactional chunk data structure that provides Software Transactional Memory (STM)
semantics for chunk operations.
Details
Accessed values are tracked by the transaction in order to detect conflicts and to track changes.
A transaction will retry whenever a conflict is detected or whenever the transaction explicitly
calls Effect.txRetry and any of the accessed TxChunk values change.
Example (Using a transactional chunk)
import { Chunk, Effect, TxChunk } from "effect"
const program = Effect.gen(function*() {
// Create a transactional chunk
const txChunk: TxChunk.TxChunk<number> = yield* TxChunk.fromIterable([
1,
2,
3
])
// Single operations - no explicit transaction needed
yield* TxChunk.append(txChunk, 4)
const result = yield* TxChunk.get(txChunk)
console.log(Chunk.toReadonlyArray(result)) // [1, 2, 3, 4]
// Multi-step atomic operation - use explicit transaction
yield* Effect.tx(
Effect.gen(function*() {
yield* TxChunk.prepend(txChunk, 0)
yield* TxChunk.append(txChunk, 5)
})
)
const finalResult = yield* TxChunk.get(txChunk)
console.log(Chunk.toReadonlyArray(finalResult)) // [0, 1, 2, 3, 4, 5]
})
TxChunk<function (type parameter) A in <A>(self: TxChunk<A>): Effect.Effect<boolean>A>): import EffectEffect.interface Effect<out A, out E = never, out R = never>The Effect interface defines a value that lazily describes a workflow or
job. The workflow requires some context R, and may fail with an error of
type E, or succeed with a value of type A.
When to use
Use when you need to represent a lazy, composable workflow that can require
services, fail with a typed error, or succeed with a typed value.
Details
Effect values model resourceful interaction with the outside world,
including synchronous, asynchronous, concurrent, and parallel interaction.
They use a fiber-based concurrency model, with built-in support for
scheduling, fine-grained interruption, structured concurrency, and high
scalability.
To run an Effect value, you need a Runtime, which is a type that is
capable of executing Effect values.
Effect<boolean> =>
const modify: {
<A, R>(
f: (
current: Chunk.Chunk<NoInfer<A>>
) => [
returnValue: R,
newValue: Chunk.Chunk<A>
]
): (self: TxChunk<A>) => Effect.Effect<R>
<A, R>(
self: TxChunk<A>,
f: (
current: Chunk.Chunk<A>
) => [
returnValue: R,
newValue: Chunk.Chunk<A>
]
): Effect.Effect<R>
}
modify(self: TxChunk<A>(parameter) self: {
ref: TxRef.TxRef<Chunk.Chunk<A>>;
toString: () => string;
toJSON: () => unknown;
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, (current: Chunk.Chunk<A>(parameter) current: {
length: number;
right: Chunk<A>;
left: Chunk<A>;
backing: Backing<A>;
depth: number;
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;
}
current) => [import ChunkChunk.const isEmpty: <A>(
self: Chunk<A>
) => boolean
Determines if the chunk is empty.
Example (Checking for empty chunks)
import { Chunk } from "effect"
console.log(Chunk.isEmpty(Chunk.empty())) // true
console.log(Chunk.isEmpty(Chunk.make(1, 2, 3))) // false
isEmpty(current: Chunk.Chunk<A>(parameter) current: {
length: number;
right: Chunk<A>;
left: Chunk<A>;
backing: Backing<A>;
depth: number;
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;
}
current), current: Chunk.Chunk<A>(parameter) current: {
length: number;
right: Chunk<A>;
left: Chunk<A>;
backing: Backing<A>;
depth: number;
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;
}
current])