<N, E, T extends Kind = "directed">(graph: Graph<N, E, T>): MutableGraph<
N,
E,
T
>Creates a mutable scope for safe graph mutations by copying the data structure.
Example (Beginning a mutation scope)
import { Graph } from "effect"
const graph = Graph.directed<string, number>()
const mutable = Graph.beginMutation(graph)
// Now mutable can be safely modified without affecting original graphexport const const beginMutation: <
N,
E,
T extends Kind = "directed"
>(
graph: Graph<N, E, T>
) => MutableGraph<N, E, T>
Creates a mutable scope for safe graph mutations by copying the data structure.
Example (Beginning a mutation scope)
import { Graph } from "effect"
const graph = Graph.directed<string, number>()
const mutable = Graph.beginMutation(graph)
// Now mutable can be safely modified without affecting original graph
beginMutation = <function (type parameter) N in <N, E, T extends Kind = "directed">(graph: Graph<N, E, T>): MutableGraph<N, E, T>N, function (type parameter) E in <N, E, T extends Kind = "directed">(graph: Graph<N, E, T>): MutableGraph<N, E, T>E, function (type parameter) T in <N, E, T extends Kind = "directed">(graph: Graph<N, E, T>): MutableGraph<N, E, T>T extends type Kind = "directed" | "undirected"Graph type for distinguishing directed and undirected graphs.
When to use
Use when writing graph-polymorphic types or helpers that need to preserve
whether a graph is directed or undirected.
Kind = "directed">(
graph: Graph<N, E, T>(parameter) graph: {
type: T;
mutable: false;
nodes: Map<NodeIndex, N>;
edges: Map<EdgeIndex, Edge<E>>;
adjacency: Map<NodeIndex, Array<EdgeIndex>>;
reverseAdjacency: Map<NodeIndex, Array<EdgeIndex>>;
nextNodeIndex: NodeIndex;
nextEdgeIndex: EdgeIndex;
acyclic: Option.Option<boolean>;
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
toString: () => string;
toJSON: () => unknown;
}
graph: interface Graph<out N, out E, T extends Kind = "directed">Immutable graph interface.
When to use
Use as the immutable graph model for code that queries, traverses,
transforms, or analyzes graph structure without mutating it.
Graph<function (type parameter) N in <N, E, T extends Kind = "directed">(graph: Graph<N, E, T>): MutableGraph<N, E, T>N, function (type parameter) E in <N, E, T extends Kind = "directed">(graph: Graph<N, E, T>): MutableGraph<N, E, T>E, function (type parameter) T in <N, E, T extends Kind = "directed">(graph: Graph<N, E, T>): MutableGraph<N, E, T>T>
): interface MutableGraph<out N, out E, T extends Kind = "directed">Mutable graph interface.
When to use
Use when adding, removing, or updating nodes and edges inside a graph
mutation scope.
MutableGraph<function (type parameter) N in <N, E, T extends Kind = "directed">(graph: Graph<N, E, T>): MutableGraph<N, E, T>N, function (type parameter) E in <N, E, T extends Kind = "directed">(graph: Graph<N, E, T>): MutableGraph<N, E, T>E, function (type parameter) T in <N, E, T extends Kind = "directed">(graph: Graph<N, E, T>): MutableGraph<N, E, T>T> => {
// Copy adjacency maps with deep cloned arrays
const const adjacency: Map<number, number[]>adjacency = new var Map: MapConstructor
new <number, number[]>(iterable?: Iterable<readonly [number, number[]]> | null | undefined) => Map<number, number[]> (+3 overloads)
Map<type NodeIndex = numberNode index for node identification using plain numbers.
When to use
Use when storing or passing the stable identifier of a graph node between
Graph operations.
Details
addNode allocates node identifiers from the graph's next node index.
Gotchas
A NodeIndex is an identifier, not an array offset. Removed node identifiers
are not reused.
NodeIndex, interface Array<T>Array<type EdgeIndex = numberEdge index for edge identification using plain numbers.
When to use
Use when you need to keep the identifier for a graph edge so you can later
read, update, remove, or compare that edge.
Gotchas
An EdgeIndex is an identifier, not an array offset. Removed edge
identifiers are not reused.
EdgeIndex>>()
const const reverseAdjacency: Map<
number,
number[]
>
reverseAdjacency = new var Map: MapConstructor
new <number, number[]>(iterable?: Iterable<readonly [number, number[]]> | null | undefined) => Map<number, number[]> (+3 overloads)
Map<type NodeIndex = numberNode index for node identification using plain numbers.
When to use
Use when storing or passing the stable identifier of a graph node between
Graph operations.
Details
addNode allocates node identifiers from the graph's next node index.
Gotchas
A NodeIndex is an identifier, not an array offset. Removed node identifiers
are not reused.
NodeIndex, interface Array<T>Array<type EdgeIndex = numberEdge index for edge identification using plain numbers.
When to use
Use when you need to keep the identifier for a graph edge so you can later
read, update, remove, or compare that edge.
Gotchas
An EdgeIndex is an identifier, not an array offset. Removed edge
identifiers are not reused.
EdgeIndex>>()
for (const [const nodeIndex: numbernodeIndex, const edges: number[]edges] of graph: Graph<N, E, T>(parameter) graph: {
type: T;
mutable: false;
nodes: Map<NodeIndex, N>;
edges: Map<EdgeIndex, Edge<E>>;
adjacency: Map<NodeIndex, Array<EdgeIndex>>;
reverseAdjacency: Map<NodeIndex, Array<EdgeIndex>>;
nextNodeIndex: NodeIndex;
nextEdgeIndex: EdgeIndex;
acyclic: Option.Option<boolean>;
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
toString: () => string;
toJSON: () => unknown;
}
graph.Proto<out N, out E>.adjacency: Map<NodeIndex, Array<EdgeIndex>>adjacency) {
const adjacency: Map<number, number[]>adjacency.Map<number, number[]>.set(key: number, value: number[]): Map<number, number[]>Adds a new element with a specified key and value to the Map. If an element with the same key already exists, the element will be updated.
set(const nodeIndex: numbernodeIndex, [...const edges: number[]edges])
}
for (const [const nodeIndex: numbernodeIndex, const edges: number[]edges] of graph: Graph<N, E, T>(parameter) graph: {
type: T;
mutable: false;
nodes: Map<NodeIndex, N>;
edges: Map<EdgeIndex, Edge<E>>;
adjacency: Map<NodeIndex, Array<EdgeIndex>>;
reverseAdjacency: Map<NodeIndex, Array<EdgeIndex>>;
nextNodeIndex: NodeIndex;
nextEdgeIndex: EdgeIndex;
acyclic: Option.Option<boolean>;
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
toString: () => string;
toJSON: () => unknown;
}
graph.Proto<out N, out E>.reverseAdjacency: Map<NodeIndex, Array<EdgeIndex>>reverseAdjacency) {
const reverseAdjacency: Map<
number,
number[]
>
reverseAdjacency.Map<number, number[]>.set(key: number, value: number[]): Map<number, number[]>Adds a new element with a specified key and value to the Map. If an element with the same key already exists, the element will be updated.
set(const nodeIndex: numbernodeIndex, [...const edges: number[]edges])
}
const const mutable: Mutable<
MutableGraph<N, E, T>
>
const mutable: {
type: T;
mutable: true;
nodes: Map<number, N>;
edges: Map<number, Edge<E>>;
adjacency: Map<number, Array<number>>;
reverseAdjacency: Map<number, Array<number>>;
nextNodeIndex: number;
nextEdgeIndex: number;
acyclic: Option.Option<boolean>;
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
toString: () => string;
toJSON: () => unknown;
}
mutable: type Mutable<T> = { -readonly [P in keyof T]: T[P]; }Removes readonly from all properties of T. Supports arrays, tuples,
and records.
When to use
Use when you need a mutable version of a readonly type.
Details
Only affects the top level; nested properties remain readonly.
Example (Converting shallowly to mutable types)
import type { Types } from "effect"
type Obj = Types.Mutable<{
readonly a: string
readonly b: ReadonlyArray<number>
}>
// { a: string; b: ReadonlyArray<number> }
// ^ mutable ^ still readonly inside
type Arr = Types.Mutable<ReadonlyArray<string>>
// string[]
type Tup = Types.Mutable<readonly [string, number]>
// [string, number]
Mutable<interface MutableGraph<out N, out E, T extends Kind = "directed">Mutable graph interface.
When to use
Use when adding, removing, or updating nodes and edges inside a graph
mutation scope.
MutableGraph<function (type parameter) N in <N, E, T extends Kind = "directed">(graph: Graph<N, E, T>): MutableGraph<N, E, T>N, function (type parameter) E in <N, E, T extends Kind = "directed">(graph: Graph<N, E, T>): MutableGraph<N, E, T>E, function (type parameter) T in <N, E, T extends Kind = "directed">(graph: Graph<N, E, T>): MutableGraph<N, E, T>T>> = var Object: ObjectConstructorProvides functionality common to all JavaScript objects.
Object.ObjectConstructor.create(o: object | null): any (+1 overload)Creates an object that has the specified prototype or that has null prototype.
create(const ProtoGraph: {
"~effect/collections/Graph": string
[Symbol.iterator](
this: Graph<any, any>
): MapIterator<[number, any]>
[NodeInspectSymbol](
this: Graph<any, any>
): unknown
"~effect/interfaces/Equal"(
this: Graph<any, any>,
that: Equal.Equal
): boolean
"~effect/interfaces/Hash"(
this: Graph<any, any>
): number
toJSON(this: Graph<any, any>): {
_id: string
nodeCount: number
edgeCount: number
type: "directed"
}
toString(this: Graph<any, any>): string
pipe(): unknown
}
ProtoGraph)
const mutable: Mutable<
MutableGraph<N, E, T>
>
const mutable: {
type: T;
mutable: true;
nodes: Map<number, N>;
edges: Map<number, Edge<E>>;
adjacency: Map<number, Array<number>>;
reverseAdjacency: Map<number, Array<number>>;
nextNodeIndex: number;
nextEdgeIndex: number;
acyclic: Option.Option<boolean>;
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
toString: () => string;
toJSON: () => unknown;
}
mutable.type: T extends Kind = "directed"type = graph: Graph<N, E, T>(parameter) graph: {
type: T;
mutable: false;
nodes: Map<NodeIndex, N>;
edges: Map<EdgeIndex, Edge<E>>;
adjacency: Map<NodeIndex, Array<EdgeIndex>>;
reverseAdjacency: Map<NodeIndex, Array<EdgeIndex>>;
nextNodeIndex: NodeIndex;
nextEdgeIndex: EdgeIndex;
acyclic: Option.Option<boolean>;
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
toString: () => string;
toJSON: () => unknown;
}
graph.Graph<N, E, T>.type: T extends Kind = "directed"type
const mutable: Mutable<
MutableGraph<N, E, T>
>
const mutable: {
type: T;
mutable: true;
nodes: Map<number, N>;
edges: Map<number, Edge<E>>;
adjacency: Map<number, Array<number>>;
reverseAdjacency: Map<number, Array<number>>;
nextNodeIndex: number;
nextEdgeIndex: number;
acyclic: Option.Option<boolean>;
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
toString: () => string;
toJSON: () => unknown;
}
mutable.nodes: Map<number, N>nodes = new var Map: MapConstructor
new <number, N>(iterable?: Iterable<readonly [number, N]> | null | undefined) => Map<number, N> (+3 overloads)
Map(graph: Graph<N, E, T>(parameter) graph: {
type: T;
mutable: false;
nodes: Map<NodeIndex, N>;
edges: Map<EdgeIndex, Edge<E>>;
adjacency: Map<NodeIndex, Array<EdgeIndex>>;
reverseAdjacency: Map<NodeIndex, Array<EdgeIndex>>;
nextNodeIndex: NodeIndex;
nextEdgeIndex: EdgeIndex;
acyclic: Option.Option<boolean>;
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
toString: () => string;
toJSON: () => unknown;
}
graph.Proto<N, E>.nodes: Map<NodeIndex, N>nodes)
const mutable: Mutable<
MutableGraph<N, E, T>
>
const mutable: {
type: T;
mutable: true;
nodes: Map<number, N>;
edges: Map<number, Edge<E>>;
adjacency: Map<number, Array<number>>;
reverseAdjacency: Map<number, Array<number>>;
nextNodeIndex: number;
nextEdgeIndex: number;
acyclic: Option.Option<boolean>;
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
toString: () => string;
toJSON: () => unknown;
}
mutable.edges: Map<number, Edge<E>>edges = new var Map: MapConstructor
new <number, Edge<E>>(iterable?: Iterable<readonly [number, Edge<E>]> | null | undefined) => Map<number, Edge<E>> (+3 overloads)
Map(graph: Graph<N, E, T>(parameter) graph: {
type: T;
mutable: false;
nodes: Map<NodeIndex, N>;
edges: Map<EdgeIndex, Edge<E>>;
adjacency: Map<NodeIndex, Array<EdgeIndex>>;
reverseAdjacency: Map<NodeIndex, Array<EdgeIndex>>;
nextNodeIndex: NodeIndex;
nextEdgeIndex: EdgeIndex;
acyclic: Option.Option<boolean>;
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
toString: () => string;
toJSON: () => unknown;
}
graph.Proto<N, E>.edges: Map<EdgeIndex, Edge<E>>edges)
const mutable: Mutable<
MutableGraph<N, E, T>
>
const mutable: {
type: T;
mutable: true;
nodes: Map<number, N>;
edges: Map<number, Edge<E>>;
adjacency: Map<number, Array<number>>;
reverseAdjacency: Map<number, Array<number>>;
nextNodeIndex: number;
nextEdgeIndex: number;
acyclic: Option.Option<boolean>;
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
toString: () => string;
toJSON: () => unknown;
}
mutable.adjacency: Map<number, number[]>adjacency = const adjacency: Map<number, number[]>adjacency
const mutable: Mutable<
MutableGraph<N, E, T>
>
const mutable: {
type: T;
mutable: true;
nodes: Map<number, N>;
edges: Map<number, Edge<E>>;
adjacency: Map<number, Array<number>>;
reverseAdjacency: Map<number, Array<number>>;
nextNodeIndex: number;
nextEdgeIndex: number;
acyclic: Option.Option<boolean>;
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
toString: () => string;
toJSON: () => unknown;
}
mutable.reverseAdjacency: Map<number, number[]>reverseAdjacency = const reverseAdjacency: Map<
number,
number[]
>
reverseAdjacency
const mutable: Mutable<
MutableGraph<N, E, T>
>
const mutable: {
type: T;
mutable: true;
nodes: Map<number, N>;
edges: Map<number, Edge<E>>;
adjacency: Map<number, Array<number>>;
reverseAdjacency: Map<number, Array<number>>;
nextNodeIndex: number;
nextEdgeIndex: number;
acyclic: Option.Option<boolean>;
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
toString: () => string;
toJSON: () => unknown;
}
mutable.nextNodeIndex: numbernextNodeIndex = graph: Graph<N, E, T>(parameter) graph: {
type: T;
mutable: false;
nodes: Map<NodeIndex, N>;
edges: Map<EdgeIndex, Edge<E>>;
adjacency: Map<NodeIndex, Array<EdgeIndex>>;
reverseAdjacency: Map<NodeIndex, Array<EdgeIndex>>;
nextNodeIndex: NodeIndex;
nextEdgeIndex: EdgeIndex;
acyclic: Option.Option<boolean>;
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
toString: () => string;
toJSON: () => unknown;
}
graph.Proto<out N, out E>.nextNodeIndex: NodeIndexnextNodeIndex
const mutable: Mutable<
MutableGraph<N, E, T>
>
const mutable: {
type: T;
mutable: true;
nodes: Map<number, N>;
edges: Map<number, Edge<E>>;
adjacency: Map<number, Array<number>>;
reverseAdjacency: Map<number, Array<number>>;
nextNodeIndex: number;
nextEdgeIndex: number;
acyclic: Option.Option<boolean>;
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
toString: () => string;
toJSON: () => unknown;
}
mutable.nextEdgeIndex: numbernextEdgeIndex = graph: Graph<N, E, T>(parameter) graph: {
type: T;
mutable: false;
nodes: Map<NodeIndex, N>;
edges: Map<EdgeIndex, Edge<E>>;
adjacency: Map<NodeIndex, Array<EdgeIndex>>;
reverseAdjacency: Map<NodeIndex, Array<EdgeIndex>>;
nextNodeIndex: NodeIndex;
nextEdgeIndex: EdgeIndex;
acyclic: Option.Option<boolean>;
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
toString: () => string;
toJSON: () => unknown;
}
graph.Proto<out N, out E>.nextEdgeIndex: EdgeIndexnextEdgeIndex
const mutable: Mutable<
MutableGraph<N, E, T>
>
const mutable: {
type: T;
mutable: true;
nodes: Map<number, N>;
edges: Map<number, Edge<E>>;
adjacency: Map<number, Array<number>>;
reverseAdjacency: Map<number, Array<number>>;
nextNodeIndex: number;
nextEdgeIndex: number;
acyclic: Option.Option<boolean>;
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
toString: () => string;
toJSON: () => unknown;
}
mutable.acyclic: Option.Option<boolean>acyclic = graph: Graph<N, E, T>(parameter) graph: {
type: T;
mutable: false;
nodes: Map<NodeIndex, N>;
edges: Map<EdgeIndex, Edge<E>>;
adjacency: Map<NodeIndex, Array<EdgeIndex>>;
reverseAdjacency: Map<NodeIndex, Array<EdgeIndex>>;
nextNodeIndex: NodeIndex;
nextEdgeIndex: EdgeIndex;
acyclic: Option.Option<boolean>;
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
toString: () => string;
toJSON: () => unknown;
}
graph.Proto<out N, out E>.acyclic: Option.Option<boolean>acyclic
const mutable: Mutable<
MutableGraph<N, E, T>
>
const mutable: {
type: T;
mutable: true;
nodes: Map<number, N>;
edges: Map<number, Edge<E>>;
adjacency: Map<number, Array<number>>;
reverseAdjacency: Map<number, Array<number>>;
nextNodeIndex: number;
nextEdgeIndex: number;
acyclic: Option.Option<boolean>;
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
toString: () => string;
toJSON: () => unknown;
}
mutable.mutable: truemutable = true
return const mutable: Mutable<
MutableGraph<N, E, T>
>
const mutable: {
type: T;
mutable: true;
nodes: Map<number, N>;
edges: Map<number, Edge<E>>;
adjacency: Map<number, Array<number>>;
reverseAdjacency: Map<number, Array<number>>;
nextNodeIndex: number;
nextEdgeIndex: number;
acyclic: Option.Option<boolean>;
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
toString: () => string;
toJSON: () => unknown;
}
mutable
}