<A extends Request.Any, A2, X>(
before: (
entries: NonEmptyArray<Request.Entry<NoInfer<A>>>
) => Effect.Effect<A2, Request.Error<A>>,
after: (
entries: NonEmptyArray<Request.Entry<NoInfer<A>>>,
a: A2
) => Effect.Effect<X, Request.Error<A>>
): (self: RequestResolver<A>) => RequestResolver<A>
<A extends Request.Any, A2, X>(
self: RequestResolver<A>,
before: (
entries: NonEmptyArray<Request.Entry<NoInfer<A>>>
) => Effect.Effect<A2, Request.Error<A>>,
after: (
entries: NonEmptyArray<Request.Entry<NoInfer<A>>>,
a: A2
) => Effect.Effect<X, Request.Error<A>>
): RequestResolver<A>Wraps request resolver execution between before and after effects.
Example (Running effects around request resolution)
import { Effect, Exit, Request, RequestResolver } from "effect"
interface GetDataRequest extends Request.Request<string> {
readonly _tag: "GetDataRequest"
}
const GetDataRequest = Request.tagged<GetDataRequest>("GetDataRequest")
const resolver = RequestResolver.make<GetDataRequest>((entries) =>
Effect.sync(() => {
for (const entry of entries) {
entry.completeUnsafe(Exit.succeed("data"))
}
})
)
// Add setup and cleanup around request execution
const resolverWithAround = RequestResolver.around(
resolver,
(entries) =>
Effect.gen(function*() {
yield* Effect.log(`Starting batch of ${entries.length} requests`)
return entries.length
}),
(entries, initialSize) =>
Effect.gen(function*() {
yield* Effect.log(
`Batch completed with ${entries.length} requests (started with ${initialSize})`
)
})
)export const const around: {
<A extends Request.Any, A2, X>(
before: (
entries: NonEmptyArray<
Request.Entry<NoInfer<A>>
>
) => Effect.Effect<A2, Request.Error<A>>,
after: (
entries: NonEmptyArray<
Request.Entry<NoInfer<A>>
>,
a: A2
) => Effect.Effect<X, Request.Error<A>>
): (
self: RequestResolver<A>
) => RequestResolver<A>
<A extends Request.Any, A2, X>(
self: RequestResolver<A>,
before: (
entries: NonEmptyArray<
Request.Entry<NoInfer<A>>
>
) => Effect.Effect<A2, Request.Error<A>>,
after: (
entries: NonEmptyArray<
Request.Entry<NoInfer<A>>
>,
a: A2
) => Effect.Effect<X, Request.Error<A>>
): RequestResolver<A>
}
Wraps request resolver execution between before and after effects.
Example (Running effects around request resolution)
import { Effect, Exit, Request, RequestResolver } from "effect"
interface GetDataRequest extends Request.Request<string> {
readonly _tag: "GetDataRequest"
}
const GetDataRequest = Request.tagged<GetDataRequest>("GetDataRequest")
const resolver = RequestResolver.make<GetDataRequest>((entries) =>
Effect.sync(() => {
for (const entry of entries) {
entry.completeUnsafe(Exit.succeed("data"))
}
})
)
// Add setup and cleanup around request execution
const resolverWithAround = RequestResolver.around(
resolver,
(entries) =>
Effect.gen(function*() {
yield* Effect.log(`Starting batch of ${entries.length} requests`)
return entries.length
}),
(entries, initialSize) =>
Effect.gen(function*() {
yield* Effect.log(
`Batch completed with ${entries.length} requests (started with ${initialSize})`
)
})
)
around: {
<function (type parameter) A in <A extends Request.Any, A2, X>(before: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>) => Effect.Effect<A2, Request.Error<A>>, after: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>, a: A2) => Effect.Effect<X, Request.Error<A>>): (self: RequestResolver<A>) => RequestResolver<A>A extends import RequestRequest.type Any = Request.Request<any, any, any>Alias for any Request, regardless of its success, error, or service
requirements.
When to use
Use as a generic constraint for APIs that accept any request while preserving
each concrete request's success, error, and service types.
Any, function (type parameter) A2 in <A extends Request.Any, A2, X>(before: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>) => Effect.Effect<A2, Request.Error<A>>, after: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>, a: A2) => Effect.Effect<X, Request.Error<A>>): (self: RequestResolver<A>) => RequestResolver<A>A2, function (type parameter) X in <A extends Request.Any, A2, X>(before: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>) => Effect.Effect<A2, Request.Error<A>>, after: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>, a: A2) => Effect.Effect<X, Request.Error<A>>): (self: RequestResolver<A>) => RequestResolver<A>X>(
before: (
entries: NonEmptyArray<
Request.Entry<NoInfer<A>>
>
) => Effect.Effect<A2, Request.Error<A>>
before: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>(parameter) entries: {
0: Request.Entry<NoInfer<A>>;
length: number;
toString: () => string;
toLocaleString: { (): string; (locales: string | string[], options?: Intl.NumberFormatOptions & Intl.DateTimeFormatOptions): string };
pop: () => Request.Entry<NoInfer<A>> | undefined;
push: (...items: Array<Request.Entry<NoInfer<A>>>) => number;
concat: { (...items: Array<ConcatArray<Request.Entry<NoInfer<A>>>>): Array<Request.Entry<NoInfer<A>>>; (...items: Array<Request.Entry<NoInfer<A>> | ConcatArray<Request.Entry<NoInfer<A>>>>): Array<Request.Entry<NoInfer<A>>> };
join: (separator?: string) => string;
reverse: () => Array<Request.Entry<NoInfer<A>>>;
shift: () => Request.Entry<NoInfer<A>> | undefined;
slice: (start?: number, end?: number) => Array<Request.Entry<NoInfer<A>>>;
sort: (compareFn?: ((a: Request.Entry<NoInfer<A>>, b: Request.Entry<NoInfer<A>>) => number) | undefined) => [Request.Entry<NoInfer<A>>, ...Request.Entry<NoInfer<A>>[]];
splice: { (start: number, deleteCount?: number): Array<Request.Entry<NoInfer<A>>>; (start: number, deleteCount: number, ...items: Array<Request.Entry<NoInfer<A>>>): Array<Request.Entry<NoInfer<A>>> };
unshift: (...items: Array<Request.Entry<NoInfer<A>>>) => number;
indexOf: (searchElement: Request.Entry<NoInfer<A>>, fromIndex?: number) => number;
lastIndexOf: (searchElement: Request.Entry<NoInfer<A>>, fromIndex?: number) => number;
every: { (predicate: (value: Request.Entry<NoInfer<A>>, index: number, array: Array<Request.Entry<NoInfer<A>>>) => value is S, thisArg?: any): this is S[]; (predicate: (value: Request.Entry<NoInfer<A>>, index: number, array: Array<Request.Entry<N…;
some: (predicate: (value: Request.Entry<NoInfer<A>>, index: number, array: Array<Request.Entry<NoInfer<A>>>) => unknown, thisArg?: any) => boolean;
forEach: (callbackfn: (value: Request.Entry<NoInfer<A>>, index: number, array: Array<Request.Entry<NoInfer<A>>>) => void, thisArg?: any) => void;
map: (callbackfn: (value: Request.Entry<NoInfer<A>>, index: number, array: Array<Request.Entry<NoInfer<A>>>) => U, thisArg?: any) => Array<U>;
filter: { (predicate: (value: Request.Entry<NoInfer<A>>, index: number, array: Array<Request.Entry<NoInfer<A>>>) => value is S, thisArg?: any): Array<S>; (predicate: (value: Request.Entry<NoInfer<A>>, index: number, array: Array<Request.Entry<NoIn…;
reduce: { (callbackfn: (previousValue: Request.Entry<NoInfer<A>>, currentValue: Request.Entry<NoInfer<A>>, currentIndex: number, array: Array<Request.Entry<NoInfer<A>>>) => Request.Entry<NoInfer<A>>): Request.Entry<NoInfer<A>>; (callbackfn: (previ…;
reduceRight: { (callbackfn: (previousValue: Request.Entry<NoInfer<A>>, currentValue: Request.Entry<NoInfer<A>>, currentIndex: number, array: Array<Request.Entry<NoInfer<A>>>) => Request.Entry<NoInfer<A>>): Request.Entry<NoInfer<A>>; (callbackfn: (previ…;
find: { (predicate: (value: Request.Entry<NoInfer<A>>, index: number, obj: Array<Request.Entry<NoInfer<A>>>) => value is S, thisArg?: any): S | undefined; (predicate: (value: Request.Entry<NoInfer<A>>, index: number, obj: Array<Request.Entry<NoI…;
findIndex: (predicate: (value: Request.Entry<NoInfer<A>>, index: number, obj: Array<Request.Entry<NoInfer<A>>>) => unknown, thisArg?: any) => number;
fill: (value: Request.Entry<NoInfer<A>>, start?: number, end?: number) => [Request.Entry<NoInfer<A>>, ...Request.Entry<NoInfer<A>>[]];
copyWithin: (target: number, start: number, end?: number) => [Request.Entry<NoInfer<A>>, ...Request.Entry<NoInfer<A>>[]];
entries: () => ArrayIterator<[number, Request.Entry<NoInfer<A>>]>;
keys: () => ArrayIterator<number>;
values: () => ArrayIterator<Request.Entry<NoInfer<A>>>;
includes: (searchElement: Request.Entry<NoInfer<A>>, fromIndex?: number) => boolean;
flatMap: (callback: (this: This, value: Request.Entry<NoInfer<A>>, index: number, array: Array<Request.Entry<NoInfer<A>>>) => U | ReadonlyArray<U>, thisArg?: This | undefined) => Array<U>;
flat: (this: A, depth?: D | undefined) => Array<FlatArray<A, D>>;
at: (index: number) => Request.Entry<NoInfer<A>> | undefined;
findLast: { (predicate: (value: Request.Entry<NoInfer<A>>, index: number, array: Array<Request.Entry<NoInfer<A>>>) => value is S, thisArg?: any): S | undefined; (predicate: (value: Request.Entry<NoInfer<A>>, index: number, array: Array<Request.Entry…;
findLastIndex: (predicate: (value: Request.Entry<NoInfer<A>>, index: number, array: Array<Request.Entry<NoInfer<A>>>) => unknown, thisArg?: any) => number;
toReversed: () => Array<Request.Entry<NoInfer<A>>>;
toSorted: (compareFn?: ((a: Request.Entry<NoInfer<A>>, b: Request.Entry<NoInfer<A>>) => number) | undefined) => Array<Request.Entry<NoInfer<A>>>;
toSpliced: { (start: number, deleteCount: number, ...items: Array<Request.Entry<NoInfer<A>>>): Array<Request.Entry<NoInfer<A>>>; (start: number, deleteCount?: number): Array<Request.Entry<NoInfer<A>>> };
with: (index: number, value: Request.Entry<NoInfer<A>>) => Array<Request.Entry<NoInfer<A>>>;
}
entries: type NonEmptyArray<A> = [A, ...A[]]A mutable array guaranteed to have at least one element.
When to use
Use when mutation is acceptable and non-emptiness must be tracked at the type
level.
Details
This is the mutable counterpart of
NonEmptyReadonlyArray
. Most Array
module functions return NonEmptyArray when the result is guaranteed
non-empty.
Example (Typing a mutable non-empty array)
import type { Array } from "effect"
const nonEmpty: Array.NonEmptyArray<number> = [1, 2, 3]
nonEmpty.push(4)
NonEmptyArray<import RequestRequest.interface Entry<out R>A pending request handed to a RequestResolver.
Details
An entry contains the original request, the fiber context needed to run it,
an uninterruptible flag used by batching and caching internals, and the
completeUnsafe callback used by resolvers to supply the final Exit.
Entry<type NoInfer<T> = intrinsicMarker for non-inference type position
NoInfer<function (type parameter) A in <A extends Request.Any, A2, X>(before: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>) => Effect.Effect<A2, Request.Error<A>>, after: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>, a: A2) => Effect.Effect<X, Request.Error<A>>): (self: RequestResolver<A>) => RequestResolver<A>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<function (type parameter) A2 in <A extends Request.Any, A2, X>(before: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>) => Effect.Effect<A2, Request.Error<A>>, after: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>, a: A2) => Effect.Effect<X, Request.Error<A>>): (self: RequestResolver<A>) => RequestResolver<A>A2, import RequestRequest.type Error<
T extends Request.Request<any, any, any>
> = [T] extends [
Request.Request<infer _A, infer _E, infer _R>
]
? _E
: never
A utility type to extract the error type from a Request.
Example (Extracting a request error type)
import type { Request } from "effect"
interface GetUser extends Request.Request<string, Error> {
readonly id: number
}
// Extract the error type from a Request using the utility
type UserError = Request.Error<GetUser> // Error
Error<function (type parameter) A in <A extends Request.Any, A2, X>(before: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>) => Effect.Effect<A2, Request.Error<A>>, after: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>, a: A2) => Effect.Effect<X, Request.Error<A>>): (self: RequestResolver<A>) => RequestResolver<A>A>>,
after: (
entries: NonEmptyArray<
Request.Entry<NoInfer<A>>
>,
a: A2
) => Effect.Effect<X, Request.Error<A>>
after: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>(parameter) entries: {
0: Request.Entry<NoInfer<A>>;
length: number;
toString: () => string;
toLocaleString: { (): string; (locales: string | string[], options?: Intl.NumberFormatOptions & Intl.DateTimeFormatOptions): string };
pop: () => Request.Entry<NoInfer<A>> | undefined;
push: (...items: Array<Request.Entry<NoInfer<A>>>) => number;
concat: { (...items: Array<ConcatArray<Request.Entry<NoInfer<A>>>>): Array<Request.Entry<NoInfer<A>>>; (...items: Array<Request.Entry<NoInfer<A>> | ConcatArray<Request.Entry<NoInfer<A>>>>): Array<Request.Entry<NoInfer<A>>> };
join: (separator?: string) => string;
reverse: () => Array<Request.Entry<NoInfer<A>>>;
shift: () => Request.Entry<NoInfer<A>> | undefined;
slice: (start?: number, end?: number) => Array<Request.Entry<NoInfer<A>>>;
sort: (compareFn?: ((a: Request.Entry<NoInfer<A>>, b: Request.Entry<NoInfer<A>>) => number) | undefined) => [Request.Entry<NoInfer<A>>, ...Request.Entry<NoInfer<A>>[]];
splice: { (start: number, deleteCount?: number): Array<Request.Entry<NoInfer<A>>>; (start: number, deleteCount: number, ...items: Array<Request.Entry<NoInfer<A>>>): Array<Request.Entry<NoInfer<A>>> };
unshift: (...items: Array<Request.Entry<NoInfer<A>>>) => number;
indexOf: (searchElement: Request.Entry<NoInfer<A>>, fromIndex?: number) => number;
lastIndexOf: (searchElement: Request.Entry<NoInfer<A>>, fromIndex?: number) => number;
every: { (predicate: (value: Request.Entry<NoInfer<A>>, index: number, array: Array<Request.Entry<NoInfer<A>>>) => value is S, thisArg?: any): this is S[]; (predicate: (value: Request.Entry<NoInfer<A>>, index: number, array: Array<Request.Entry<N…;
some: (predicate: (value: Request.Entry<NoInfer<A>>, index: number, array: Array<Request.Entry<NoInfer<A>>>) => unknown, thisArg?: any) => boolean;
forEach: (callbackfn: (value: Request.Entry<NoInfer<A>>, index: number, array: Array<Request.Entry<NoInfer<A>>>) => void, thisArg?: any) => void;
map: (callbackfn: (value: Request.Entry<NoInfer<A>>, index: number, array: Array<Request.Entry<NoInfer<A>>>) => U, thisArg?: any) => Array<U>;
filter: { (predicate: (value: Request.Entry<NoInfer<A>>, index: number, array: Array<Request.Entry<NoInfer<A>>>) => value is S, thisArg?: any): Array<S>; (predicate: (value: Request.Entry<NoInfer<A>>, index: number, array: Array<Request.Entry<NoIn…;
reduce: { (callbackfn: (previousValue: Request.Entry<NoInfer<A>>, currentValue: Request.Entry<NoInfer<A>>, currentIndex: number, array: Array<Request.Entry<NoInfer<A>>>) => Request.Entry<NoInfer<A>>): Request.Entry<NoInfer<A>>; (callbackfn: (previ…;
reduceRight: { (callbackfn: (previousValue: Request.Entry<NoInfer<A>>, currentValue: Request.Entry<NoInfer<A>>, currentIndex: number, array: Array<Request.Entry<NoInfer<A>>>) => Request.Entry<NoInfer<A>>): Request.Entry<NoInfer<A>>; (callbackfn: (previ…;
find: { (predicate: (value: Request.Entry<NoInfer<A>>, index: number, obj: Array<Request.Entry<NoInfer<A>>>) => value is S, thisArg?: any): S | undefined; (predicate: (value: Request.Entry<NoInfer<A>>, index: number, obj: Array<Request.Entry<NoI…;
findIndex: (predicate: (value: Request.Entry<NoInfer<A>>, index: number, obj: Array<Request.Entry<NoInfer<A>>>) => unknown, thisArg?: any) => number;
fill: (value: Request.Entry<NoInfer<A>>, start?: number, end?: number) => [Request.Entry<NoInfer<A>>, ...Request.Entry<NoInfer<A>>[]];
copyWithin: (target: number, start: number, end?: number) => [Request.Entry<NoInfer<A>>, ...Request.Entry<NoInfer<A>>[]];
entries: () => ArrayIterator<[number, Request.Entry<NoInfer<A>>]>;
keys: () => ArrayIterator<number>;
values: () => ArrayIterator<Request.Entry<NoInfer<A>>>;
includes: (searchElement: Request.Entry<NoInfer<A>>, fromIndex?: number) => boolean;
flatMap: (callback: (this: This, value: Request.Entry<NoInfer<A>>, index: number, array: Array<Request.Entry<NoInfer<A>>>) => U | ReadonlyArray<U>, thisArg?: This | undefined) => Array<U>;
flat: (this: A, depth?: D | undefined) => Array<FlatArray<A, D>>;
at: (index: number) => Request.Entry<NoInfer<A>> | undefined;
findLast: { (predicate: (value: Request.Entry<NoInfer<A>>, index: number, array: Array<Request.Entry<NoInfer<A>>>) => value is S, thisArg?: any): S | undefined; (predicate: (value: Request.Entry<NoInfer<A>>, index: number, array: Array<Request.Entry…;
findLastIndex: (predicate: (value: Request.Entry<NoInfer<A>>, index: number, array: Array<Request.Entry<NoInfer<A>>>) => unknown, thisArg?: any) => number;
toReversed: () => Array<Request.Entry<NoInfer<A>>>;
toSorted: (compareFn?: ((a: Request.Entry<NoInfer<A>>, b: Request.Entry<NoInfer<A>>) => number) | undefined) => Array<Request.Entry<NoInfer<A>>>;
toSpliced: { (start: number, deleteCount: number, ...items: Array<Request.Entry<NoInfer<A>>>): Array<Request.Entry<NoInfer<A>>>; (start: number, deleteCount?: number): Array<Request.Entry<NoInfer<A>>> };
with: (index: number, value: Request.Entry<NoInfer<A>>) => Array<Request.Entry<NoInfer<A>>>;
}
entries: type NonEmptyArray<A> = [A, ...A[]]A mutable array guaranteed to have at least one element.
When to use
Use when mutation is acceptable and non-emptiness must be tracked at the type
level.
Details
This is the mutable counterpart of
NonEmptyReadonlyArray
. Most Array
module functions return NonEmptyArray when the result is guaranteed
non-empty.
Example (Typing a mutable non-empty array)
import type { Array } from "effect"
const nonEmpty: Array.NonEmptyArray<number> = [1, 2, 3]
nonEmpty.push(4)
NonEmptyArray<import RequestRequest.interface Entry<out R>A pending request handed to a RequestResolver.
Details
An entry contains the original request, the fiber context needed to run it,
an uninterruptible flag used by batching and caching internals, and the
completeUnsafe callback used by resolvers to supply the final Exit.
Entry<type NoInfer<T> = intrinsicMarker for non-inference type position
NoInfer<function (type parameter) A in <A extends Request.Any, A2, X>(before: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>) => Effect.Effect<A2, Request.Error<A>>, after: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>, a: A2) => Effect.Effect<X, Request.Error<A>>): (self: RequestResolver<A>) => RequestResolver<A>A>>>, a: A2a: function (type parameter) A2 in <A extends Request.Any, A2, X>(before: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>) => Effect.Effect<A2, Request.Error<A>>, after: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>, a: A2) => Effect.Effect<X, Request.Error<A>>): (self: RequestResolver<A>) => RequestResolver<A>A2) => 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<function (type parameter) X in <A extends Request.Any, A2, X>(before: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>) => Effect.Effect<A2, Request.Error<A>>, after: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>, a: A2) => Effect.Effect<X, Request.Error<A>>): (self: RequestResolver<A>) => RequestResolver<A>X, import RequestRequest.type Error<
T extends Request.Request<any, any, any>
> = [T] extends [
Request.Request<infer _A, infer _E, infer _R>
]
? _E
: never
A utility type to extract the error type from a Request.
Example (Extracting a request error type)
import type { Request } from "effect"
interface GetUser extends Request.Request<string, Error> {
readonly id: number
}
// Extract the error type from a Request using the utility
type UserError = Request.Error<GetUser> // Error
Error<function (type parameter) A in <A extends Request.Any, A2, X>(before: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>) => Effect.Effect<A2, Request.Error<A>>, after: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>, a: A2) => Effect.Effect<X, Request.Error<A>>): (self: RequestResolver<A>) => RequestResolver<A>A>>
): (self: RequestResolver<A>(parameter) self: {
delay: Effect.Effect<void>;
batchKey: (entry: Request.Entry<A>) => unknown;
preCheck: ((entry: Request.Entry<A>) => boolean) | undefined;
collectWhile: (entries: ReadonlySet<Request.Entry<A>>) => boolean;
runAll: (entries: [Request.Entry<A>, ...Request.Entry<A>[]], key: unknown) => Effect.Effect<void, Request.Error<A>, never>;
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 RequestResolver<in A extends Request.Any>A resolver that executes and completes batched Request entries.
Details
A resolver controls how requests are grouped, delayed, optionally
pre-checked, and finally run. Its runAll method receives a non-empty batch
of Request.Entry values for a single batch key and must complete every
received entry, usually by calling completeUnsafe or one of the Request
completion helpers.
Gotchas
If a resolver finishes without completing an entry, the waiting request fails
because the resolver did not supply a result.
Example (Defining a request resolver)
import { Effect, Exit, RequestResolver } from "effect"
import type { Request } from "effect"
interface GetUserRequest extends Request.Request<string, Error> {
readonly _tag: "GetUserRequest"
readonly id: number
}
// In practice, you would typically use RequestResolver.make() instead
const resolver = RequestResolver.make<GetUserRequest>((entries) =>
Effect.sync(() => {
for (const entry of entries) {
entry.completeUnsafe(Exit.succeed(`User ${entry.request.id}`))
}
})
)
Namespace containing type-level helpers associated with RequestResolver.
RequestResolver<function (type parameter) A in <A extends Request.Any, A2, X>(before: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>) => Effect.Effect<A2, Request.Error<A>>, after: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>, a: A2) => Effect.Effect<X, Request.Error<A>>): (self: RequestResolver<A>) => RequestResolver<A>A>) => interface RequestResolver<in A extends Request.Any>A resolver that executes and completes batched Request entries.
Details
A resolver controls how requests are grouped, delayed, optionally
pre-checked, and finally run. Its runAll method receives a non-empty batch
of Request.Entry values for a single batch key and must complete every
received entry, usually by calling completeUnsafe or one of the Request
completion helpers.
Gotchas
If a resolver finishes without completing an entry, the waiting request fails
because the resolver did not supply a result.
Example (Defining a request resolver)
import { Effect, Exit, RequestResolver } from "effect"
import type { Request } from "effect"
interface GetUserRequest extends Request.Request<string, Error> {
readonly _tag: "GetUserRequest"
readonly id: number
}
// In practice, you would typically use RequestResolver.make() instead
const resolver = RequestResolver.make<GetUserRequest>((entries) =>
Effect.sync(() => {
for (const entry of entries) {
entry.completeUnsafe(Exit.succeed(`User ${entry.request.id}`))
}
})
)
Namespace containing type-level helpers associated with RequestResolver.
RequestResolver<function (type parameter) A in <A extends Request.Any, A2, X>(before: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>) => Effect.Effect<A2, Request.Error<A>>, after: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>, a: A2) => Effect.Effect<X, Request.Error<A>>): (self: RequestResolver<A>) => RequestResolver<A>A>
<function (type parameter) A in <A extends Request.Any, A2, X>(self: RequestResolver<A>, before: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>) => Effect.Effect<A2, Request.Error<A>>, after: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>, a: A2) => Effect.Effect<X, Request.Error<A>>): RequestResolver<A>A extends import RequestRequest.type Any = Request.Request<any, any, any>Alias for any Request, regardless of its success, error, or service
requirements.
When to use
Use as a generic constraint for APIs that accept any request while preserving
each concrete request's success, error, and service types.
Any, function (type parameter) A2 in <A extends Request.Any, A2, X>(self: RequestResolver<A>, before: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>) => Effect.Effect<A2, Request.Error<A>>, after: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>, a: A2) => Effect.Effect<X, Request.Error<A>>): RequestResolver<A>A2, function (type parameter) X in <A extends Request.Any, A2, X>(self: RequestResolver<A>, before: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>) => Effect.Effect<A2, Request.Error<A>>, after: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>, a: A2) => Effect.Effect<X, Request.Error<A>>): RequestResolver<A>X>(
self: RequestResolver<A>(parameter) self: {
delay: Effect.Effect<void>;
batchKey: (entry: Request.Entry<A>) => unknown;
preCheck: ((entry: Request.Entry<A>) => boolean) | undefined;
collectWhile: (entries: ReadonlySet<Request.Entry<A>>) => boolean;
runAll: (entries: [Request.Entry<A>, ...Request.Entry<A>[]], key: unknown) => Effect.Effect<void, Request.Error<A>, never>;
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 RequestResolver<in A extends Request.Any>A resolver that executes and completes batched Request entries.
Details
A resolver controls how requests are grouped, delayed, optionally
pre-checked, and finally run. Its runAll method receives a non-empty batch
of Request.Entry values for a single batch key and must complete every
received entry, usually by calling completeUnsafe or one of the Request
completion helpers.
Gotchas
If a resolver finishes without completing an entry, the waiting request fails
because the resolver did not supply a result.
Example (Defining a request resolver)
import { Effect, Exit, RequestResolver } from "effect"
import type { Request } from "effect"
interface GetUserRequest extends Request.Request<string, Error> {
readonly _tag: "GetUserRequest"
readonly id: number
}
// In practice, you would typically use RequestResolver.make() instead
const resolver = RequestResolver.make<GetUserRequest>((entries) =>
Effect.sync(() => {
for (const entry of entries) {
entry.completeUnsafe(Exit.succeed(`User ${entry.request.id}`))
}
})
)
Namespace containing type-level helpers associated with RequestResolver.
RequestResolver<function (type parameter) A in <A extends Request.Any, A2, X>(self: RequestResolver<A>, before: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>) => Effect.Effect<A2, Request.Error<A>>, after: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>, a: A2) => Effect.Effect<X, Request.Error<A>>): RequestResolver<A>A>,
before: (
entries: NonEmptyArray<
Request.Entry<NoInfer<A>>
>
) => Effect.Effect<A2, Request.Error<A>>
before: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>(parameter) entries: {
0: Request.Entry<NoInfer<A>>;
length: number;
toString: () => string;
toLocaleString: { (): string; (locales: string | string[], options?: Intl.NumberFormatOptions & Intl.DateTimeFormatOptions): string };
pop: () => Request.Entry<NoInfer<A>> | undefined;
push: (...items: Array<Request.Entry<NoInfer<A>>>) => number;
concat: { (...items: Array<ConcatArray<Request.Entry<NoInfer<A>>>>): Array<Request.Entry<NoInfer<A>>>; (...items: Array<Request.Entry<NoInfer<A>> | ConcatArray<Request.Entry<NoInfer<A>>>>): Array<Request.Entry<NoInfer<A>>> };
join: (separator?: string) => string;
reverse: () => Array<Request.Entry<NoInfer<A>>>;
shift: () => Request.Entry<NoInfer<A>> | undefined;
slice: (start?: number, end?: number) => Array<Request.Entry<NoInfer<A>>>;
sort: (compareFn?: ((a: Request.Entry<NoInfer<A>>, b: Request.Entry<NoInfer<A>>) => number) | undefined) => [Request.Entry<NoInfer<A>>, ...Request.Entry<NoInfer<A>>[]];
splice: { (start: number, deleteCount?: number): Array<Request.Entry<NoInfer<A>>>; (start: number, deleteCount: number, ...items: Array<Request.Entry<NoInfer<A>>>): Array<Request.Entry<NoInfer<A>>> };
unshift: (...items: Array<Request.Entry<NoInfer<A>>>) => number;
indexOf: (searchElement: Request.Entry<NoInfer<A>>, fromIndex?: number) => number;
lastIndexOf: (searchElement: Request.Entry<NoInfer<A>>, fromIndex?: number) => number;
every: { (predicate: (value: Request.Entry<NoInfer<A>>, index: number, array: Array<Request.Entry<NoInfer<A>>>) => value is S, thisArg?: any): this is S[]; (predicate: (value: Request.Entry<NoInfer<A>>, index: number, array: Array<Request.Entry<N…;
some: (predicate: (value: Request.Entry<NoInfer<A>>, index: number, array: Array<Request.Entry<NoInfer<A>>>) => unknown, thisArg?: any) => boolean;
forEach: (callbackfn: (value: Request.Entry<NoInfer<A>>, index: number, array: Array<Request.Entry<NoInfer<A>>>) => void, thisArg?: any) => void;
map: (callbackfn: (value: Request.Entry<NoInfer<A>>, index: number, array: Array<Request.Entry<NoInfer<A>>>) => U, thisArg?: any) => Array<U>;
filter: { (predicate: (value: Request.Entry<NoInfer<A>>, index: number, array: Array<Request.Entry<NoInfer<A>>>) => value is S, thisArg?: any): Array<S>; (predicate: (value: Request.Entry<NoInfer<A>>, index: number, array: Array<Request.Entry<NoIn…;
reduce: { (callbackfn: (previousValue: Request.Entry<NoInfer<A>>, currentValue: Request.Entry<NoInfer<A>>, currentIndex: number, array: Array<Request.Entry<NoInfer<A>>>) => Request.Entry<NoInfer<A>>): Request.Entry<NoInfer<A>>; (callbackfn: (previ…;
reduceRight: { (callbackfn: (previousValue: Request.Entry<NoInfer<A>>, currentValue: Request.Entry<NoInfer<A>>, currentIndex: number, array: Array<Request.Entry<NoInfer<A>>>) => Request.Entry<NoInfer<A>>): Request.Entry<NoInfer<A>>; (callbackfn: (previ…;
find: { (predicate: (value: Request.Entry<NoInfer<A>>, index: number, obj: Array<Request.Entry<NoInfer<A>>>) => value is S, thisArg?: any): S | undefined; (predicate: (value: Request.Entry<NoInfer<A>>, index: number, obj: Array<Request.Entry<NoI…;
findIndex: (predicate: (value: Request.Entry<NoInfer<A>>, index: number, obj: Array<Request.Entry<NoInfer<A>>>) => unknown, thisArg?: any) => number;
fill: (value: Request.Entry<NoInfer<A>>, start?: number, end?: number) => [Request.Entry<NoInfer<A>>, ...Request.Entry<NoInfer<A>>[]];
copyWithin: (target: number, start: number, end?: number) => [Request.Entry<NoInfer<A>>, ...Request.Entry<NoInfer<A>>[]];
entries: () => ArrayIterator<[number, Request.Entry<NoInfer<A>>]>;
keys: () => ArrayIterator<number>;
values: () => ArrayIterator<Request.Entry<NoInfer<A>>>;
includes: (searchElement: Request.Entry<NoInfer<A>>, fromIndex?: number) => boolean;
flatMap: (callback: (this: This, value: Request.Entry<NoInfer<A>>, index: number, array: Array<Request.Entry<NoInfer<A>>>) => U | ReadonlyArray<U>, thisArg?: This | undefined) => Array<U>;
flat: (this: A, depth?: D | undefined) => Array<FlatArray<A, D>>;
at: (index: number) => Request.Entry<NoInfer<A>> | undefined;
findLast: { (predicate: (value: Request.Entry<NoInfer<A>>, index: number, array: Array<Request.Entry<NoInfer<A>>>) => value is S, thisArg?: any): S | undefined; (predicate: (value: Request.Entry<NoInfer<A>>, index: number, array: Array<Request.Entry…;
findLastIndex: (predicate: (value: Request.Entry<NoInfer<A>>, index: number, array: Array<Request.Entry<NoInfer<A>>>) => unknown, thisArg?: any) => number;
toReversed: () => Array<Request.Entry<NoInfer<A>>>;
toSorted: (compareFn?: ((a: Request.Entry<NoInfer<A>>, b: Request.Entry<NoInfer<A>>) => number) | undefined) => Array<Request.Entry<NoInfer<A>>>;
toSpliced: { (start: number, deleteCount: number, ...items: Array<Request.Entry<NoInfer<A>>>): Array<Request.Entry<NoInfer<A>>>; (start: number, deleteCount?: number): Array<Request.Entry<NoInfer<A>>> };
with: (index: number, value: Request.Entry<NoInfer<A>>) => Array<Request.Entry<NoInfer<A>>>;
}
entries: type NonEmptyArray<A> = [A, ...A[]]A mutable array guaranteed to have at least one element.
When to use
Use when mutation is acceptable and non-emptiness must be tracked at the type
level.
Details
This is the mutable counterpart of
NonEmptyReadonlyArray
. Most Array
module functions return NonEmptyArray when the result is guaranteed
non-empty.
Example (Typing a mutable non-empty array)
import type { Array } from "effect"
const nonEmpty: Array.NonEmptyArray<number> = [1, 2, 3]
nonEmpty.push(4)
NonEmptyArray<import RequestRequest.interface Entry<out R>A pending request handed to a RequestResolver.
Details
An entry contains the original request, the fiber context needed to run it,
an uninterruptible flag used by batching and caching internals, and the
completeUnsafe callback used by resolvers to supply the final Exit.
Entry<type NoInfer<T> = intrinsicMarker for non-inference type position
NoInfer<function (type parameter) A in <A extends Request.Any, A2, X>(self: RequestResolver<A>, before: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>) => Effect.Effect<A2, Request.Error<A>>, after: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>, a: A2) => Effect.Effect<X, Request.Error<A>>): RequestResolver<A>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<function (type parameter) A2 in <A extends Request.Any, A2, X>(self: RequestResolver<A>, before: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>) => Effect.Effect<A2, Request.Error<A>>, after: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>, a: A2) => Effect.Effect<X, Request.Error<A>>): RequestResolver<A>A2, import RequestRequest.type Error<
T extends Request.Request<any, any, any>
> = [T] extends [
Request.Request<infer _A, infer _E, infer _R>
]
? _E
: never
A utility type to extract the error type from a Request.
Example (Extracting a request error type)
import type { Request } from "effect"
interface GetUser extends Request.Request<string, Error> {
readonly id: number
}
// Extract the error type from a Request using the utility
type UserError = Request.Error<GetUser> // Error
Error<function (type parameter) A in <A extends Request.Any, A2, X>(self: RequestResolver<A>, before: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>) => Effect.Effect<A2, Request.Error<A>>, after: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>, a: A2) => Effect.Effect<X, Request.Error<A>>): RequestResolver<A>A>>,
after: (
entries: NonEmptyArray<
Request.Entry<NoInfer<A>>
>,
a: A2
) => Effect.Effect<X, Request.Error<A>>
after: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>(parameter) entries: {
0: Request.Entry<NoInfer<A>>;
length: number;
toString: () => string;
toLocaleString: { (): string; (locales: string | string[], options?: Intl.NumberFormatOptions & Intl.DateTimeFormatOptions): string };
pop: () => Request.Entry<NoInfer<A>> | undefined;
push: (...items: Array<Request.Entry<NoInfer<A>>>) => number;
concat: { (...items: Array<ConcatArray<Request.Entry<NoInfer<A>>>>): Array<Request.Entry<NoInfer<A>>>; (...items: Array<Request.Entry<NoInfer<A>> | ConcatArray<Request.Entry<NoInfer<A>>>>): Array<Request.Entry<NoInfer<A>>> };
join: (separator?: string) => string;
reverse: () => Array<Request.Entry<NoInfer<A>>>;
shift: () => Request.Entry<NoInfer<A>> | undefined;
slice: (start?: number, end?: number) => Array<Request.Entry<NoInfer<A>>>;
sort: (compareFn?: ((a: Request.Entry<NoInfer<A>>, b: Request.Entry<NoInfer<A>>) => number) | undefined) => [Request.Entry<NoInfer<A>>, ...Request.Entry<NoInfer<A>>[]];
splice: { (start: number, deleteCount?: number): Array<Request.Entry<NoInfer<A>>>; (start: number, deleteCount: number, ...items: Array<Request.Entry<NoInfer<A>>>): Array<Request.Entry<NoInfer<A>>> };
unshift: (...items: Array<Request.Entry<NoInfer<A>>>) => number;
indexOf: (searchElement: Request.Entry<NoInfer<A>>, fromIndex?: number) => number;
lastIndexOf: (searchElement: Request.Entry<NoInfer<A>>, fromIndex?: number) => number;
every: { (predicate: (value: Request.Entry<NoInfer<A>>, index: number, array: Array<Request.Entry<NoInfer<A>>>) => value is S, thisArg?: any): this is S[]; (predicate: (value: Request.Entry<NoInfer<A>>, index: number, array: Array<Request.Entry<N…;
some: (predicate: (value: Request.Entry<NoInfer<A>>, index: number, array: Array<Request.Entry<NoInfer<A>>>) => unknown, thisArg?: any) => boolean;
forEach: (callbackfn: (value: Request.Entry<NoInfer<A>>, index: number, array: Array<Request.Entry<NoInfer<A>>>) => void, thisArg?: any) => void;
map: (callbackfn: (value: Request.Entry<NoInfer<A>>, index: number, array: Array<Request.Entry<NoInfer<A>>>) => U, thisArg?: any) => Array<U>;
filter: { (predicate: (value: Request.Entry<NoInfer<A>>, index: number, array: Array<Request.Entry<NoInfer<A>>>) => value is S, thisArg?: any): Array<S>; (predicate: (value: Request.Entry<NoInfer<A>>, index: number, array: Array<Request.Entry<NoIn…;
reduce: { (callbackfn: (previousValue: Request.Entry<NoInfer<A>>, currentValue: Request.Entry<NoInfer<A>>, currentIndex: number, array: Array<Request.Entry<NoInfer<A>>>) => Request.Entry<NoInfer<A>>): Request.Entry<NoInfer<A>>; (callbackfn: (previ…;
reduceRight: { (callbackfn: (previousValue: Request.Entry<NoInfer<A>>, currentValue: Request.Entry<NoInfer<A>>, currentIndex: number, array: Array<Request.Entry<NoInfer<A>>>) => Request.Entry<NoInfer<A>>): Request.Entry<NoInfer<A>>; (callbackfn: (previ…;
find: { (predicate: (value: Request.Entry<NoInfer<A>>, index: number, obj: Array<Request.Entry<NoInfer<A>>>) => value is S, thisArg?: any): S | undefined; (predicate: (value: Request.Entry<NoInfer<A>>, index: number, obj: Array<Request.Entry<NoI…;
findIndex: (predicate: (value: Request.Entry<NoInfer<A>>, index: number, obj: Array<Request.Entry<NoInfer<A>>>) => unknown, thisArg?: any) => number;
fill: (value: Request.Entry<NoInfer<A>>, start?: number, end?: number) => [Request.Entry<NoInfer<A>>, ...Request.Entry<NoInfer<A>>[]];
copyWithin: (target: number, start: number, end?: number) => [Request.Entry<NoInfer<A>>, ...Request.Entry<NoInfer<A>>[]];
entries: () => ArrayIterator<[number, Request.Entry<NoInfer<A>>]>;
keys: () => ArrayIterator<number>;
values: () => ArrayIterator<Request.Entry<NoInfer<A>>>;
includes: (searchElement: Request.Entry<NoInfer<A>>, fromIndex?: number) => boolean;
flatMap: (callback: (this: This, value: Request.Entry<NoInfer<A>>, index: number, array: Array<Request.Entry<NoInfer<A>>>) => U | ReadonlyArray<U>, thisArg?: This | undefined) => Array<U>;
flat: (this: A, depth?: D | undefined) => Array<FlatArray<A, D>>;
at: (index: number) => Request.Entry<NoInfer<A>> | undefined;
findLast: { (predicate: (value: Request.Entry<NoInfer<A>>, index: number, array: Array<Request.Entry<NoInfer<A>>>) => value is S, thisArg?: any): S | undefined; (predicate: (value: Request.Entry<NoInfer<A>>, index: number, array: Array<Request.Entry…;
findLastIndex: (predicate: (value: Request.Entry<NoInfer<A>>, index: number, array: Array<Request.Entry<NoInfer<A>>>) => unknown, thisArg?: any) => number;
toReversed: () => Array<Request.Entry<NoInfer<A>>>;
toSorted: (compareFn?: ((a: Request.Entry<NoInfer<A>>, b: Request.Entry<NoInfer<A>>) => number) | undefined) => Array<Request.Entry<NoInfer<A>>>;
toSpliced: { (start: number, deleteCount: number, ...items: Array<Request.Entry<NoInfer<A>>>): Array<Request.Entry<NoInfer<A>>>; (start: number, deleteCount?: number): Array<Request.Entry<NoInfer<A>>> };
with: (index: number, value: Request.Entry<NoInfer<A>>) => Array<Request.Entry<NoInfer<A>>>;
}
entries: type NonEmptyArray<A> = [A, ...A[]]A mutable array guaranteed to have at least one element.
When to use
Use when mutation is acceptable and non-emptiness must be tracked at the type
level.
Details
This is the mutable counterpart of
NonEmptyReadonlyArray
. Most Array
module functions return NonEmptyArray when the result is guaranteed
non-empty.
Example (Typing a mutable non-empty array)
import type { Array } from "effect"
const nonEmpty: Array.NonEmptyArray<number> = [1, 2, 3]
nonEmpty.push(4)
NonEmptyArray<import RequestRequest.interface Entry<out R>A pending request handed to a RequestResolver.
Details
An entry contains the original request, the fiber context needed to run it,
an uninterruptible flag used by batching and caching internals, and the
completeUnsafe callback used by resolvers to supply the final Exit.
Entry<type NoInfer<T> = intrinsicMarker for non-inference type position
NoInfer<function (type parameter) A in <A extends Request.Any, A2, X>(self: RequestResolver<A>, before: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>) => Effect.Effect<A2, Request.Error<A>>, after: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>, a: A2) => Effect.Effect<X, Request.Error<A>>): RequestResolver<A>A>>>, a: A2a: function (type parameter) A2 in <A extends Request.Any, A2, X>(self: RequestResolver<A>, before: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>) => Effect.Effect<A2, Request.Error<A>>, after: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>, a: A2) => Effect.Effect<X, Request.Error<A>>): RequestResolver<A>A2) => 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<function (type parameter) X in <A extends Request.Any, A2, X>(self: RequestResolver<A>, before: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>) => Effect.Effect<A2, Request.Error<A>>, after: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>, a: A2) => Effect.Effect<X, Request.Error<A>>): RequestResolver<A>X, import RequestRequest.type Error<
T extends Request.Request<any, any, any>
> = [T] extends [
Request.Request<infer _A, infer _E, infer _R>
]
? _E
: never
A utility type to extract the error type from a Request.
Example (Extracting a request error type)
import type { Request } from "effect"
interface GetUser extends Request.Request<string, Error> {
readonly id: number
}
// Extract the error type from a Request using the utility
type UserError = Request.Error<GetUser> // Error
Error<function (type parameter) A in <A extends Request.Any, A2, X>(self: RequestResolver<A>, before: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>) => Effect.Effect<A2, Request.Error<A>>, after: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>, a: A2) => Effect.Effect<X, Request.Error<A>>): RequestResolver<A>A>>
): interface RequestResolver<in A extends Request.Any>A resolver that executes and completes batched Request entries.
Details
A resolver controls how requests are grouped, delayed, optionally
pre-checked, and finally run. Its runAll method receives a non-empty batch
of Request.Entry values for a single batch key and must complete every
received entry, usually by calling completeUnsafe or one of the Request
completion helpers.
Gotchas
If a resolver finishes without completing an entry, the waiting request fails
because the resolver did not supply a result.
Example (Defining a request resolver)
import { Effect, Exit, RequestResolver } from "effect"
import type { Request } from "effect"
interface GetUserRequest extends Request.Request<string, Error> {
readonly _tag: "GetUserRequest"
readonly id: number
}
// In practice, you would typically use RequestResolver.make() instead
const resolver = RequestResolver.make<GetUserRequest>((entries) =>
Effect.sync(() => {
for (const entry of entries) {
entry.completeUnsafe(Exit.succeed(`User ${entry.request.id}`))
}
})
)
Namespace containing type-level helpers associated with RequestResolver.
RequestResolver<function (type parameter) A in <A extends Request.Any, A2, X>(self: RequestResolver<A>, before: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>) => Effect.Effect<A2, Request.Error<A>>, after: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>, a: A2) => Effect.Effect<X, Request.Error<A>>): RequestResolver<A>A>
} = dual<(...args: Array<any>) => any, <A extends Request.Any, A2, X>(self: RequestResolver<A>, before: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>) => Effect.Effect<A2, Request.Error<A>>, after: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>, a: A2) => Effect.Effect<X, Request.Error<A>>) => RequestResolver<A>>(arity: 3, body: <A extends Request.Any, A2, X>(self: RequestResolver<A>, before: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>) => Effect.Effect<A2, Request.Error<A>>, after: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>, a: A2) => Effect.Effect<X, Request.Error<A>>) => RequestResolver<A>): ((...args: Array<any>) => any) & (<A extends Request.Any, A2, X>(self: RequestResolver<A>, before: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>) => Effect.Effect<A2, Request.Error<A>>, after: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>, a: A2) => Effect.Effect<X, Request.Error<A>>) => RequestResolver<A>) (+1 overload)Creates a function that can be called in data-first style or data-last
(pipe-friendly) style.
When to use
Use to expose one implementation through both direct and pipe-friendly
call styles.
Details
Pass either the arity of the uncurried function or a predicate that decides
whether the current call is data-first. Arity is the common case. Use a
predicate when optional arguments make arity ambiguous.
Example (Selecting data-first or data-last style by arity)
import { Function, pipe } from "effect"
const sum = Function.dual<
(that: number) => (self: number) => number,
(self: number, that: number) => number
>(2, (self, that) => self + that)
console.log(sum(2, 3)) // 5
console.log(pipe(2, sum(3))) // 5
Example (Defining overloads with call signatures)
import { Function, pipe } from "effect"
const sum: {
(that: number): (self: number) => number
(self: number, that: number): number
} = Function.dual(2, (self: number, that: number): number => self + that)
console.log(sum(2, 3)) // 5
console.log(pipe(2, sum(3))) // 5
Example (Selecting data-first or data-last style with a predicate)
import { Function, pipe } from "effect"
const sum = Function.dual<
(that: number) => (self: number) => number,
(self: number, that: number) => number
>(
(args) => args.length === 2,
(self, that) => self + that
)
console.log(sum(2, 3)) // 5
console.log(pipe(2, sum(3))) // 5
dual(3, <function (type parameter) A in <A extends Request.Any, A2, X>(self: RequestResolver<A>, before: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>) => Effect.Effect<A2, Request.Error<A>>, after: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>, a: A2) => Effect.Effect<X, Request.Error<A>>): RequestResolver<A>A extends import RequestRequest.type Any = Request.Request<any, any, any>Alias for any Request, regardless of its success, error, or service
requirements.
When to use
Use as a generic constraint for APIs that accept any request while preserving
each concrete request's success, error, and service types.
Any, function (type parameter) A2 in <A extends Request.Any, A2, X>(self: RequestResolver<A>, before: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>) => Effect.Effect<A2, Request.Error<A>>, after: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>, a: A2) => Effect.Effect<X, Request.Error<A>>): RequestResolver<A>A2, function (type parameter) X in <A extends Request.Any, A2, X>(self: RequestResolver<A>, before: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>) => Effect.Effect<A2, Request.Error<A>>, after: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>, a: A2) => Effect.Effect<X, Request.Error<A>>): RequestResolver<A>X>(
self: RequestResolver<A>(parameter) self: {
delay: Effect.Effect<void>;
batchKey: (entry: Request.Entry<A>) => unknown;
preCheck: ((entry: Request.Entry<A>) => boolean) | undefined;
collectWhile: (entries: ReadonlySet<Request.Entry<A>>) => boolean;
runAll: (entries: [Request.Entry<A>, ...Request.Entry<A>[]], key: unknown) => Effect.Effect<void, Request.Error<A>, never>;
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 RequestResolver<in A extends Request.Any>A resolver that executes and completes batched Request entries.
Details
A resolver controls how requests are grouped, delayed, optionally
pre-checked, and finally run. Its runAll method receives a non-empty batch
of Request.Entry values for a single batch key and must complete every
received entry, usually by calling completeUnsafe or one of the Request
completion helpers.
Gotchas
If a resolver finishes without completing an entry, the waiting request fails
because the resolver did not supply a result.
Example (Defining a request resolver)
import { Effect, Exit, RequestResolver } from "effect"
import type { Request } from "effect"
interface GetUserRequest extends Request.Request<string, Error> {
readonly _tag: "GetUserRequest"
readonly id: number
}
// In practice, you would typically use RequestResolver.make() instead
const resolver = RequestResolver.make<GetUserRequest>((entries) =>
Effect.sync(() => {
for (const entry of entries) {
entry.completeUnsafe(Exit.succeed(`User ${entry.request.id}`))
}
})
)
Namespace containing type-level helpers associated with RequestResolver.
RequestResolver<function (type parameter) A in <A extends Request.Any, A2, X>(self: RequestResolver<A>, before: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>) => Effect.Effect<A2, Request.Error<A>>, after: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>, a: A2) => Effect.Effect<X, Request.Error<A>>): RequestResolver<A>A>,
before: (
entries: NonEmptyArray<
Request.Entry<NoInfer<A>>
>
) => Effect.Effect<A2, Request.Error<A>>
before: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>(parameter) entries: {
0: Request.Entry<NoInfer<A>>;
length: number;
toString: () => string;
toLocaleString: { (): string; (locales: string | string[], options?: Intl.NumberFormatOptions & Intl.DateTimeFormatOptions): string };
pop: () => Request.Entry<NoInfer<A>> | undefined;
push: (...items: Array<Request.Entry<NoInfer<A>>>) => number;
concat: { (...items: Array<ConcatArray<Request.Entry<NoInfer<A>>>>): Array<Request.Entry<NoInfer<A>>>; (...items: Array<Request.Entry<NoInfer<A>> | ConcatArray<Request.Entry<NoInfer<A>>>>): Array<Request.Entry<NoInfer<A>>> };
join: (separator?: string) => string;
reverse: () => Array<Request.Entry<NoInfer<A>>>;
shift: () => Request.Entry<NoInfer<A>> | undefined;
slice: (start?: number, end?: number) => Array<Request.Entry<NoInfer<A>>>;
sort: (compareFn?: ((a: Request.Entry<NoInfer<A>>, b: Request.Entry<NoInfer<A>>) => number) | undefined) => [Request.Entry<NoInfer<A>>, ...Request.Entry<NoInfer<A>>[]];
splice: { (start: number, deleteCount?: number): Array<Request.Entry<NoInfer<A>>>; (start: number, deleteCount: number, ...items: Array<Request.Entry<NoInfer<A>>>): Array<Request.Entry<NoInfer<A>>> };
unshift: (...items: Array<Request.Entry<NoInfer<A>>>) => number;
indexOf: (searchElement: Request.Entry<NoInfer<A>>, fromIndex?: number) => number;
lastIndexOf: (searchElement: Request.Entry<NoInfer<A>>, fromIndex?: number) => number;
every: { (predicate: (value: Request.Entry<NoInfer<A>>, index: number, array: Array<Request.Entry<NoInfer<A>>>) => value is S, thisArg?: any): this is S[]; (predicate: (value: Request.Entry<NoInfer<A>>, index: number, array: Array<Request.Entry<N…;
some: (predicate: (value: Request.Entry<NoInfer<A>>, index: number, array: Array<Request.Entry<NoInfer<A>>>) => unknown, thisArg?: any) => boolean;
forEach: (callbackfn: (value: Request.Entry<NoInfer<A>>, index: number, array: Array<Request.Entry<NoInfer<A>>>) => void, thisArg?: any) => void;
map: (callbackfn: (value: Request.Entry<NoInfer<A>>, index: number, array: Array<Request.Entry<NoInfer<A>>>) => U, thisArg?: any) => Array<U>;
filter: { (predicate: (value: Request.Entry<NoInfer<A>>, index: number, array: Array<Request.Entry<NoInfer<A>>>) => value is S, thisArg?: any): Array<S>; (predicate: (value: Request.Entry<NoInfer<A>>, index: number, array: Array<Request.Entry<NoIn…;
reduce: { (callbackfn: (previousValue: Request.Entry<NoInfer<A>>, currentValue: Request.Entry<NoInfer<A>>, currentIndex: number, array: Array<Request.Entry<NoInfer<A>>>) => Request.Entry<NoInfer<A>>): Request.Entry<NoInfer<A>>; (callbackfn: (previ…;
reduceRight: { (callbackfn: (previousValue: Request.Entry<NoInfer<A>>, currentValue: Request.Entry<NoInfer<A>>, currentIndex: number, array: Array<Request.Entry<NoInfer<A>>>) => Request.Entry<NoInfer<A>>): Request.Entry<NoInfer<A>>; (callbackfn: (previ…;
find: { (predicate: (value: Request.Entry<NoInfer<A>>, index: number, obj: Array<Request.Entry<NoInfer<A>>>) => value is S, thisArg?: any): S | undefined; (predicate: (value: Request.Entry<NoInfer<A>>, index: number, obj: Array<Request.Entry<NoI…;
findIndex: (predicate: (value: Request.Entry<NoInfer<A>>, index: number, obj: Array<Request.Entry<NoInfer<A>>>) => unknown, thisArg?: any) => number;
fill: (value: Request.Entry<NoInfer<A>>, start?: number, end?: number) => [Request.Entry<NoInfer<A>>, ...Request.Entry<NoInfer<A>>[]];
copyWithin: (target: number, start: number, end?: number) => [Request.Entry<NoInfer<A>>, ...Request.Entry<NoInfer<A>>[]];
entries: () => ArrayIterator<[number, Request.Entry<NoInfer<A>>]>;
keys: () => ArrayIterator<number>;
values: () => ArrayIterator<Request.Entry<NoInfer<A>>>;
includes: (searchElement: Request.Entry<NoInfer<A>>, fromIndex?: number) => boolean;
flatMap: (callback: (this: This, value: Request.Entry<NoInfer<A>>, index: number, array: Array<Request.Entry<NoInfer<A>>>) => U | ReadonlyArray<U>, thisArg?: This | undefined) => Array<U>;
flat: (this: A, depth?: D | undefined) => Array<FlatArray<A, D>>;
at: (index: number) => Request.Entry<NoInfer<A>> | undefined;
findLast: { (predicate: (value: Request.Entry<NoInfer<A>>, index: number, array: Array<Request.Entry<NoInfer<A>>>) => value is S, thisArg?: any): S | undefined; (predicate: (value: Request.Entry<NoInfer<A>>, index: number, array: Array<Request.Entry…;
findLastIndex: (predicate: (value: Request.Entry<NoInfer<A>>, index: number, array: Array<Request.Entry<NoInfer<A>>>) => unknown, thisArg?: any) => number;
toReversed: () => Array<Request.Entry<NoInfer<A>>>;
toSorted: (compareFn?: ((a: Request.Entry<NoInfer<A>>, b: Request.Entry<NoInfer<A>>) => number) | undefined) => Array<Request.Entry<NoInfer<A>>>;
toSpliced: { (start: number, deleteCount: number, ...items: Array<Request.Entry<NoInfer<A>>>): Array<Request.Entry<NoInfer<A>>>; (start: number, deleteCount?: number): Array<Request.Entry<NoInfer<A>>> };
with: (index: number, value: Request.Entry<NoInfer<A>>) => Array<Request.Entry<NoInfer<A>>>;
}
entries: type NonEmptyArray<A> = [A, ...A[]]A mutable array guaranteed to have at least one element.
When to use
Use when mutation is acceptable and non-emptiness must be tracked at the type
level.
Details
This is the mutable counterpart of
NonEmptyReadonlyArray
. Most Array
module functions return NonEmptyArray when the result is guaranteed
non-empty.
Example (Typing a mutable non-empty array)
import type { Array } from "effect"
const nonEmpty: Array.NonEmptyArray<number> = [1, 2, 3]
nonEmpty.push(4)
NonEmptyArray<import RequestRequest.interface Entry<out R>A pending request handed to a RequestResolver.
Details
An entry contains the original request, the fiber context needed to run it,
an uninterruptible flag used by batching and caching internals, and the
completeUnsafe callback used by resolvers to supply the final Exit.
Entry<type NoInfer<T> = intrinsicMarker for non-inference type position
NoInfer<function (type parameter) A in <A extends Request.Any, A2, X>(self: RequestResolver<A>, before: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>) => Effect.Effect<A2, Request.Error<A>>, after: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>, a: A2) => Effect.Effect<X, Request.Error<A>>): RequestResolver<A>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<function (type parameter) A2 in <A extends Request.Any, A2, X>(self: RequestResolver<A>, before: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>) => Effect.Effect<A2, Request.Error<A>>, after: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>, a: A2) => Effect.Effect<X, Request.Error<A>>): RequestResolver<A>A2, import RequestRequest.type Error<
T extends Request.Request<any, any, any>
> = [T] extends [
Request.Request<infer _A, infer _E, infer _R>
]
? _E
: never
A utility type to extract the error type from a Request.
Example (Extracting a request error type)
import type { Request } from "effect"
interface GetUser extends Request.Request<string, Error> {
readonly id: number
}
// Extract the error type from a Request using the utility
type UserError = Request.Error<GetUser> // Error
Error<function (type parameter) A in <A extends Request.Any, A2, X>(self: RequestResolver<A>, before: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>) => Effect.Effect<A2, Request.Error<A>>, after: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>, a: A2) => Effect.Effect<X, Request.Error<A>>): RequestResolver<A>A>>,
after: (
entries: NonEmptyArray<
Request.Entry<NoInfer<A>>
>,
a: A2
) => Effect.Effect<X, Request.Error<A>>
after: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>(parameter) entries: {
0: Request.Entry<NoInfer<A>>;
length: number;
toString: () => string;
toLocaleString: { (): string; (locales: string | string[], options?: Intl.NumberFormatOptions & Intl.DateTimeFormatOptions): string };
pop: () => Request.Entry<NoInfer<A>> | undefined;
push: (...items: Array<Request.Entry<NoInfer<A>>>) => number;
concat: { (...items: Array<ConcatArray<Request.Entry<NoInfer<A>>>>): Array<Request.Entry<NoInfer<A>>>; (...items: Array<Request.Entry<NoInfer<A>> | ConcatArray<Request.Entry<NoInfer<A>>>>): Array<Request.Entry<NoInfer<A>>> };
join: (separator?: string) => string;
reverse: () => Array<Request.Entry<NoInfer<A>>>;
shift: () => Request.Entry<NoInfer<A>> | undefined;
slice: (start?: number, end?: number) => Array<Request.Entry<NoInfer<A>>>;
sort: (compareFn?: ((a: Request.Entry<NoInfer<A>>, b: Request.Entry<NoInfer<A>>) => number) | undefined) => [Request.Entry<NoInfer<A>>, ...Request.Entry<NoInfer<A>>[]];
splice: { (start: number, deleteCount?: number): Array<Request.Entry<NoInfer<A>>>; (start: number, deleteCount: number, ...items: Array<Request.Entry<NoInfer<A>>>): Array<Request.Entry<NoInfer<A>>> };
unshift: (...items: Array<Request.Entry<NoInfer<A>>>) => number;
indexOf: (searchElement: Request.Entry<NoInfer<A>>, fromIndex?: number) => number;
lastIndexOf: (searchElement: Request.Entry<NoInfer<A>>, fromIndex?: number) => number;
every: { (predicate: (value: Request.Entry<NoInfer<A>>, index: number, array: Array<Request.Entry<NoInfer<A>>>) => value is S, thisArg?: any): this is S[]; (predicate: (value: Request.Entry<NoInfer<A>>, index: number, array: Array<Request.Entry<N…;
some: (predicate: (value: Request.Entry<NoInfer<A>>, index: number, array: Array<Request.Entry<NoInfer<A>>>) => unknown, thisArg?: any) => boolean;
forEach: (callbackfn: (value: Request.Entry<NoInfer<A>>, index: number, array: Array<Request.Entry<NoInfer<A>>>) => void, thisArg?: any) => void;
map: (callbackfn: (value: Request.Entry<NoInfer<A>>, index: number, array: Array<Request.Entry<NoInfer<A>>>) => U, thisArg?: any) => Array<U>;
filter: { (predicate: (value: Request.Entry<NoInfer<A>>, index: number, array: Array<Request.Entry<NoInfer<A>>>) => value is S, thisArg?: any): Array<S>; (predicate: (value: Request.Entry<NoInfer<A>>, index: number, array: Array<Request.Entry<NoIn…;
reduce: { (callbackfn: (previousValue: Request.Entry<NoInfer<A>>, currentValue: Request.Entry<NoInfer<A>>, currentIndex: number, array: Array<Request.Entry<NoInfer<A>>>) => Request.Entry<NoInfer<A>>): Request.Entry<NoInfer<A>>; (callbackfn: (previ…;
reduceRight: { (callbackfn: (previousValue: Request.Entry<NoInfer<A>>, currentValue: Request.Entry<NoInfer<A>>, currentIndex: number, array: Array<Request.Entry<NoInfer<A>>>) => Request.Entry<NoInfer<A>>): Request.Entry<NoInfer<A>>; (callbackfn: (previ…;
find: { (predicate: (value: Request.Entry<NoInfer<A>>, index: number, obj: Array<Request.Entry<NoInfer<A>>>) => value is S, thisArg?: any): S | undefined; (predicate: (value: Request.Entry<NoInfer<A>>, index: number, obj: Array<Request.Entry<NoI…;
findIndex: (predicate: (value: Request.Entry<NoInfer<A>>, index: number, obj: Array<Request.Entry<NoInfer<A>>>) => unknown, thisArg?: any) => number;
fill: (value: Request.Entry<NoInfer<A>>, start?: number, end?: number) => [Request.Entry<NoInfer<A>>, ...Request.Entry<NoInfer<A>>[]];
copyWithin: (target: number, start: number, end?: number) => [Request.Entry<NoInfer<A>>, ...Request.Entry<NoInfer<A>>[]];
entries: () => ArrayIterator<[number, Request.Entry<NoInfer<A>>]>;
keys: () => ArrayIterator<number>;
values: () => ArrayIterator<Request.Entry<NoInfer<A>>>;
includes: (searchElement: Request.Entry<NoInfer<A>>, fromIndex?: number) => boolean;
flatMap: (callback: (this: This, value: Request.Entry<NoInfer<A>>, index: number, array: Array<Request.Entry<NoInfer<A>>>) => U | ReadonlyArray<U>, thisArg?: This | undefined) => Array<U>;
flat: (this: A, depth?: D | undefined) => Array<FlatArray<A, D>>;
at: (index: number) => Request.Entry<NoInfer<A>> | undefined;
findLast: { (predicate: (value: Request.Entry<NoInfer<A>>, index: number, array: Array<Request.Entry<NoInfer<A>>>) => value is S, thisArg?: any): S | undefined; (predicate: (value: Request.Entry<NoInfer<A>>, index: number, array: Array<Request.Entry…;
findLastIndex: (predicate: (value: Request.Entry<NoInfer<A>>, index: number, array: Array<Request.Entry<NoInfer<A>>>) => unknown, thisArg?: any) => number;
toReversed: () => Array<Request.Entry<NoInfer<A>>>;
toSorted: (compareFn?: ((a: Request.Entry<NoInfer<A>>, b: Request.Entry<NoInfer<A>>) => number) | undefined) => Array<Request.Entry<NoInfer<A>>>;
toSpliced: { (start: number, deleteCount: number, ...items: Array<Request.Entry<NoInfer<A>>>): Array<Request.Entry<NoInfer<A>>>; (start: number, deleteCount?: number): Array<Request.Entry<NoInfer<A>>> };
with: (index: number, value: Request.Entry<NoInfer<A>>) => Array<Request.Entry<NoInfer<A>>>;
}
entries: type NonEmptyArray<A> = [A, ...A[]]A mutable array guaranteed to have at least one element.
When to use
Use when mutation is acceptable and non-emptiness must be tracked at the type
level.
Details
This is the mutable counterpart of
NonEmptyReadonlyArray
. Most Array
module functions return NonEmptyArray when the result is guaranteed
non-empty.
Example (Typing a mutable non-empty array)
import type { Array } from "effect"
const nonEmpty: Array.NonEmptyArray<number> = [1, 2, 3]
nonEmpty.push(4)
NonEmptyArray<import RequestRequest.interface Entry<out R>A pending request handed to a RequestResolver.
Details
An entry contains the original request, the fiber context needed to run it,
an uninterruptible flag used by batching and caching internals, and the
completeUnsafe callback used by resolvers to supply the final Exit.
Entry<type NoInfer<T> = intrinsicMarker for non-inference type position
NoInfer<function (type parameter) A in <A extends Request.Any, A2, X>(self: RequestResolver<A>, before: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>) => Effect.Effect<A2, Request.Error<A>>, after: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>, a: A2) => Effect.Effect<X, Request.Error<A>>): RequestResolver<A>A>>>, a: A2a: function (type parameter) A2 in <A extends Request.Any, A2, X>(self: RequestResolver<A>, before: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>) => Effect.Effect<A2, Request.Error<A>>, after: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>, a: A2) => Effect.Effect<X, Request.Error<A>>): RequestResolver<A>A2) => 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<function (type parameter) X in <A extends Request.Any, A2, X>(self: RequestResolver<A>, before: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>) => Effect.Effect<A2, Request.Error<A>>, after: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>, a: A2) => Effect.Effect<X, Request.Error<A>>): RequestResolver<A>X, import RequestRequest.type Error<
T extends Request.Request<any, any, any>
> = [T] extends [
Request.Request<infer _A, infer _E, infer _R>
]
? _E
: never
A utility type to extract the error type from a Request.
Example (Extracting a request error type)
import type { Request } from "effect"
interface GetUser extends Request.Request<string, Error> {
readonly id: number
}
// Extract the error type from a Request using the utility
type UserError = Request.Error<GetUser> // Error
Error<function (type parameter) A in <A extends Request.Any, A2, X>(self: RequestResolver<A>, before: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>) => Effect.Effect<A2, Request.Error<A>>, after: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>, a: A2) => Effect.Effect<X, Request.Error<A>>): RequestResolver<A>A>>
): interface RequestResolver<in A extends Request.Any>A resolver that executes and completes batched Request entries.
Details
A resolver controls how requests are grouped, delayed, optionally
pre-checked, and finally run. Its runAll method receives a non-empty batch
of Request.Entry values for a single batch key and must complete every
received entry, usually by calling completeUnsafe or one of the Request
completion helpers.
Gotchas
If a resolver finishes without completing an entry, the waiting request fails
because the resolver did not supply a result.
Example (Defining a request resolver)
import { Effect, Exit, RequestResolver } from "effect"
import type { Request } from "effect"
interface GetUserRequest extends Request.Request<string, Error> {
readonly _tag: "GetUserRequest"
readonly id: number
}
// In practice, you would typically use RequestResolver.make() instead
const resolver = RequestResolver.make<GetUserRequest>((entries) =>
Effect.sync(() => {
for (const entry of entries) {
entry.completeUnsafe(Exit.succeed(`User ${entry.request.id}`))
}
})
)
Namespace containing type-level helpers associated with RequestResolver.
RequestResolver<function (type parameter) A in <A extends Request.Any, A2, X>(self: RequestResolver<A>, before: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>) => Effect.Effect<A2, Request.Error<A>>, after: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>, a: A2) => Effect.Effect<X, Request.Error<A>>): RequestResolver<A>A> =>
const makeWith: <
A extends Request.Any
>(options: {
readonly batchKey: (
request: Request.Entry<A>
) => unknown
readonly preCheck?:
| ((entry: Request.Entry<A>) => boolean)
| undefined
readonly delay: Effect.Effect<void>
readonly collectWhile: (
requests: ReadonlySet<Request.Entry<A>>
) => boolean
readonly runAll: (
entries: NonEmptyArray<Request.Entry<A>>,
key: unknown
) => Effect.Effect<void, Request.Error<A>>
}) => RequestResolver<A>
Creates a request resolver with fine-grained
control over its behavior.
When to use
Use when you need to supply the resolver batching primitives directly,
including the batch key, optional pre-check, delay effect, collection cutoff,
and batch runner.
Details
batchKey groups request entries, delay schedules batch execution,
collectWhile can end collection early, and runAll receives a non-empty
batch for one key.
Gotchas
Accepted entries must be completed. If runAll succeeds with incomplete
entries, waiting requests fail. If preCheck returns false, the entry is
not batched, so it must be completed or linked to another completion path.
makeWith({
...self: RequestResolver<A>(parameter) self: {
delay: Effect.Effect<void>;
batchKey: (entry: Request.Entry<A>) => unknown;
preCheck: ((entry: Request.Entry<A>) => boolean) | undefined;
collectWhile: (entries: ReadonlySet<Request.Entry<A>>) => boolean;
runAll: (entries: [Request.Entry<A>, ...Request.Entry<A>[]], key: unknown) => Effect.Effect<void, Request.Error<A>, never>;
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,
runAll: (
entries: [
Request.Entry<A>,
...Request.Entry<A>[]
],
key: unknown
) => Effect.Effect<void, Request.Error<A>, never>
runAll: (entries: [
Request.Entry<A>,
...Request.Entry<A>[]
]
(parameter) entries: {
0: Request.Entry<A>;
length: number;
toString: () => string;
toLocaleString: { (): string; (locales: string | string[], options?: Intl.NumberFormatOptions & Intl.DateTimeFormatOptions): string };
pop: () => Request.Entry<A> | undefined;
push: (...items: Array<Request.Entry<A>>) => number;
concat: { (...items: Array<ConcatArray<Request.Entry<A>>>): Array<Request.Entry<A>>; (...items: Array<Request.Entry<A> | ConcatArray<Request.Entry<A>>>): Array<Request.Entry<A>> };
join: (separator?: string) => string;
reverse: () => Array<Request.Entry<A>>;
shift: () => Request.Entry<A> | undefined;
slice: (start?: number, end?: number) => Array<Request.Entry<A>>;
sort: (compareFn?: ((a: Request.Entry<A>, b: Request.Entry<A>) => number) | undefined) => [Request.Entry<A>, ...Request.Entry<A>[]];
splice: { (start: number, deleteCount?: number): Array<Request.Entry<A>>; (start: number, deleteCount: number, ...items: Array<Request.Entry<A>>): Array<Request.Entry<A>> };
unshift: (...items: Array<Request.Entry<A>>) => number;
indexOf: (searchElement: Request.Entry<A>, fromIndex?: number) => number;
lastIndexOf: (searchElement: Request.Entry<A>, fromIndex?: number) => number;
every: { (predicate: (value: Request.Entry<A>, index: number, array: Array<Request.Entry<A>>) => value is S, thisArg?: any): this is S[]; (predicate: (value: Request.Entry<A>, index: number, array: Array<Request.Entry<A>>) => unknown, thisArg?: a…;
some: (predicate: (value: Request.Entry<A>, index: number, array: Array<Request.Entry<A>>) => unknown, thisArg?: any) => boolean;
forEach: (callbackfn: (value: Request.Entry<A>, index: number, array: Array<Request.Entry<A>>) => void, thisArg?: any) => void;
map: (callbackfn: (value: Request.Entry<A>, index: number, array: Array<Request.Entry<A>>) => U, thisArg?: any) => Array<U>;
filter: { (predicate: (value: Request.Entry<A>, index: number, array: Array<Request.Entry<A>>) => value is S, thisArg?: any): Array<S>; (predicate: (value: Request.Entry<A>, index: number, array: Array<Request.Entry<A>>) => unknown, thisArg?: any)…;
reduce: { (callbackfn: (previousValue: Request.Entry<A>, currentValue: Request.Entry<A>, currentIndex: number, array: Array<Request.Entry<A>>) => Request.Entry<A>): Request.Entry<A>; (callbackfn: (previousValue: Request.Entry<A>, currentValue: Req…;
reduceRight: { (callbackfn: (previousValue: Request.Entry<A>, currentValue: Request.Entry<A>, currentIndex: number, array: Array<Request.Entry<A>>) => Request.Entry<A>): Request.Entry<A>; (callbackfn: (previousValue: Request.Entry<A>, currentValue: Req…;
find: { (predicate: (value: Request.Entry<A>, index: number, obj: Array<Request.Entry<A>>) => value is S, thisArg?: any): S | undefined; (predicate: (value: Request.Entry<A>, index: number, obj: Array<Request.Entry<A>>) => unknown, thisArg?: any…;
findIndex: (predicate: (value: Request.Entry<A>, index: number, obj: Array<Request.Entry<A>>) => unknown, thisArg?: any) => number;
fill: (value: Request.Entry<A>, start?: number, end?: number) => [Request.Entry<A>, ...Request.Entry<A>[]];
copyWithin: (target: number, start: number, end?: number) => [Request.Entry<A>, ...Request.Entry<A>[]];
entries: () => ArrayIterator<[number, Request.Entry<A>]>;
keys: () => ArrayIterator<number>;
values: () => ArrayIterator<Request.Entry<A>>;
includes: (searchElement: Request.Entry<A>, fromIndex?: number) => boolean;
flatMap: (callback: (this: This, value: Request.Entry<A>, index: number, array: Array<Request.Entry<A>>) => U | ReadonlyArray<U>, thisArg?: This | undefined) => Array<U>;
flat: (this: A, depth?: D | undefined) => Array<FlatArray<A, D>>;
at: (index: number) => Request.Entry<A> | undefined;
findLast: { (predicate: (value: Request.Entry<A>, index: number, array: Array<Request.Entry<A>>) => value is S, thisArg?: any): S | undefined; (predicate: (value: Request.Entry<A>, index: number, array: Array<Request.Entry<A>>) => unknown, thisArg?:…;
findLastIndex: (predicate: (value: Request.Entry<A>, index: number, array: Array<Request.Entry<A>>) => unknown, thisArg?: any) => number;
toReversed: () => Array<Request.Entry<A>>;
toSorted: (compareFn?: ((a: Request.Entry<A>, b: Request.Entry<A>) => number) | undefined) => Array<Request.Entry<A>>;
toSpliced: { (start: number, deleteCount: number, ...items: Array<Request.Entry<A>>): Array<Request.Entry<A>>; (start: number, deleteCount?: number): Array<Request.Entry<A>> };
with: (index: number, value: Request.Entry<A>) => Array<Request.Entry<A>>;
}
entries, key: unknownkey) =>
import EffectEffect.const acquireUseRelease: <
Resource,
E,
R,
A,
E2,
R2,
E3,
R3
>(
acquire: Effect<Resource, E, R>,
use: (a: Resource) => Effect<A, E2, R2>,
release: (
a: Resource,
exit: Exit.Exit<A, E2>
) => Effect<void, E3, R3>
) => Effect<A, E | E2 | E3, R | R2 | R3>
Runs resource acquisition, usage, and release as one bracketed effect.
When to use
Use to bracket acquire, use, and release logic in one effect.
Details
acquireUseRelease does the following:
- Ensures that the
Effect value that acquires the resource will not be
interrupted. Note that acquisition may still fail due to internal
reasons (such as an uncaught exception).
- Ensures that the
release Effect value will not be interrupted,
and will be executed as long as the acquisition Effect value
successfully acquires the resource.
During the time period between the acquisition and release of the resource,
the use Effect value will be executed.
If the release Effect value fails, then the entire Effect value will
fail, even if the use Effect value succeeds. If this fail-fast behavior
is not desired, errors produced by the release Effect value can be caught
and ignored.
Example (Acquiring resources with cleanup)
import { Console, Effect, Exit } from "effect"
interface Database {
readonly connection: string
readonly query: (sql: string) => Effect.Effect<string>
}
const program = Effect.acquireUseRelease(
// Acquire - connect to database
Effect.gen(function*() {
yield* Console.log("Connecting to database...")
return {
connection: "db://localhost:5432",
query: (sql: string) => Effect.succeed(`Result for: ${sql}`)
}
}),
// Use - perform database operations
(db) =>
Effect.gen(function*() {
yield* Console.log(`Connected to ${db.connection}`)
const result = yield* db.query("SELECT * FROM users")
yield* Console.log(`Query result: ${result}`)
return result
}),
// Release - close database connection
(db, exit) =>
Effect.gen(function*() {
if (Exit.isSuccess(exit)) {
yield* Console.log(`Closing connection to ${db.connection} (success)`)
} else {
yield* Console.log(`Closing connection to ${db.connection} (failure)`)
}
})
)
Effect.runPromise(program)
// Output:
// Connecting to database...
// Connected to db://localhost:5432
// Query result: Result for: SELECT * FROM users
// Closing connection to db://localhost:5432 (success)
acquireUseRelease(
before: (
entries: NonEmptyArray<
Request.Entry<NoInfer<A>>
>
) => Effect.Effect<A2, Request.Error<A>>
before(entries: [
Request.Entry<A>,
...Request.Entry<A>[]
]
(parameter) entries: {
0: Request.Entry<A>;
length: number;
toString: () => string;
toLocaleString: { (): string; (locales: string | string[], options?: Intl.NumberFormatOptions & Intl.DateTimeFormatOptions): string };
pop: () => Request.Entry<A> | undefined;
push: (...items: Array<Request.Entry<A>>) => number;
concat: { (...items: Array<ConcatArray<Request.Entry<A>>>): Array<Request.Entry<A>>; (...items: Array<Request.Entry<A> | ConcatArray<Request.Entry<A>>>): Array<Request.Entry<A>> };
join: (separator?: string) => string;
reverse: () => Array<Request.Entry<A>>;
shift: () => Request.Entry<A> | undefined;
slice: (start?: number, end?: number) => Array<Request.Entry<A>>;
sort: (compareFn?: ((a: Request.Entry<A>, b: Request.Entry<A>) => number) | undefined) => [Request.Entry<A>, ...Request.Entry<A>[]];
splice: { (start: number, deleteCount?: number): Array<Request.Entry<A>>; (start: number, deleteCount: number, ...items: Array<Request.Entry<A>>): Array<Request.Entry<A>> };
unshift: (...items: Array<Request.Entry<A>>) => number;
indexOf: (searchElement: Request.Entry<A>, fromIndex?: number) => number;
lastIndexOf: (searchElement: Request.Entry<A>, fromIndex?: number) => number;
every: { (predicate: (value: Request.Entry<A>, index: number, array: Array<Request.Entry<A>>) => value is S, thisArg?: any): this is S[]; (predicate: (value: Request.Entry<A>, index: number, array: Array<Request.Entry<A>>) => unknown, thisArg?: a…;
some: (predicate: (value: Request.Entry<A>, index: number, array: Array<Request.Entry<A>>) => unknown, thisArg?: any) => boolean;
forEach: (callbackfn: (value: Request.Entry<A>, index: number, array: Array<Request.Entry<A>>) => void, thisArg?: any) => void;
map: (callbackfn: (value: Request.Entry<A>, index: number, array: Array<Request.Entry<A>>) => U, thisArg?: any) => Array<U>;
filter: { (predicate: (value: Request.Entry<A>, index: number, array: Array<Request.Entry<A>>) => value is S, thisArg?: any): Array<S>; (predicate: (value: Request.Entry<A>, index: number, array: Array<Request.Entry<A>>) => unknown, thisArg?: any)…;
reduce: { (callbackfn: (previousValue: Request.Entry<A>, currentValue: Request.Entry<A>, currentIndex: number, array: Array<Request.Entry<A>>) => Request.Entry<A>): Request.Entry<A>; (callbackfn: (previousValue: Request.Entry<A>, currentValue: Req…;
reduceRight: { (callbackfn: (previousValue: Request.Entry<A>, currentValue: Request.Entry<A>, currentIndex: number, array: Array<Request.Entry<A>>) => Request.Entry<A>): Request.Entry<A>; (callbackfn: (previousValue: Request.Entry<A>, currentValue: Req…;
find: { (predicate: (value: Request.Entry<A>, index: number, obj: Array<Request.Entry<A>>) => value is S, thisArg?: any): S | undefined; (predicate: (value: Request.Entry<A>, index: number, obj: Array<Request.Entry<A>>) => unknown, thisArg?: any…;
findIndex: (predicate: (value: Request.Entry<A>, index: number, obj: Array<Request.Entry<A>>) => unknown, thisArg?: any) => number;
fill: (value: Request.Entry<A>, start?: number, end?: number) => [Request.Entry<A>, ...Request.Entry<A>[]];
copyWithin: (target: number, start: number, end?: number) => [Request.Entry<A>, ...Request.Entry<A>[]];
entries: () => ArrayIterator<[number, Request.Entry<A>]>;
keys: () => ArrayIterator<number>;
values: () => ArrayIterator<Request.Entry<A>>;
includes: (searchElement: Request.Entry<A>, fromIndex?: number) => boolean;
flatMap: (callback: (this: This, value: Request.Entry<A>, index: number, array: Array<Request.Entry<A>>) => U | ReadonlyArray<U>, thisArg?: This | undefined) => Array<U>;
flat: (this: A, depth?: D | undefined) => Array<FlatArray<A, D>>;
at: (index: number) => Request.Entry<A> | undefined;
findLast: { (predicate: (value: Request.Entry<A>, index: number, array: Array<Request.Entry<A>>) => value is S, thisArg?: any): S | undefined; (predicate: (value: Request.Entry<A>, index: number, array: Array<Request.Entry<A>>) => unknown, thisArg?:…;
findLastIndex: (predicate: (value: Request.Entry<A>, index: number, array: Array<Request.Entry<A>>) => unknown, thisArg?: any) => number;
toReversed: () => Array<Request.Entry<A>>;
toSorted: (compareFn?: ((a: Request.Entry<A>, b: Request.Entry<A>) => number) | undefined) => Array<Request.Entry<A>>;
toSpliced: { (start: number, deleteCount: number, ...items: Array<Request.Entry<A>>): Array<Request.Entry<A>>; (start: number, deleteCount?: number): Array<Request.Entry<A>> };
with: (index: number, value: Request.Entry<A>) => Array<Request.Entry<A>>;
}
entries),
() => self: RequestResolver<A>(parameter) self: {
delay: Effect.Effect<void>;
batchKey: (entry: Request.Entry<A>) => unknown;
preCheck: ((entry: Request.Entry<A>) => boolean) | undefined;
collectWhile: (entries: ReadonlySet<Request.Entry<A>>) => boolean;
runAll: (entries: [Request.Entry<A>, ...Request.Entry<A>[]], key: unknown) => Effect.Effect<void, Request.Error<A>, never>;
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.RequestResolver<A>.runAll(entries: [Request.Entry<A>, ...Request.Entry<A>[]], key: unknown): Effect.Effect<void, Request.Error<A>, never>Execute a collection of requests.
runAll(entries: [
Request.Entry<A>,
...Request.Entry<A>[]
]
(parameter) entries: {
0: Request.Entry<A>;
length: number;
toString: () => string;
toLocaleString: { (): string; (locales: string | string[], options?: Intl.NumberFormatOptions & Intl.DateTimeFormatOptions): string };
pop: () => Request.Entry<A> | undefined;
push: (...items: Array<Request.Entry<A>>) => number;
concat: { (...items: Array<ConcatArray<Request.Entry<A>>>): Array<Request.Entry<A>>; (...items: Array<Request.Entry<A> | ConcatArray<Request.Entry<A>>>): Array<Request.Entry<A>> };
join: (separator?: string) => string;
reverse: () => Array<Request.Entry<A>>;
shift: () => Request.Entry<A> | undefined;
slice: (start?: number, end?: number) => Array<Request.Entry<A>>;
sort: (compareFn?: ((a: Request.Entry<A>, b: Request.Entry<A>) => number) | undefined) => [Request.Entry<A>, ...Request.Entry<A>[]];
splice: { (start: number, deleteCount?: number): Array<Request.Entry<A>>; (start: number, deleteCount: number, ...items: Array<Request.Entry<A>>): Array<Request.Entry<A>> };
unshift: (...items: Array<Request.Entry<A>>) => number;
indexOf: (searchElement: Request.Entry<A>, fromIndex?: number) => number;
lastIndexOf: (searchElement: Request.Entry<A>, fromIndex?: number) => number;
every: { (predicate: (value: Request.Entry<A>, index: number, array: Array<Request.Entry<A>>) => value is S, thisArg?: any): this is S[]; (predicate: (value: Request.Entry<A>, index: number, array: Array<Request.Entry<A>>) => unknown, thisArg?: a…;
some: (predicate: (value: Request.Entry<A>, index: number, array: Array<Request.Entry<A>>) => unknown, thisArg?: any) => boolean;
forEach: (callbackfn: (value: Request.Entry<A>, index: number, array: Array<Request.Entry<A>>) => void, thisArg?: any) => void;
map: (callbackfn: (value: Request.Entry<A>, index: number, array: Array<Request.Entry<A>>) => U, thisArg?: any) => Array<U>;
filter: { (predicate: (value: Request.Entry<A>, index: number, array: Array<Request.Entry<A>>) => value is S, thisArg?: any): Array<S>; (predicate: (value: Request.Entry<A>, index: number, array: Array<Request.Entry<A>>) => unknown, thisArg?: any)…;
reduce: { (callbackfn: (previousValue: Request.Entry<A>, currentValue: Request.Entry<A>, currentIndex: number, array: Array<Request.Entry<A>>) => Request.Entry<A>): Request.Entry<A>; (callbackfn: (previousValue: Request.Entry<A>, currentValue: Req…;
reduceRight: { (callbackfn: (previousValue: Request.Entry<A>, currentValue: Request.Entry<A>, currentIndex: number, array: Array<Request.Entry<A>>) => Request.Entry<A>): Request.Entry<A>; (callbackfn: (previousValue: Request.Entry<A>, currentValue: Req…;
find: { (predicate: (value: Request.Entry<A>, index: number, obj: Array<Request.Entry<A>>) => value is S, thisArg?: any): S | undefined; (predicate: (value: Request.Entry<A>, index: number, obj: Array<Request.Entry<A>>) => unknown, thisArg?: any…;
findIndex: (predicate: (value: Request.Entry<A>, index: number, obj: Array<Request.Entry<A>>) => unknown, thisArg?: any) => number;
fill: (value: Request.Entry<A>, start?: number, end?: number) => [Request.Entry<A>, ...Request.Entry<A>[]];
copyWithin: (target: number, start: number, end?: number) => [Request.Entry<A>, ...Request.Entry<A>[]];
entries: () => ArrayIterator<[number, Request.Entry<A>]>;
keys: () => ArrayIterator<number>;
values: () => ArrayIterator<Request.Entry<A>>;
includes: (searchElement: Request.Entry<A>, fromIndex?: number) => boolean;
flatMap: (callback: (this: This, value: Request.Entry<A>, index: number, array: Array<Request.Entry<A>>) => U | ReadonlyArray<U>, thisArg?: This | undefined) => Array<U>;
flat: (this: A, depth?: D | undefined) => Array<FlatArray<A, D>>;
at: (index: number) => Request.Entry<A> | undefined;
findLast: { (predicate: (value: Request.Entry<A>, index: number, array: Array<Request.Entry<A>>) => value is S, thisArg?: any): S | undefined; (predicate: (value: Request.Entry<A>, index: number, array: Array<Request.Entry<A>>) => unknown, thisArg?:…;
findLastIndex: (predicate: (value: Request.Entry<A>, index: number, array: Array<Request.Entry<A>>) => unknown, thisArg?: any) => number;
toReversed: () => Array<Request.Entry<A>>;
toSorted: (compareFn?: ((a: Request.Entry<A>, b: Request.Entry<A>) => number) | undefined) => Array<Request.Entry<A>>;
toSpliced: { (start: number, deleteCount: number, ...items: Array<Request.Entry<A>>): Array<Request.Entry<A>>; (start: number, deleteCount?: number): Array<Request.Entry<A>> };
with: (index: number, value: Request.Entry<A>) => Array<Request.Entry<A>>;
}
entries, key: unknownkey),
(a: A2a) => after: (
entries: NonEmptyArray<
Request.Entry<NoInfer<A>>
>,
a: A2
) => Effect.Effect<X, Request.Error<A>>
after(entries: [
Request.Entry<A>,
...Request.Entry<A>[]
]
(parameter) entries: {
0: Request.Entry<A>;
length: number;
toString: () => string;
toLocaleString: { (): string; (locales: string | string[], options?: Intl.NumberFormatOptions & Intl.DateTimeFormatOptions): string };
pop: () => Request.Entry<A> | undefined;
push: (...items: Array<Request.Entry<A>>) => number;
concat: { (...items: Array<ConcatArray<Request.Entry<A>>>): Array<Request.Entry<A>>; (...items: Array<Request.Entry<A> | ConcatArray<Request.Entry<A>>>): Array<Request.Entry<A>> };
join: (separator?: string) => string;
reverse: () => Array<Request.Entry<A>>;
shift: () => Request.Entry<A> | undefined;
slice: (start?: number, end?: number) => Array<Request.Entry<A>>;
sort: (compareFn?: ((a: Request.Entry<A>, b: Request.Entry<A>) => number) | undefined) => [Request.Entry<A>, ...Request.Entry<A>[]];
splice: { (start: number, deleteCount?: number): Array<Request.Entry<A>>; (start: number, deleteCount: number, ...items: Array<Request.Entry<A>>): Array<Request.Entry<A>> };
unshift: (...items: Array<Request.Entry<A>>) => number;
indexOf: (searchElement: Request.Entry<A>, fromIndex?: number) => number;
lastIndexOf: (searchElement: Request.Entry<A>, fromIndex?: number) => number;
every: { (predicate: (value: Request.Entry<A>, index: number, array: Array<Request.Entry<A>>) => value is S, thisArg?: any): this is S[]; (predicate: (value: Request.Entry<A>, index: number, array: Array<Request.Entry<A>>) => unknown, thisArg?: a…;
some: (predicate: (value: Request.Entry<A>, index: number, array: Array<Request.Entry<A>>) => unknown, thisArg?: any) => boolean;
forEach: (callbackfn: (value: Request.Entry<A>, index: number, array: Array<Request.Entry<A>>) => void, thisArg?: any) => void;
map: (callbackfn: (value: Request.Entry<A>, index: number, array: Array<Request.Entry<A>>) => U, thisArg?: any) => Array<U>;
filter: { (predicate: (value: Request.Entry<A>, index: number, array: Array<Request.Entry<A>>) => value is S, thisArg?: any): Array<S>; (predicate: (value: Request.Entry<A>, index: number, array: Array<Request.Entry<A>>) => unknown, thisArg?: any)…;
reduce: { (callbackfn: (previousValue: Request.Entry<A>, currentValue: Request.Entry<A>, currentIndex: number, array: Array<Request.Entry<A>>) => Request.Entry<A>): Request.Entry<A>; (callbackfn: (previousValue: Request.Entry<A>, currentValue: Req…;
reduceRight: { (callbackfn: (previousValue: Request.Entry<A>, currentValue: Request.Entry<A>, currentIndex: number, array: Array<Request.Entry<A>>) => Request.Entry<A>): Request.Entry<A>; (callbackfn: (previousValue: Request.Entry<A>, currentValue: Req…;
find: { (predicate: (value: Request.Entry<A>, index: number, obj: Array<Request.Entry<A>>) => value is S, thisArg?: any): S | undefined; (predicate: (value: Request.Entry<A>, index: number, obj: Array<Request.Entry<A>>) => unknown, thisArg?: any…;
findIndex: (predicate: (value: Request.Entry<A>, index: number, obj: Array<Request.Entry<A>>) => unknown, thisArg?: any) => number;
fill: (value: Request.Entry<A>, start?: number, end?: number) => [Request.Entry<A>, ...Request.Entry<A>[]];
copyWithin: (target: number, start: number, end?: number) => [Request.Entry<A>, ...Request.Entry<A>[]];
entries: () => ArrayIterator<[number, Request.Entry<A>]>;
keys: () => ArrayIterator<number>;
values: () => ArrayIterator<Request.Entry<A>>;
includes: (searchElement: Request.Entry<A>, fromIndex?: number) => boolean;
flatMap: (callback: (this: This, value: Request.Entry<A>, index: number, array: Array<Request.Entry<A>>) => U | ReadonlyArray<U>, thisArg?: This | undefined) => Array<U>;
flat: (this: A, depth?: D | undefined) => Array<FlatArray<A, D>>;
at: (index: number) => Request.Entry<A> | undefined;
findLast: { (predicate: (value: Request.Entry<A>, index: number, array: Array<Request.Entry<A>>) => value is S, thisArg?: any): S | undefined; (predicate: (value: Request.Entry<A>, index: number, array: Array<Request.Entry<A>>) => unknown, thisArg?:…;
findLastIndex: (predicate: (value: Request.Entry<A>, index: number, array: Array<Request.Entry<A>>) => unknown, thisArg?: any) => number;
toReversed: () => Array<Request.Entry<A>>;
toSorted: (compareFn?: ((a: Request.Entry<A>, b: Request.Entry<A>) => number) | undefined) => Array<Request.Entry<A>>;
toSpliced: { (start: number, deleteCount: number, ...items: Array<Request.Entry<A>>): Array<Request.Entry<A>>; (start: number, deleteCount?: number): Array<Request.Entry<A>> };
with: (index: number, value: Request.Entry<A>) => Array<Request.Entry<A>>;
}
entries, a: A2a)
)
}))