diff --git a/backend/node_modules/effect/dist/dts/Arbitrary.d.ts b/backend/node_modules/effect/dist/dts/Arbitrary.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..3d506c177067ddc4dccc0591daa23f51a05ea0ca
--- /dev/null
+++ b/backend/node_modules/effect/dist/dts/Arbitrary.d.ts
@@ -0,0 +1,69 @@
+/**
+ * @since 3.10.0
+ */
+import * as FastCheck from "./FastCheck.js";
+import type * as Schema from "./Schema.js";
+/**
+ * @category model
+ * @since 3.10.0
+ */
+export interface LazyArbitrary {
+ (fc: typeof FastCheck): FastCheck.Arbitrary;
+}
+/**
+ * @category annotations
+ * @since 3.10.0
+ */
+export interface ArbitraryGenerationContext {
+ readonly maxDepth: number;
+ readonly depthIdentifier?: string;
+ readonly constraints?: StringConstraints | NumberConstraints | BigIntConstraints | DateConstraints | ArrayConstraints;
+}
+/**
+ * @category annotations
+ * @since 3.10.0
+ */
+export type ArbitraryAnnotation = readonly []> = (...arbitraries: [
+ ...{
+ readonly [K in keyof TypeParameters]: LazyArbitrary;
+ },
+ ctx: ArbitraryGenerationContext
+]) => LazyArbitrary;
+/**
+ * Returns a LazyArbitrary for the `A` type of the provided schema.
+ *
+ * @category arbitrary
+ * @since 3.10.0
+ */
+export declare const makeLazy: (schema: Schema.Schema) => LazyArbitrary;
+/**
+ * Returns a fast-check Arbitrary for the `A` type of the provided schema.
+ *
+ * @category arbitrary
+ * @since 3.10.0
+ */
+export declare const make: (schema: Schema.Schema) => FastCheck.Arbitrary;
+interface StringConstraints {
+ readonly _tag: "StringConstraints";
+ readonly constraints: FastCheck.StringSharedConstraints;
+ readonly pattern?: string;
+}
+interface NumberConstraints {
+ readonly _tag: "NumberConstraints";
+ readonly constraints: FastCheck.FloatConstraints;
+ readonly isInteger: boolean;
+}
+interface BigIntConstraints {
+ readonly _tag: "BigIntConstraints";
+ readonly constraints: FastCheck.BigIntConstraints;
+}
+interface ArrayConstraints {
+ readonly _tag: "ArrayConstraints";
+ readonly constraints: FastCheck.ArrayConstraints;
+}
+interface DateConstraints {
+ readonly _tag: "DateConstraints";
+ readonly constraints: FastCheck.DateConstraints;
+}
+export {};
+//# sourceMappingURL=Arbitrary.d.ts.map
\ No newline at end of file
diff --git a/backend/node_modules/effect/dist/dts/Arbitrary.d.ts.map b/backend/node_modules/effect/dist/dts/Arbitrary.d.ts.map
new file mode 100644
index 0000000000000000000000000000000000000000..1f3b665b98e1ae2faa413f2536fffab65f946576
--- /dev/null
+++ b/backend/node_modules/effect/dist/dts/Arbitrary.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"Arbitrary.d.ts","sourceRoot":"","sources":["../../src/Arbitrary.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAA;AAO3C,OAAO,KAAK,KAAK,MAAM,MAAM,aAAa,CAAA;AAI1C;;;GAGG;AACH,MAAM,WAAW,aAAa,CAAC,CAAC;IAC9B,CAAC,EAAE,EAAE,OAAO,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;CAC/C;AAED;;;GAGG;AACH,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAA;IACjC,QAAQ,CAAC,WAAW,CAAC,EAAE,iBAAiB,GAAG,iBAAiB,GAAG,iBAAiB,GAAG,eAAe,GAAG,gBAAgB,CAAA;CACtH;AAED;;;GAGG;AACH,MAAM,MAAM,mBAAmB,CAAC,CAAC,EAAE,cAAc,SAAS,aAAa,CAAC,GAAG,CAAC,GAAG,SAAS,EAAE,IAAI,CAC5F,GAAG,WAAW,EAAE;IACd,GAAG;QAAE,QAAQ,EAAE,CAAC,IAAI,MAAM,cAAc,GAAG,aAAa,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;KAAE;IAC7E,GAAG,EAAE,0BAA0B;CAChC,KACE,aAAa,CAAC,CAAC,CAAC,CAAA;AAErB;;;;;GAKG;AACH,eAAO,MAAM,QAAQ,GAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,QAAQ,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAAG,aAAa,CAAC,CAAC,CAGjF,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,IAAI,GAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,QAAQ,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAAG,SAAS,CAAC,SAAS,CAAC,CAAC,CAAgC,CAAA;AAEpH,UAAU,iBAAiB;IACzB,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAA;IAClC,QAAQ,CAAC,WAAW,EAAE,SAAS,CAAC,uBAAuB,CAAA;IACvD,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAC1B;AAwBD,UAAU,iBAAiB;IACzB,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAA;IAClC,QAAQ,CAAC,WAAW,EAAE,SAAS,CAAC,gBAAgB,CAAA;IAChD,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;CAC5B;AAsCD,UAAU,iBAAiB;IACzB,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAA;IAClC,QAAQ,CAAC,WAAW,EAAE,SAAS,CAAC,iBAAiB,CAAA;CAClD;AAoBD,UAAU,gBAAgB;IACxB,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAA;IACjC,QAAQ,CAAC,WAAW,EAAE,SAAS,CAAC,gBAAgB,CAAA;CACjD;AAoBD,UAAU,eAAe;IACvB,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAA;IAChC,QAAQ,CAAC,WAAW,EAAE,SAAS,CAAC,eAAe,CAAA;CAChD"}
\ No newline at end of file
diff --git a/backend/node_modules/effect/dist/dts/Array.d.ts b/backend/node_modules/effect/dist/dts/Array.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..58edc404f0b7190d80f13c8968e1b8efa1d6fd37
--- /dev/null
+++ b/backend/node_modules/effect/dist/dts/Array.d.ts
@@ -0,0 +1,5922 @@
+/**
+ * This module provides utility functions for working with arrays in TypeScript.
+ *
+ * @since 2.0.0
+ */
+import * as Either from "./Either.js";
+import * as Equivalence from "./Equivalence.js";
+import type { LazyArg } from "./Function.js";
+import type { TypeLambda } from "./HKT.js";
+import * as Option from "./Option.js";
+import * as Order from "./Order.js";
+import * as Predicate from "./Predicate.js";
+import * as Record from "./Record.js";
+import type { NoInfer, TupleOf } from "./Types.js";
+/**
+ * @category type lambdas
+ * @since 2.0.0
+ */
+export interface ReadonlyArrayTypeLambda extends TypeLambda {
+ readonly type: ReadonlyArray;
+}
+/**
+ * @category models
+ * @since 2.0.0
+ */
+export type NonEmptyReadonlyArray = readonly [A, ...Array];
+/**
+ * @category models
+ * @since 2.0.0
+ */
+export type NonEmptyArray = [A, ...Array];
+/**
+ * Builds a `NonEmptyArray` from an non-empty collection of elements.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.make(1, 2, 3)
+ * console.log(result) // [1, 2, 3]
+ * ```
+ *
+ * @category constructors
+ * @since 2.0.0
+ */
+export declare const make: >(...elements: Elements) => NonEmptyArray;
+/**
+ * Creates a new `Array` of the specified length.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.allocate(3)
+ * console.log(result) // [ <3 empty items> ]
+ * ```
+ *
+ * @category constructors
+ * @since 2.0.0
+ */
+export declare const allocate: (n: number) => Array;
+/**
+ * Return a `NonEmptyArray` of length `n` with element `i` initialized with `f(i)`.
+ *
+ * **Note**. `n` is normalized to an integer >= 1.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { makeBy } from "effect/Array"
+ *
+ * const result = makeBy(5, n => n * 2)
+ * console.log(result) // [0, 2, 4, 6, 8]
+ * ```
+ *
+ * @category constructors
+ * @since 2.0.0
+ */
+export declare const makeBy: {
+ /**
+ * Return a `NonEmptyArray` of length `n` with element `i` initialized with `f(i)`.
+ *
+ * **Note**. `n` is normalized to an integer >= 1.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { makeBy } from "effect/Array"
+ *
+ * const result = makeBy(5, n => n * 2)
+ * console.log(result) // [0, 2, 4, 6, 8]
+ * ```
+ *
+ * @category constructors
+ * @since 2.0.0
+ */
+ (f: (i: number) => A): (n: number) => NonEmptyArray;
+ /**
+ * Return a `NonEmptyArray` of length `n` with element `i` initialized with `f(i)`.
+ *
+ * **Note**. `n` is normalized to an integer >= 1.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { makeBy } from "effect/Array"
+ *
+ * const result = makeBy(5, n => n * 2)
+ * console.log(result) // [0, 2, 4, 6, 8]
+ * ```
+ *
+ * @category constructors
+ * @since 2.0.0
+ */
+ (n: number, f: (i: number) => A): NonEmptyArray;
+};
+/**
+ * Return a `NonEmptyArray` containing a range of integers, including both endpoints.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { range } from "effect/Array"
+ *
+ * const result = range(1, 3)
+ * console.log(result) // [1, 2, 3]
+ * ```
+ *
+ * @category constructors
+ * @since 2.0.0
+ */
+export declare const range: (start: number, end: number) => NonEmptyArray;
+/**
+ * Return a `NonEmptyArray` containing a value repeated the specified number of times.
+ *
+ * **Note**. `n` is normalized to an integer >= 1.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.replicate("a", 3)
+ * console.log(result) // ["a", "a", "a"]
+ * ```
+ *
+ * @category constructors
+ * @since 2.0.0
+ */
+export declare const replicate: {
+ /**
+ * Return a `NonEmptyArray` containing a value repeated the specified number of times.
+ *
+ * **Note**. `n` is normalized to an integer >= 1.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.replicate("a", 3)
+ * console.log(result) // ["a", "a", "a"]
+ * ```
+ *
+ * @category constructors
+ * @since 2.0.0
+ */
+ (n: number): (a: A) => NonEmptyArray;
+ /**
+ * Return a `NonEmptyArray` containing a value repeated the specified number of times.
+ *
+ * **Note**. `n` is normalized to an integer >= 1.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.replicate("a", 3)
+ * console.log(result) // ["a", "a", "a"]
+ * ```
+ *
+ * @category constructors
+ * @since 2.0.0
+ */
+ (a: A, n: number): NonEmptyArray;
+};
+/**
+ * Creates a new `Array` from an iterable collection of values.
+ * If the input is already an array, it returns the input as-is.
+ * Otherwise, it converts the iterable collection to an array.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.fromIterable(new Set([1, 2, 3]))
+ * console.log(result) // [1, 2, 3]
+ * ```
+ *
+ * @category constructors
+ * @since 2.0.0
+ */
+export declare const fromIterable: (collection: Iterable) => Array;
+/**
+ * Creates a new `Array` from a value that might not be an iterable.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * console.log(Array.ensure("a")) // ["a"]
+ * console.log(Array.ensure(["a"])) // ["a"]
+ * console.log(Array.ensure(["a", "b", "c"])) // ["a", "b", "c"]
+ * ```
+ *
+ * @category constructors
+ * @since 3.3.0
+ */
+export declare const ensure: (self: ReadonlyArray | A) => Array;
+/**
+ * Takes a record and returns an array of tuples containing its keys and values.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.fromRecord({ a: 1, b: 2, c: 3 })
+ * console.log(result) // [["a", 1], ["b", 2], ["c", 3]]
+ * ```
+ *
+ * @category conversions
+ * @since 2.0.0
+ */
+export declare const fromRecord: (self: Readonly>) => Array<[K, A]>;
+/**
+ * Converts an `Option` to an array.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array, Option } from "effect"
+ *
+ * console.log(Array.fromOption(Option.some(1))) // [1]
+ * console.log(Array.fromOption(Option.none())) // []
+ * ```
+ *
+ * @category conversions
+ * @since 2.0.0
+ */
+export declare const fromOption: (self: Option.Option) => Array;
+/**
+ * Matches the elements of an array, applying functions to cases of empty and non-empty arrays.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const match = Array.match({
+ * onEmpty: () => "empty",
+ * onNonEmpty: ([head, ...tail]) => `head: ${head}, tail: ${tail.length}`
+ * })
+ * console.log(match([])) // "empty"
+ * console.log(match([1, 2, 3])) // "head: 1, tail: 2"
+ * ```
+ *
+ * @category pattern matching
+ * @since 2.0.0
+ */
+export declare const match: {
+ /**
+ * Matches the elements of an array, applying functions to cases of empty and non-empty arrays.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const match = Array.match({
+ * onEmpty: () => "empty",
+ * onNonEmpty: ([head, ...tail]) => `head: ${head}, tail: ${tail.length}`
+ * })
+ * console.log(match([])) // "empty"
+ * console.log(match([1, 2, 3])) // "head: 1, tail: 2"
+ * ```
+ *
+ * @category pattern matching
+ * @since 2.0.0
+ */
+ (options: {
+ readonly onEmpty: LazyArg;
+ readonly onNonEmpty: (self: NonEmptyReadonlyArray) => C;
+ }): (self: ReadonlyArray) => B | C;
+ /**
+ * Matches the elements of an array, applying functions to cases of empty and non-empty arrays.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const match = Array.match({
+ * onEmpty: () => "empty",
+ * onNonEmpty: ([head, ...tail]) => `head: ${head}, tail: ${tail.length}`
+ * })
+ * console.log(match([])) // "empty"
+ * console.log(match([1, 2, 3])) // "head: 1, tail: 2"
+ * ```
+ *
+ * @category pattern matching
+ * @since 2.0.0
+ */
+ (self: ReadonlyArray, options: {
+ readonly onEmpty: LazyArg;
+ readonly onNonEmpty: (self: NonEmptyReadonlyArray) => C;
+ }): B | C;
+};
+/**
+ * Matches the elements of an array from the left, applying functions to cases of empty and non-empty arrays.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const matchLeft = Array.matchLeft({
+ * onEmpty: () => "empty",
+ * onNonEmpty: (head, tail) => `head: ${head}, tail: ${tail.length}`
+ * })
+ * console.log(matchLeft([])) // "empty"
+ * console.log(matchLeft([1, 2, 3])) // "head: 1, tail: 2"
+ * ```
+ *
+ * @category pattern matching
+ * @since 2.0.0
+ */
+export declare const matchLeft: {
+ /**
+ * Matches the elements of an array from the left, applying functions to cases of empty and non-empty arrays.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const matchLeft = Array.matchLeft({
+ * onEmpty: () => "empty",
+ * onNonEmpty: (head, tail) => `head: ${head}, tail: ${tail.length}`
+ * })
+ * console.log(matchLeft([])) // "empty"
+ * console.log(matchLeft([1, 2, 3])) // "head: 1, tail: 2"
+ * ```
+ *
+ * @category pattern matching
+ * @since 2.0.0
+ */
+ (options: {
+ readonly onEmpty: LazyArg;
+ readonly onNonEmpty: (head: A, tail: Array) => C;
+ }): (self: ReadonlyArray) => B | C;
+ /**
+ * Matches the elements of an array from the left, applying functions to cases of empty and non-empty arrays.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const matchLeft = Array.matchLeft({
+ * onEmpty: () => "empty",
+ * onNonEmpty: (head, tail) => `head: ${head}, tail: ${tail.length}`
+ * })
+ * console.log(matchLeft([])) // "empty"
+ * console.log(matchLeft([1, 2, 3])) // "head: 1, tail: 2"
+ * ```
+ *
+ * @category pattern matching
+ * @since 2.0.0
+ */
+ (self: ReadonlyArray, options: {
+ readonly onEmpty: LazyArg;
+ readonly onNonEmpty: (head: A, tail: Array) => C;
+ }): B | C;
+};
+/**
+ * Matches the elements of an array from the right, applying functions to cases of empty and non-empty arrays.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const matchRight = Array.matchRight({
+ * onEmpty: () => "empty",
+ * onNonEmpty: (init, last) => `init: ${init.length}, last: ${last}`
+ * })
+ * console.log(matchRight([])) // "empty"
+ * console.log(matchRight([1, 2, 3])) // "init: 2, last: 3"
+ * ```
+ *
+ * @category pattern matching
+ * @since 2.0.0
+ */
+export declare const matchRight: {
+ /**
+ * Matches the elements of an array from the right, applying functions to cases of empty and non-empty arrays.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const matchRight = Array.matchRight({
+ * onEmpty: () => "empty",
+ * onNonEmpty: (init, last) => `init: ${init.length}, last: ${last}`
+ * })
+ * console.log(matchRight([])) // "empty"
+ * console.log(matchRight([1, 2, 3])) // "init: 2, last: 3"
+ * ```
+ *
+ * @category pattern matching
+ * @since 2.0.0
+ */
+ (options: {
+ readonly onEmpty: LazyArg;
+ readonly onNonEmpty: (init: Array, last: A) => C;
+ }): (self: ReadonlyArray) => B | C;
+ /**
+ * Matches the elements of an array from the right, applying functions to cases of empty and non-empty arrays.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const matchRight = Array.matchRight({
+ * onEmpty: () => "empty",
+ * onNonEmpty: (init, last) => `init: ${init.length}, last: ${last}`
+ * })
+ * console.log(matchRight([])) // "empty"
+ * console.log(matchRight([1, 2, 3])) // "init: 2, last: 3"
+ * ```
+ *
+ * @category pattern matching
+ * @since 2.0.0
+ */
+ (self: ReadonlyArray, options: {
+ readonly onEmpty: LazyArg;
+ readonly onNonEmpty: (init: Array, last: A) => C;
+ }): B | C;
+};
+/**
+ * Prepend an element to the front of an `Iterable`, creating a new `NonEmptyArray`.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.prepend([2, 3, 4], 1)
+ * console.log(result) // [1, 2, 3, 4]
+ * ```
+ *
+ * @category concatenating
+ * @since 2.0.0
+ */
+export declare const prepend: {
+ /**
+ * Prepend an element to the front of an `Iterable`, creating a new `NonEmptyArray`.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.prepend([2, 3, 4], 1)
+ * console.log(result) // [1, 2, 3, 4]
+ * ```
+ *
+ * @category concatenating
+ * @since 2.0.0
+ */
+ (head: B): (self: Iterable) => NonEmptyArray;
+ /**
+ * Prepend an element to the front of an `Iterable`, creating a new `NonEmptyArray`.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.prepend([2, 3, 4], 1)
+ * console.log(result) // [1, 2, 3, 4]
+ * ```
+ *
+ * @category concatenating
+ * @since 2.0.0
+ */
+ (self: Iterable, head: B): NonEmptyArray;
+};
+/**
+ * Prepends the specified prefix array (or iterable) to the beginning of the specified array (or iterable).
+ * If either array is non-empty, the result is also a non-empty array.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.prependAll([2, 3], [0, 1])
+ * console.log(result) // [0, 1, 2, 3]
+ * ```
+ *
+ * @category concatenating
+ * @since 2.0.0
+ */
+export declare const prependAll: {
+ /**
+ * Prepends the specified prefix array (or iterable) to the beginning of the specified array (or iterable).
+ * If either array is non-empty, the result is also a non-empty array.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.prependAll([2, 3], [0, 1])
+ * console.log(result) // [0, 1, 2, 3]
+ * ```
+ *
+ * @category concatenating
+ * @since 2.0.0
+ */
+ , T extends Iterable>(that: T): (self: S) => ReadonlyArray.OrNonEmpty | ReadonlyArray.Infer>;
+ /**
+ * Prepends the specified prefix array (or iterable) to the beginning of the specified array (or iterable).
+ * If either array is non-empty, the result is also a non-empty array.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.prependAll([2, 3], [0, 1])
+ * console.log(result) // [0, 1, 2, 3]
+ * ```
+ *
+ * @category concatenating
+ * @since 2.0.0
+ */
+ (self: Iterable, that: NonEmptyReadonlyArray): NonEmptyArray;
+ /**
+ * Prepends the specified prefix array (or iterable) to the beginning of the specified array (or iterable).
+ * If either array is non-empty, the result is also a non-empty array.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.prependAll([2, 3], [0, 1])
+ * console.log(result) // [0, 1, 2, 3]
+ * ```
+ *
+ * @category concatenating
+ * @since 2.0.0
+ */
+ (self: NonEmptyReadonlyArray, that: Iterable): NonEmptyArray;
+ /**
+ * Prepends the specified prefix array (or iterable) to the beginning of the specified array (or iterable).
+ * If either array is non-empty, the result is also a non-empty array.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.prependAll([2, 3], [0, 1])
+ * console.log(result) // [0, 1, 2, 3]
+ * ```
+ *
+ * @category concatenating
+ * @since 2.0.0
+ */
+ (self: Iterable, that: Iterable): Array;
+};
+/**
+ * Append an element to the end of an `Iterable`, creating a new `NonEmptyArray`.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.append([1, 2, 3], 4);
+ * console.log(result) // [1, 2, 3, 4]
+ * ```
+ *
+ * @category concatenating
+ * @since 2.0.0
+ */
+export declare const append: {
+ /**
+ * Append an element to the end of an `Iterable`, creating a new `NonEmptyArray`.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.append([1, 2, 3], 4);
+ * console.log(result) // [1, 2, 3, 4]
+ * ```
+ *
+ * @category concatenating
+ * @since 2.0.0
+ */
+ (last: B): (self: Iterable) => NonEmptyArray;
+ /**
+ * Append an element to the end of an `Iterable`, creating a new `NonEmptyArray`.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.append([1, 2, 3], 4);
+ * console.log(result) // [1, 2, 3, 4]
+ * ```
+ *
+ * @category concatenating
+ * @since 2.0.0
+ */
+ (self: Iterable, last: B): NonEmptyArray;
+};
+/**
+ * Concatenates two arrays (or iterables), combining their elements.
+ * If either array is non-empty, the result is also a non-empty array.
+ *
+ * @category concatenating
+ * @since 2.0.0
+ */
+export declare const appendAll: {
+ /**
+ * Concatenates two arrays (or iterables), combining their elements.
+ * If either array is non-empty, the result is also a non-empty array.
+ *
+ * @category concatenating
+ * @since 2.0.0
+ */
+ , T extends Iterable>(that: T): (self: S) => ReadonlyArray.OrNonEmpty | ReadonlyArray.Infer>;
+ /**
+ * Concatenates two arrays (or iterables), combining their elements.
+ * If either array is non-empty, the result is also a non-empty array.
+ *
+ * @category concatenating
+ * @since 2.0.0
+ */
+ (self: Iterable, that: NonEmptyReadonlyArray): NonEmptyArray;
+ /**
+ * Concatenates two arrays (or iterables), combining their elements.
+ * If either array is non-empty, the result is also a non-empty array.
+ *
+ * @category concatenating
+ * @since 2.0.0
+ */
+ (self: NonEmptyReadonlyArray, that: Iterable): NonEmptyArray;
+ /**
+ * Concatenates two arrays (or iterables), combining their elements.
+ * If either array is non-empty, the result is also a non-empty array.
+ *
+ * @category concatenating
+ * @since 2.0.0
+ */
+ (self: Iterable, that: Iterable): Array;
+};
+/**
+ * Accumulates values from an `Iterable` starting from the left, storing
+ * each intermediate result in an array. Useful for tracking the progression of
+ * a value through a series of transformations.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect";
+ *
+ * const result = Array.scan([1, 2, 3, 4], 0, (acc, value) => acc + value)
+ * console.log(result) // [0, 1, 3, 6, 10]
+ *
+ * // Explanation:
+ * // This function starts with the initial value (0 in this case)
+ * // and adds each element of the array to this accumulator one by one,
+ * // keeping track of the cumulative sum after each addition.
+ * // Each of these sums is captured in the resulting array.
+ * ```
+ *
+ * @category folding
+ * @since 2.0.0
+ */
+export declare const scan: {
+ /**
+ * Accumulates values from an `Iterable` starting from the left, storing
+ * each intermediate result in an array. Useful for tracking the progression of
+ * a value through a series of transformations.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect";
+ *
+ * const result = Array.scan([1, 2, 3, 4], 0, (acc, value) => acc + value)
+ * console.log(result) // [0, 1, 3, 6, 10]
+ *
+ * // Explanation:
+ * // This function starts with the initial value (0 in this case)
+ * // and adds each element of the array to this accumulator one by one,
+ * // keeping track of the cumulative sum after each addition.
+ * // Each of these sums is captured in the resulting array.
+ * ```
+ *
+ * @category folding
+ * @since 2.0.0
+ */
+ (b: B, f: (b: B, a: A) => B): (self: Iterable) => NonEmptyArray;
+ /**
+ * Accumulates values from an `Iterable` starting from the left, storing
+ * each intermediate result in an array. Useful for tracking the progression of
+ * a value through a series of transformations.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect";
+ *
+ * const result = Array.scan([1, 2, 3, 4], 0, (acc, value) => acc + value)
+ * console.log(result) // [0, 1, 3, 6, 10]
+ *
+ * // Explanation:
+ * // This function starts with the initial value (0 in this case)
+ * // and adds each element of the array to this accumulator one by one,
+ * // keeping track of the cumulative sum after each addition.
+ * // Each of these sums is captured in the resulting array.
+ * ```
+ *
+ * @category folding
+ * @since 2.0.0
+ */
+ (self: Iterable, b: B, f: (b: B, a: A) => B): NonEmptyArray;
+};
+/**
+ * Accumulates values from an `Iterable` starting from the right, storing
+ * each intermediate result in an array. Useful for tracking the progression of
+ * a value through a series of transformations.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect";
+ *
+ * const result = Array.scanRight([1, 2, 3, 4], 0, (acc, value) => acc + value)
+ * console.log(result) // [10, 9, 7, 4, 0]
+ * ```
+ *
+ * @category folding
+ * @since 2.0.0
+ */
+export declare const scanRight: {
+ /**
+ * Accumulates values from an `Iterable` starting from the right, storing
+ * each intermediate result in an array. Useful for tracking the progression of
+ * a value through a series of transformations.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect";
+ *
+ * const result = Array.scanRight([1, 2, 3, 4], 0, (acc, value) => acc + value)
+ * console.log(result) // [10, 9, 7, 4, 0]
+ * ```
+ *
+ * @category folding
+ * @since 2.0.0
+ */
+ (b: B, f: (b: B, a: A) => B): (self: Iterable) => NonEmptyArray;
+ /**
+ * Accumulates values from an `Iterable` starting from the right, storing
+ * each intermediate result in an array. Useful for tracking the progression of
+ * a value through a series of transformations.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect";
+ *
+ * const result = Array.scanRight([1, 2, 3, 4], 0, (acc, value) => acc + value)
+ * console.log(result) // [10, 9, 7, 4, 0]
+ * ```
+ *
+ * @category folding
+ * @since 2.0.0
+ */
+ (self: Iterable, b: B, f: (b: B, a: A) => B): NonEmptyArray;
+};
+/**
+ * Determine if `unknown` is an Array.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * console.log(Array.isArray(null)) // false
+ * console.log(Array.isArray([1, 2, 3])) // true
+ * ```
+ *
+ * @category guards
+ * @since 2.0.0
+ */
+export declare const isArray: {
+ /**
+ * Determine if `unknown` is an Array.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * console.log(Array.isArray(null)) // false
+ * console.log(Array.isArray([1, 2, 3])) // true
+ * ```
+ *
+ * @category guards
+ * @since 2.0.0
+ */
+ (self: unknown): self is Array;
+ /**
+ * Determine if `unknown` is an Array.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * console.log(Array.isArray(null)) // false
+ * console.log(Array.isArray([1, 2, 3])) // true
+ * ```
+ *
+ * @category guards
+ * @since 2.0.0
+ */
+ (self: T): self is Extract>;
+};
+/**
+ * Determine if an `Array` is empty narrowing down the type to `[]`.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * console.log(Array.isEmptyArray([])) // true
+ * console.log(Array.isEmptyArray([1, 2, 3])) // false
+ * ```
+ *
+ * @category guards
+ * @since 2.0.0
+ */
+export declare const isEmptyArray: (self: Array) => self is [];
+/**
+ * Determine if a `ReadonlyArray` is empty narrowing down the type to `readonly []`.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * console.log(Array.isEmptyReadonlyArray([])) // true
+ * console.log(Array.isEmptyReadonlyArray([1, 2, 3])) // false
+ * ```
+ *
+ * @category guards
+ * @since 2.0.0
+ */
+export declare const isEmptyReadonlyArray: (self: ReadonlyArray) => self is readonly [];
+/**
+ * Determine if an `Array` is non empty narrowing down the type to `NonEmptyArray`.
+ *
+ * An `Array` is considered to be a `NonEmptyArray` if it contains at least one element.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * console.log(Array.isNonEmptyArray([])) // false
+ * console.log(Array.isNonEmptyArray([1, 2, 3])) // true
+ * ```
+ *
+ * @category guards
+ * @since 2.0.0
+ */
+export declare const isNonEmptyArray: (self: Array) => self is NonEmptyArray;
+/**
+ * Determine if a `ReadonlyArray` is non empty narrowing down the type to `NonEmptyReadonlyArray`.
+ *
+ * A `ReadonlyArray` is considered to be a `NonEmptyReadonlyArray` if it contains at least one element.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * console.log(Array.isNonEmptyReadonlyArray([])) // false
+ * console.log(Array.isNonEmptyReadonlyArray([1, 2, 3])) // true
+ * ```
+ *
+ * @category guards
+ * @since 2.0.0
+ */
+export declare const isNonEmptyReadonlyArray: (self: ReadonlyArray) => self is NonEmptyReadonlyArray;
+/**
+ * Return the number of elements in a `ReadonlyArray`.
+ *
+ * @category getters
+ * @since 2.0.0
+ */
+export declare const length: (self: ReadonlyArray) => number;
+/**
+ * This function provides a safe way to read a value at a particular index from a `ReadonlyArray`.
+ *
+ * @category getters
+ * @since 2.0.0
+ */
+export declare const get: {
+ /**
+ * This function provides a safe way to read a value at a particular index from a `ReadonlyArray`.
+ *
+ * @category getters
+ * @since 2.0.0
+ */
+ (index: number): (self: ReadonlyArray) => Option.Option;
+ /**
+ * This function provides a safe way to read a value at a particular index from a `ReadonlyArray`.
+ *
+ * @category getters
+ * @since 2.0.0
+ */
+ (self: ReadonlyArray, index: number): Option.Option;
+};
+/**
+ * Gets an element unsafely, will throw on out of bounds.
+ *
+ * @since 2.0.0
+ * @category unsafe
+ */
+export declare const unsafeGet: {
+ /**
+ * Gets an element unsafely, will throw on out of bounds.
+ *
+ * @since 2.0.0
+ * @category unsafe
+ */
+ (index: number): (self: ReadonlyArray) => A;
+ /**
+ * Gets an element unsafely, will throw on out of bounds.
+ *
+ * @since 2.0.0
+ * @category unsafe
+ */
+ (self: ReadonlyArray, index: number): A;
+};
+/**
+ * Return a tuple containing the first element, and a new `Array` of the remaining elements, if any.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect";
+ *
+ * const result = Array.unprepend([1, 2, 3, 4])
+ * console.log(result) // [1, [2, 3, 4]]
+ * ```
+ *
+ * @category splitting
+ * @since 2.0.0
+ */
+export declare const unprepend: (self: NonEmptyReadonlyArray) => [firstElement: A, remainingElements: Array];
+/**
+ * Return a tuple containing a copy of the `NonEmptyReadonlyArray` without its last element, and that last element.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect";
+ *
+ * const result = Array.unappend([1, 2, 3, 4])
+ * console.log(result) // [[1, 2, 3], 4]
+ * ```
+ *
+ * @category splitting
+ * @since 2.0.0
+ */
+export declare const unappend: (self: NonEmptyReadonlyArray) => [arrayWithoutLastElement: Array, lastElement: A];
+/**
+ * Get the first element of a `ReadonlyArray`, or `None` if the `ReadonlyArray` is empty.
+ *
+ * @category getters
+ * @since 2.0.0
+ */
+export declare const head: (self: ReadonlyArray) => Option.Option;
+/**
+ * Get the first element of a non empty array.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.headNonEmpty([1, 2, 3, 4])
+ * console.log(result) // 1
+ * ```
+ *
+ * @category getters
+ * @since 2.0.0
+ */
+export declare const headNonEmpty: (self: NonEmptyReadonlyArray) => A;
+/**
+ * Get the last element in a `ReadonlyArray`, or `None` if the `ReadonlyArray` is empty.
+ *
+ * @category getters
+ * @since 2.0.0
+ */
+export declare const last: (self: ReadonlyArray) => Option.Option;
+/**
+ * Get the last element of a non empty array.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.lastNonEmpty([1, 2, 3, 4])
+ * console.log(result) // 4
+ * ```
+ *
+ * @category getters
+ * @since 2.0.0
+ */
+export declare const lastNonEmpty: (self: NonEmptyReadonlyArray) => A;
+/**
+ * Get all but the first element of an `Iterable`, creating a new `Array`, or `None` if the `Iterable` is empty.
+ *
+ * @category getters
+ * @since 2.0.0
+ */
+export declare const tail: (self: Iterable) => Option.Option>;
+/**
+ * Get all but the first element of a `NonEmptyReadonlyArray`.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.tailNonEmpty([1, 2, 3, 4])
+ * console.log(result) // [2, 3, 4]
+ * ```
+ *
+ * @category getters
+ * @since 2.0.0
+ */
+export declare const tailNonEmpty: (self: NonEmptyReadonlyArray) => Array;
+/**
+ * Get all but the last element of an `Iterable`, creating a new `Array`, or `None` if the `Iterable` is empty.
+ *
+ * @category getters
+ * @since 2.0.0
+ */
+export declare const init: (self: Iterable) => Option.Option>;
+/**
+ * Get all but the last element of a non empty array, creating a new array.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.initNonEmpty([1, 2, 3, 4])
+ * console.log(result) // [1, 2, 3]
+ * ```
+ *
+ * @category getters
+ * @since 2.0.0
+ */
+export declare const initNonEmpty: (self: NonEmptyReadonlyArray) => Array;
+/**
+ * Keep only a max number of elements from the start of an `Iterable`, creating a new `Array`.
+ *
+ * **Note**. `n` is normalized to a non negative integer.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.take([1, 2, 3, 4, 5], 3)
+ * console.log(result) // [1, 2, 3]
+ * ```
+ *
+ * @category getters
+ * @since 2.0.0
+ */
+export declare const take: {
+ /**
+ * Keep only a max number of elements from the start of an `Iterable`, creating a new `Array`.
+ *
+ * **Note**. `n` is normalized to a non negative integer.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.take([1, 2, 3, 4, 5], 3)
+ * console.log(result) // [1, 2, 3]
+ * ```
+ *
+ * @category getters
+ * @since 2.0.0
+ */
+ (n: number): (self: Iterable) => Array;
+ /**
+ * Keep only a max number of elements from the start of an `Iterable`, creating a new `Array`.
+ *
+ * **Note**. `n` is normalized to a non negative integer.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.take([1, 2, 3, 4, 5], 3)
+ * console.log(result) // [1, 2, 3]
+ * ```
+ *
+ * @category getters
+ * @since 2.0.0
+ */
+ (self: Iterable, n: number): Array;
+};
+/**
+ * Keep only a max number of elements from the end of an `Iterable`, creating a new `Array`.
+ *
+ * **Note**. `n` is normalized to a non negative integer.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.takeRight([1, 2, 3, 4, 5], 3)
+ * console.log(result) // [3, 4, 5]
+ * ```
+ *
+ * @category getters
+ * @since 2.0.0
+ */
+export declare const takeRight: {
+ /**
+ * Keep only a max number of elements from the end of an `Iterable`, creating a new `Array`.
+ *
+ * **Note**. `n` is normalized to a non negative integer.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.takeRight([1, 2, 3, 4, 5], 3)
+ * console.log(result) // [3, 4, 5]
+ * ```
+ *
+ * @category getters
+ * @since 2.0.0
+ */
+ (n: number): (self: Iterable) => Array;
+ /**
+ * Keep only a max number of elements from the end of an `Iterable`, creating a new `Array`.
+ *
+ * **Note**. `n` is normalized to a non negative integer.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.takeRight([1, 2, 3, 4, 5], 3)
+ * console.log(result) // [3, 4, 5]
+ * ```
+ *
+ * @category getters
+ * @since 2.0.0
+ */
+ (self: Iterable, n: number): Array;
+};
+/**
+ * Calculate the longest initial subarray for which all element satisfy the specified predicate, creating a new `Array`.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.takeWhile([1, 3, 2, 4, 1, 2], x => x < 4)
+ * console.log(result) // [1, 3, 2]
+ *
+ * // Explanation:
+ * // - The function starts with the first element (`1`), which is less than `4`, so it adds `1` to the result.
+ * // - The next element (`3`) is also less than `4`, so it adds `3`.
+ * // - The next element (`2`) is again less than `4`, so it adds `2`.
+ * // - The function then encounters `4`, which is not less than `4`. At this point, it stops checking further elements and finalizes the result.
+ * ```
+ *
+ * @category getters
+ * @since 2.0.0
+ */
+export declare const takeWhile: {
+ /**
+ * Calculate the longest initial subarray for which all element satisfy the specified predicate, creating a new `Array`.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.takeWhile([1, 3, 2, 4, 1, 2], x => x < 4)
+ * console.log(result) // [1, 3, 2]
+ *
+ * // Explanation:
+ * // - The function starts with the first element (`1`), which is less than `4`, so it adds `1` to the result.
+ * // - The next element (`3`) is also less than `4`, so it adds `3`.
+ * // - The next element (`2`) is again less than `4`, so it adds `2`.
+ * // - The function then encounters `4`, which is not less than `4`. At this point, it stops checking further elements and finalizes the result.
+ * ```
+ *
+ * @category getters
+ * @since 2.0.0
+ */
+ (refinement: (a: NoInfer, i: number) => a is B): (self: Iterable) => Array;
+ /**
+ * Calculate the longest initial subarray for which all element satisfy the specified predicate, creating a new `Array`.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.takeWhile([1, 3, 2, 4, 1, 2], x => x < 4)
+ * console.log(result) // [1, 3, 2]
+ *
+ * // Explanation:
+ * // - The function starts with the first element (`1`), which is less than `4`, so it adds `1` to the result.
+ * // - The next element (`3`) is also less than `4`, so it adds `3`.
+ * // - The next element (`2`) is again less than `4`, so it adds `2`.
+ * // - The function then encounters `4`, which is not less than `4`. At this point, it stops checking further elements and finalizes the result.
+ * ```
+ *
+ * @category getters
+ * @since 2.0.0
+ */
+ (predicate: (a: NoInfer, i: number) => boolean): (self: Iterable) => Array;
+ /**
+ * Calculate the longest initial subarray for which all element satisfy the specified predicate, creating a new `Array`.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.takeWhile([1, 3, 2, 4, 1, 2], x => x < 4)
+ * console.log(result) // [1, 3, 2]
+ *
+ * // Explanation:
+ * // - The function starts with the first element (`1`), which is less than `4`, so it adds `1` to the result.
+ * // - The next element (`3`) is also less than `4`, so it adds `3`.
+ * // - The next element (`2`) is again less than `4`, so it adds `2`.
+ * // - The function then encounters `4`, which is not less than `4`. At this point, it stops checking further elements and finalizes the result.
+ * ```
+ *
+ * @category getters
+ * @since 2.0.0
+ */
+ (self: Iterable, refinement: (a: A, i: number) => a is B): Array;
+ /**
+ * Calculate the longest initial subarray for which all element satisfy the specified predicate, creating a new `Array`.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.takeWhile([1, 3, 2, 4, 1, 2], x => x < 4)
+ * console.log(result) // [1, 3, 2]
+ *
+ * // Explanation:
+ * // - The function starts with the first element (`1`), which is less than `4`, so it adds `1` to the result.
+ * // - The next element (`3`) is also less than `4`, so it adds `3`.
+ * // - The next element (`2`) is again less than `4`, so it adds `2`.
+ * // - The function then encounters `4`, which is not less than `4`. At this point, it stops checking further elements and finalizes the result.
+ * ```
+ *
+ * @category getters
+ * @since 2.0.0
+ */
+ (self: Iterable, predicate: (a: A, i: number) => boolean): Array;
+};
+/**
+ * Split an `Iterable` into two parts:
+ *
+ * 1. the longest initial subarray for which all elements satisfy the specified predicate
+ * 2. the remaining elements
+ *
+ * @category splitting
+ * @since 2.0.0
+ */
+export declare const span: {
+ /**
+ * Split an `Iterable` into two parts:
+ *
+ * 1. the longest initial subarray for which all elements satisfy the specified predicate
+ * 2. the remaining elements
+ *
+ * @category splitting
+ * @since 2.0.0
+ */
+ (refinement: (a: NoInfer, i: number) => a is B): (self: Iterable) => [init: Array, rest: Array>];
+ /**
+ * Split an `Iterable` into two parts:
+ *
+ * 1. the longest initial subarray for which all elements satisfy the specified predicate
+ * 2. the remaining elements
+ *
+ * @category splitting
+ * @since 2.0.0
+ */
+ (predicate: (a: NoInfer, i: number) => boolean): (self: Iterable) => [init: Array, rest: Array];
+ /**
+ * Split an `Iterable` into two parts:
+ *
+ * 1. the longest initial subarray for which all elements satisfy the specified predicate
+ * 2. the remaining elements
+ *
+ * @category splitting
+ * @since 2.0.0
+ */
+ (self: Iterable, refinement: (a: A, i: number) => a is B): [init: Array, rest: Array>];
+ /**
+ * Split an `Iterable` into two parts:
+ *
+ * 1. the longest initial subarray for which all elements satisfy the specified predicate
+ * 2. the remaining elements
+ *
+ * @category splitting
+ * @since 2.0.0
+ */
+ (self: Iterable, predicate: (a: A, i: number) => boolean): [init: Array, rest: Array];
+};
+/**
+ * Drop a max number of elements from the start of an `Iterable`, creating a new `Array`.
+ *
+ * **Note**. `n` is normalized to a non negative integer.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.drop([1, 2, 3, 4, 5], 2)
+ * console.log(result) // [3, 4, 5]
+ * ```
+ *
+ * @category getters
+ * @since 2.0.0
+ */
+export declare const drop: {
+ /**
+ * Drop a max number of elements from the start of an `Iterable`, creating a new `Array`.
+ *
+ * **Note**. `n` is normalized to a non negative integer.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.drop([1, 2, 3, 4, 5], 2)
+ * console.log(result) // [3, 4, 5]
+ * ```
+ *
+ * @category getters
+ * @since 2.0.0
+ */
+ (n: number): (self: Iterable) => Array;
+ /**
+ * Drop a max number of elements from the start of an `Iterable`, creating a new `Array`.
+ *
+ * **Note**. `n` is normalized to a non negative integer.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.drop([1, 2, 3, 4, 5], 2)
+ * console.log(result) // [3, 4, 5]
+ * ```
+ *
+ * @category getters
+ * @since 2.0.0
+ */
+ (self: Iterable, n: number): Array;
+};
+/**
+ * Drop a max number of elements from the end of an `Iterable`, creating a new `Array`.
+ *
+ * **Note**. `n` is normalized to a non negative integer.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.dropRight([1, 2, 3, 4, 5], 2)
+ * console.log(result) // [1, 2, 3]
+ * ```
+ *
+ * @category getters
+ * @since 2.0.0
+ */
+export declare const dropRight: {
+ /**
+ * Drop a max number of elements from the end of an `Iterable`, creating a new `Array`.
+ *
+ * **Note**. `n` is normalized to a non negative integer.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.dropRight([1, 2, 3, 4, 5], 2)
+ * console.log(result) // [1, 2, 3]
+ * ```
+ *
+ * @category getters
+ * @since 2.0.0
+ */
+ (n: number): (self: Iterable) => Array;
+ /**
+ * Drop a max number of elements from the end of an `Iterable`, creating a new `Array`.
+ *
+ * **Note**. `n` is normalized to a non negative integer.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.dropRight([1, 2, 3, 4, 5], 2)
+ * console.log(result) // [1, 2, 3]
+ * ```
+ *
+ * @category getters
+ * @since 2.0.0
+ */
+ (self: Iterable, n: number): Array;
+};
+/**
+ * Remove the longest initial subarray for which all element satisfy the specified predicate, creating a new `Array`.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.dropWhile([1, 2, 3, 4, 5], x => x < 4)
+ * console.log(result) // [4, 5]
+ * ```
+ *
+ * @category getters
+ * @since 2.0.0
+ */
+export declare const dropWhile: {
+ /**
+ * Remove the longest initial subarray for which all element satisfy the specified predicate, creating a new `Array`.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.dropWhile([1, 2, 3, 4, 5], x => x < 4)
+ * console.log(result) // [4, 5]
+ * ```
+ *
+ * @category getters
+ * @since 2.0.0
+ */
+ (predicate: (a: NoInfer, i: number) => boolean): (self: Iterable) => Array;
+ /**
+ * Remove the longest initial subarray for which all element satisfy the specified predicate, creating a new `Array`.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.dropWhile([1, 2, 3, 4, 5], x => x < 4)
+ * console.log(result) // [4, 5]
+ * ```
+ *
+ * @category getters
+ * @since 2.0.0
+ */
+ (self: Iterable, predicate: (a: A, i: number) => boolean): Array;
+};
+/**
+ * Return the first index for which a predicate holds.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.findFirstIndex([5, 3, 8, 9], x => x > 5)
+ * console.log(result) // Option.some(2)
+ * ```
+ *
+ * @category elements
+ * @since 2.0.0
+ */
+export declare const findFirstIndex: {
+ /**
+ * Return the first index for which a predicate holds.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.findFirstIndex([5, 3, 8, 9], x => x > 5)
+ * console.log(result) // Option.some(2)
+ * ```
+ *
+ * @category elements
+ * @since 2.0.0
+ */
+ (predicate: (a: NoInfer, i: number) => boolean): (self: Iterable) => Option.Option;
+ /**
+ * Return the first index for which a predicate holds.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.findFirstIndex([5, 3, 8, 9], x => x > 5)
+ * console.log(result) // Option.some(2)
+ * ```
+ *
+ * @category elements
+ * @since 2.0.0
+ */
+ (self: Iterable, predicate: (a: A, i: number) => boolean): Option.Option;
+};
+/**
+ * Return the last index for which a predicate holds.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.findLastIndex([1, 3, 8, 9], x => x < 5)
+ * console.log(result) // Option.some(1)
+ * ```
+ *
+ * @category elements
+ * @since 2.0.0
+ */
+export declare const findLastIndex: {
+ /**
+ * Return the last index for which a predicate holds.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.findLastIndex([1, 3, 8, 9], x => x < 5)
+ * console.log(result) // Option.some(1)
+ * ```
+ *
+ * @category elements
+ * @since 2.0.0
+ */
+ (predicate: (a: NoInfer, i: number) => boolean): (self: Iterable) => Option.Option;
+ /**
+ * Return the last index for which a predicate holds.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.findLastIndex([1, 3, 8, 9], x => x < 5)
+ * console.log(result) // Option.some(1)
+ * ```
+ *
+ * @category elements
+ * @since 2.0.0
+ */
+ (self: Iterable, predicate: (a: A, i: number) => boolean): Option.Option;
+};
+/**
+ * Returns the first element that satisfies the specified
+ * predicate, or `None` if no such element exists.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.findFirst([1, 2, 3, 4, 5], x => x > 3)
+ * console.log(result) // Option.some(4)
+ * ```
+ *
+ * @category elements
+ * @since 2.0.0
+ */
+export declare const findFirst: {
+ /**
+ * Returns the first element that satisfies the specified
+ * predicate, or `None` if no such element exists.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.findFirst([1, 2, 3, 4, 5], x => x > 3)
+ * console.log(result) // Option.some(4)
+ * ```
+ *
+ * @category elements
+ * @since 2.0.0
+ */
+ (f: (a: NoInfer, i: number) => Option.Option): (self: Iterable) => Option.Option;
+ /**
+ * Returns the first element that satisfies the specified
+ * predicate, or `None` if no such element exists.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.findFirst([1, 2, 3, 4, 5], x => x > 3)
+ * console.log(result) // Option.some(4)
+ * ```
+ *
+ * @category elements
+ * @since 2.0.0
+ */
+ (refinement: (a: NoInfer, i: number) => a is B): (self: Iterable) => Option.Option;
+ /**
+ * Returns the first element that satisfies the specified
+ * predicate, or `None` if no such element exists.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.findFirst([1, 2, 3, 4, 5], x => x > 3)
+ * console.log(result) // Option.some(4)
+ * ```
+ *
+ * @category elements
+ * @since 2.0.0
+ */
+ (predicate: (a: NoInfer, i: number) => boolean): (self: Iterable) => Option.Option;
+ /**
+ * Returns the first element that satisfies the specified
+ * predicate, or `None` if no such element exists.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.findFirst([1, 2, 3, 4, 5], x => x > 3)
+ * console.log(result) // Option.some(4)
+ * ```
+ *
+ * @category elements
+ * @since 2.0.0
+ */
+ (self: Iterable, f: (a: A, i: number) => Option.Option): Option.Option;
+ /**
+ * Returns the first element that satisfies the specified
+ * predicate, or `None` if no such element exists.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.findFirst([1, 2, 3, 4, 5], x => x > 3)
+ * console.log(result) // Option.some(4)
+ * ```
+ *
+ * @category elements
+ * @since 2.0.0
+ */
+ (self: Iterable, refinement: (a: A, i: number) => a is B): Option.Option;
+ /**
+ * Returns the first element that satisfies the specified
+ * predicate, or `None` if no such element exists.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.findFirst([1, 2, 3, 4, 5], x => x > 3)
+ * console.log(result) // Option.some(4)
+ * ```
+ *
+ * @category elements
+ * @since 2.0.0
+ */
+ (self: Iterable, predicate: (a: A, i: number) => boolean): Option.Option;
+};
+/**
+ * Finds the last element in an iterable collection that satisfies the given predicate or refinement.
+ * Returns an `Option` containing the found element, or `Option.none` if no element matches.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.findLast([1, 2, 3, 4, 5], n => n % 2 === 0)
+ * console.log(result) // Option.some(4)
+ * ```
+ *
+ * @category elements
+ * @since 2.0.0
+ */
+export declare const findLast: {
+ /**
+ * Finds the last element in an iterable collection that satisfies the given predicate or refinement.
+ * Returns an `Option` containing the found element, or `Option.none` if no element matches.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.findLast([1, 2, 3, 4, 5], n => n % 2 === 0)
+ * console.log(result) // Option.some(4)
+ * ```
+ *
+ * @category elements
+ * @since 2.0.0
+ */
+ (f: (a: NoInfer, i: number) => Option.Option): (self: Iterable) => Option.Option;
+ /**
+ * Finds the last element in an iterable collection that satisfies the given predicate or refinement.
+ * Returns an `Option` containing the found element, or `Option.none` if no element matches.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.findLast([1, 2, 3, 4, 5], n => n % 2 === 0)
+ * console.log(result) // Option.some(4)
+ * ```
+ *
+ * @category elements
+ * @since 2.0.0
+ */
+ (refinement: (a: NoInfer, i: number) => a is B): (self: Iterable) => Option.Option;
+ /**
+ * Finds the last element in an iterable collection that satisfies the given predicate or refinement.
+ * Returns an `Option` containing the found element, or `Option.none` if no element matches.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.findLast([1, 2, 3, 4, 5], n => n % 2 === 0)
+ * console.log(result) // Option.some(4)
+ * ```
+ *
+ * @category elements
+ * @since 2.0.0
+ */
+ (predicate: (a: NoInfer, i: number) => boolean): (self: Iterable) => Option.Option;
+ /**
+ * Finds the last element in an iterable collection that satisfies the given predicate or refinement.
+ * Returns an `Option` containing the found element, or `Option.none` if no element matches.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.findLast([1, 2, 3, 4, 5], n => n % 2 === 0)
+ * console.log(result) // Option.some(4)
+ * ```
+ *
+ * @category elements
+ * @since 2.0.0
+ */
+ (self: Iterable, f: (a: A, i: number) => Option.Option): Option.Option;
+ /**
+ * Finds the last element in an iterable collection that satisfies the given predicate or refinement.
+ * Returns an `Option` containing the found element, or `Option.none` if no element matches.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.findLast([1, 2, 3, 4, 5], n => n % 2 === 0)
+ * console.log(result) // Option.some(4)
+ * ```
+ *
+ * @category elements
+ * @since 2.0.0
+ */
+ (self: Iterable, refinement: (a: A, i: number) => a is B): Option.Option;
+ /**
+ * Finds the last element in an iterable collection that satisfies the given predicate or refinement.
+ * Returns an `Option` containing the found element, or `Option.none` if no element matches.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.findLast([1, 2, 3, 4, 5], n => n % 2 === 0)
+ * console.log(result) // Option.some(4)
+ * ```
+ *
+ * @category elements
+ * @since 2.0.0
+ */
+ (self: Iterable, predicate: (a: A, i: number) => boolean): Option.Option;
+};
+/**
+ * Returns a tuple of the first element that satisfies the specified
+ * predicate and its index, or `None` if no such element exists.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.findFirstWithIndex([1, 2, 3, 4, 5], x => x > 3)
+ * console.log(result) // Option.some([4, 3])
+ * ```
+ *
+ * @category elements
+ * @since 3.17.0
+ */
+export declare const findFirstWithIndex: {
+ /**
+ * Returns a tuple of the first element that satisfies the specified
+ * predicate and its index, or `None` if no such element exists.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.findFirstWithIndex([1, 2, 3, 4, 5], x => x > 3)
+ * console.log(result) // Option.some([4, 3])
+ * ```
+ *
+ * @category elements
+ * @since 3.17.0
+ */
+ (f: (a: NoInfer, i: number) => Option.Option): (self: Iterable) => Option.Option<[B, number]>;
+ /**
+ * Returns a tuple of the first element that satisfies the specified
+ * predicate and its index, or `None` if no such element exists.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.findFirstWithIndex([1, 2, 3, 4, 5], x => x > 3)
+ * console.log(result) // Option.some([4, 3])
+ * ```
+ *
+ * @category elements
+ * @since 3.17.0
+ */
+ (refinement: (a: NoInfer, i: number) => a is B): (self: Iterable) => Option.Option<[B, number]>;
+ /**
+ * Returns a tuple of the first element that satisfies the specified
+ * predicate and its index, or `None` if no such element exists.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.findFirstWithIndex([1, 2, 3, 4, 5], x => x > 3)
+ * console.log(result) // Option.some([4, 3])
+ * ```
+ *
+ * @category elements
+ * @since 3.17.0
+ */
+ (predicate: (a: NoInfer, i: number) => boolean): (self: Iterable) => Option.Option<[A, number]>;
+ /**
+ * Returns a tuple of the first element that satisfies the specified
+ * predicate and its index, or `None` if no such element exists.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.findFirstWithIndex([1, 2, 3, 4, 5], x => x > 3)
+ * console.log(result) // Option.some([4, 3])
+ * ```
+ *
+ * @category elements
+ * @since 3.17.0
+ */
+ (self: Iterable, f: (a: A, i: number) => Option.Option): Option.Option<[B, number]>;
+ /**
+ * Returns a tuple of the first element that satisfies the specified
+ * predicate and its index, or `None` if no such element exists.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.findFirstWithIndex([1, 2, 3, 4, 5], x => x > 3)
+ * console.log(result) // Option.some([4, 3])
+ * ```
+ *
+ * @category elements
+ * @since 3.17.0
+ */
+ (self: Iterable, refinement: (a: A, i: number) => a is B): Option.Option<[B, number]>;
+ /**
+ * Returns a tuple of the first element that satisfies the specified
+ * predicate and its index, or `None` if no such element exists.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.findFirstWithIndex([1, 2, 3, 4, 5], x => x > 3)
+ * console.log(result) // Option.some([4, 3])
+ * ```
+ *
+ * @category elements
+ * @since 3.17.0
+ */
+ (self: Iterable, predicate: (a: A, i: number) => boolean): Option.Option<[A, number]>;
+};
+/**
+ * Counts all the element of the given array that pass the given predicate
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.countBy([1, 2, 3, 4, 5], n => n % 2 === 0)
+ * console.log(result) // 2
+ * ```
+ *
+ * @category folding
+ * @since 3.16.0
+ */
+export declare const countBy: {
+ /**
+ * Counts all the element of the given array that pass the given predicate
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.countBy([1, 2, 3, 4, 5], n => n % 2 === 0)
+ * console.log(result) // 2
+ * ```
+ *
+ * @category folding
+ * @since 3.16.0
+ */
+ (predicate: (a: NoInfer, i: number) => boolean): (self: Iterable) => number;
+ /**
+ * Counts all the element of the given array that pass the given predicate
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.countBy([1, 2, 3, 4, 5], n => n % 2 === 0)
+ * console.log(result) // 2
+ * ```
+ *
+ * @category folding
+ * @since 3.16.0
+ */
+ (self: Iterable, predicate: (a: A, i: number) => boolean): number;
+};
+/**
+ * Insert an element at the specified index, creating a new `NonEmptyArray`,
+ * or return `None` if the index is out of bounds.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.insertAt(['a', 'b', 'c', 'e'], 3, 'd')
+ * console.log(result) // Option.some(['a', 'b', 'c', 'd', 'e'])
+ * ```
+ *
+ * @since 2.0.0
+ */
+export declare const insertAt: {
+ /**
+ * Insert an element at the specified index, creating a new `NonEmptyArray`,
+ * or return `None` if the index is out of bounds.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.insertAt(['a', 'b', 'c', 'e'], 3, 'd')
+ * console.log(result) // Option.some(['a', 'b', 'c', 'd', 'e'])
+ * ```
+ *
+ * @since 2.0.0
+ */
+ (i: number, b: B): (self: Iterable) => Option.Option>;
+ /**
+ * Insert an element at the specified index, creating a new `NonEmptyArray`,
+ * or return `None` if the index is out of bounds.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.insertAt(['a', 'b', 'c', 'e'], 3, 'd')
+ * console.log(result) // Option.some(['a', 'b', 'c', 'd', 'e'])
+ * ```
+ *
+ * @since 2.0.0
+ */
+ (self: Iterable, i: number, b: B): Option.Option>;
+};
+/**
+ * Change the element at the specified index, creating a new `Array`,
+ * or return a copy of the input if the index is out of bounds.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.replace(['a', 'b', 'c', 'd'], 1, 'z')
+ * console.log(result) // ['a', 'z', 'c', 'd']
+ * ```
+ *
+ * @since 2.0.0
+ */
+export declare const replace: {
+ /**
+ * Change the element at the specified index, creating a new `Array`,
+ * or return a copy of the input if the index is out of bounds.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.replace(['a', 'b', 'c', 'd'], 1, 'z')
+ * console.log(result) // ['a', 'z', 'c', 'd']
+ * ```
+ *
+ * @since 2.0.0
+ */
+ (i: number, b: B): = Iterable>(self: S) => ReadonlyArray.With | B>;
+ /**
+ * Change the element at the specified index, creating a new `Array`,
+ * or return a copy of the input if the index is out of bounds.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.replace(['a', 'b', 'c', 'd'], 1, 'z')
+ * console.log(result) // ['a', 'z', 'c', 'd']
+ * ```
+ *
+ * @since 2.0.0
+ */
+ = Iterable>(self: S, i: number, b: B): ReadonlyArray.With | B>;
+};
+/**
+ * Replaces an element in an array with the given value, returning an option of the updated array.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.replaceOption([1, 2, 3], 1, 4)
+ * console.log(result) // Option.some([1, 4, 3])
+ * ```
+ *
+ * @since 2.0.0
+ */
+export declare const replaceOption: {
+ /**
+ * Replaces an element in an array with the given value, returning an option of the updated array.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.replaceOption([1, 2, 3], 1, 4)
+ * console.log(result) // Option.some([1, 4, 3])
+ * ```
+ *
+ * @since 2.0.0
+ */
+ (i: number, b: B): = Iterable>(self: S) => Option.Option | B>>;
+ /**
+ * Replaces an element in an array with the given value, returning an option of the updated array.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.replaceOption([1, 2, 3], 1, 4)
+ * console.log(result) // Option.some([1, 4, 3])
+ * ```
+ *
+ * @since 2.0.0
+ */
+ = Iterable>(self: S, i: number, b: B): Option.Option | B>>;
+};
+/**
+ * Apply a function to the element at the specified index, creating a new `Array`,
+ * or return a copy of the input if the index is out of bounds.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.modify([1, 2, 3, 4], 2, (n) => n * 2)
+ * console.log(result) // [1, 2, 6, 4]
+ * ```
+ *
+ * @since 2.0.0
+ */
+export declare const modify: {
+ /**
+ * Apply a function to the element at the specified index, creating a new `Array`,
+ * or return a copy of the input if the index is out of bounds.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.modify([1, 2, 3, 4], 2, (n) => n * 2)
+ * console.log(result) // [1, 2, 6, 4]
+ * ```
+ *
+ * @since 2.0.0
+ */
+ = Iterable>(i: number, f: (a: ReadonlyArray.Infer) => B): (self: S) => ReadonlyArray.With | B>;
+ /**
+ * Apply a function to the element at the specified index, creating a new `Array`,
+ * or return a copy of the input if the index is out of bounds.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.modify([1, 2, 3, 4], 2, (n) => n * 2)
+ * console.log(result) // [1, 2, 6, 4]
+ * ```
+ *
+ * @since 2.0.0
+ */
+ = Iterable>(self: S, i: number, f: (a: ReadonlyArray.Infer) => B): ReadonlyArray.With | B>;
+};
+/**
+ * Apply a function to the element at the specified index, creating a new `Array`,
+ * or return `None` if the index is out of bounds.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const input = [1, 2, 3, 4]
+ * const result = Array.modifyOption(input, 2, (n) => n * 2)
+ * console.log(result) // Option.some([1, 2, 6, 4])
+ *
+ * const outOfBoundsResult = Array.modifyOption(input, 5, (n) => n * 2)
+ * console.log(outOfBoundsResult) // Option.none()
+ * ```
+ *
+ * @since 2.0.0
+ */
+export declare const modifyOption: {
+ /**
+ * Apply a function to the element at the specified index, creating a new `Array`,
+ * or return `None` if the index is out of bounds.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const input = [1, 2, 3, 4]
+ * const result = Array.modifyOption(input, 2, (n) => n * 2)
+ * console.log(result) // Option.some([1, 2, 6, 4])
+ *
+ * const outOfBoundsResult = Array.modifyOption(input, 5, (n) => n * 2)
+ * console.log(outOfBoundsResult) // Option.none()
+ * ```
+ *
+ * @since 2.0.0
+ */
+ = Iterable>(i: number, f: (a: ReadonlyArray.Infer) => B): (self: S) => Option.Option | B>>;
+ /**
+ * Apply a function to the element at the specified index, creating a new `Array`,
+ * or return `None` if the index is out of bounds.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const input = [1, 2, 3, 4]
+ * const result = Array.modifyOption(input, 2, (n) => n * 2)
+ * console.log(result) // Option.some([1, 2, 6, 4])
+ *
+ * const outOfBoundsResult = Array.modifyOption(input, 5, (n) => n * 2)
+ * console.log(outOfBoundsResult) // Option.none()
+ * ```
+ *
+ * @since 2.0.0
+ */
+ = Iterable>(self: S, i: number, f: (a: ReadonlyArray.Infer) => B): Option.Option | B>>;
+};
+/**
+ * Delete the element at the specified index, creating a new `Array`,
+ * or return a copy of the input if the index is out of bounds.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const input = [1, 2, 3, 4]
+ * const result = Array.remove(input, 2)
+ * console.log(result) // [1, 2, 4]
+ *
+ * const outOfBoundsResult = Array.remove(input, 5)
+ * console.log(outOfBoundsResult) // [1, 2, 3, 4]
+ * ```
+ *
+ * @since 2.0.0
+ */
+export declare const remove: {
+ /**
+ * Delete the element at the specified index, creating a new `Array`,
+ * or return a copy of the input if the index is out of bounds.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const input = [1, 2, 3, 4]
+ * const result = Array.remove(input, 2)
+ * console.log(result) // [1, 2, 4]
+ *
+ * const outOfBoundsResult = Array.remove(input, 5)
+ * console.log(outOfBoundsResult) // [1, 2, 3, 4]
+ * ```
+ *
+ * @since 2.0.0
+ */
+ (i: number): (self: Iterable) => Array;
+ /**
+ * Delete the element at the specified index, creating a new `Array`,
+ * or return a copy of the input if the index is out of bounds.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const input = [1, 2, 3, 4]
+ * const result = Array.remove(input, 2)
+ * console.log(result) // [1, 2, 4]
+ *
+ * const outOfBoundsResult = Array.remove(input, 5)
+ * console.log(outOfBoundsResult) // [1, 2, 3, 4]
+ * ```
+ *
+ * @since 2.0.0
+ */
+ (self: Iterable, i: number): Array;
+};
+/**
+ * Delete the element at the specified index, creating a new `Array`,
+ * or return `None` if the index is out of bounds.
+ *
+ * @example
+ * ```ts
+ * import * as assert from "node:assert"
+ * import { Array, Option } from "effect"
+ *
+ * const numbers = [1, 2, 3, 4]
+ * const result = Array.removeOption(numbers, 2)
+ * assert.deepStrictEqual(result, Option.some([1, 2, 4]))
+ *
+ * const outOfBoundsResult = Array.removeOption(numbers, 5)
+ * assert.deepStrictEqual(outOfBoundsResult, Option.none())
+ * ```
+ *
+ * @since 3.16.0
+ */
+export declare const removeOption: {
+ /**
+ * Delete the element at the specified index, creating a new `Array`,
+ * or return `None` if the index is out of bounds.
+ *
+ * @example
+ * ```ts
+ * import * as assert from "node:assert"
+ * import { Array, Option } from "effect"
+ *
+ * const numbers = [1, 2, 3, 4]
+ * const result = Array.removeOption(numbers, 2)
+ * assert.deepStrictEqual(result, Option.some([1, 2, 4]))
+ *
+ * const outOfBoundsResult = Array.removeOption(numbers, 5)
+ * assert.deepStrictEqual(outOfBoundsResult, Option.none())
+ * ```
+ *
+ * @since 3.16.0
+ */
+ (i: number): (self: Iterable) => Option.Option>;
+ /**
+ * Delete the element at the specified index, creating a new `Array`,
+ * or return `None` if the index is out of bounds.
+ *
+ * @example
+ * ```ts
+ * import * as assert from "node:assert"
+ * import { Array, Option } from "effect"
+ *
+ * const numbers = [1, 2, 3, 4]
+ * const result = Array.removeOption(numbers, 2)
+ * assert.deepStrictEqual(result, Option.some([1, 2, 4]))
+ *
+ * const outOfBoundsResult = Array.removeOption(numbers, 5)
+ * assert.deepStrictEqual(outOfBoundsResult, Option.none())
+ * ```
+ *
+ * @since 3.16.0
+ */
+ (self: Iterable, i: number): Option.Option>;
+};
+/**
+ * Reverse an `Iterable`, creating a new `Array`.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.reverse([1, 2, 3, 4])
+ * console.log(result) // [4, 3, 2, 1]
+ * ```
+ *
+ * @category elements
+ * @since 2.0.0
+ */
+export declare const reverse: >(self: S) => S extends NonEmptyReadonlyArray ? NonEmptyArray : S extends Iterable ? Array : never;
+/**
+ * Create a new array with elements sorted in increasing order based on the specified comparator.
+ * If the input is a `NonEmptyReadonlyArray`, the output will also be a `NonEmptyReadonlyArray`.
+ *
+ * @category sorting
+ * @since 2.0.0
+ */
+export declare const sort: {
+ /**
+ * Create a new array with elements sorted in increasing order based on the specified comparator.
+ * If the input is a `NonEmptyReadonlyArray`, the output will also be a `NonEmptyReadonlyArray`.
+ *
+ * @category sorting
+ * @since 2.0.0
+ */
+ (O: Order.Order): >(self: S) => ReadonlyArray.With>;
+ /**
+ * Create a new array with elements sorted in increasing order based on the specified comparator.
+ * If the input is a `NonEmptyReadonlyArray`, the output will also be a `NonEmptyReadonlyArray`.
+ *
+ * @category sorting
+ * @since 2.0.0
+ */
+ (self: NonEmptyReadonlyArray, O: Order.Order): NonEmptyArray;
+ /**
+ * Create a new array with elements sorted in increasing order based on the specified comparator.
+ * If the input is a `NonEmptyReadonlyArray`, the output will also be a `NonEmptyReadonlyArray`.
+ *
+ * @category sorting
+ * @since 2.0.0
+ */
+ (self: Iterable, O: Order.Order): Array;
+};
+/**
+ * Sorts an array based on a provided mapping function and order. The mapping
+ * function transforms the elements into a value that can be compared, and the
+ * order defines how those values should be sorted.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array, Order } from "effect"
+ *
+ * const result = Array.sortWith(["aaa", "b", "cc"], (s) => s.length, Order.number)
+ * console.log(result) // ["b", "cc", "aaa"]
+ *
+ * // Explanation:
+ * // The array of strings is sorted based on their lengths. The mapping function `(s) => s.length`
+ * // converts each string into its length, and the `Order.number` specifies that the lengths should
+ * // be sorted in ascending order.
+ * ```
+ *
+ * @since 2.0.0
+ * @category elements
+ */
+export declare const sortWith: {
+ /**
+ * Sorts an array based on a provided mapping function and order. The mapping
+ * function transforms the elements into a value that can be compared, and the
+ * order defines how those values should be sorted.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array, Order } from "effect"
+ *
+ * const result = Array.sortWith(["aaa", "b", "cc"], (s) => s.length, Order.number)
+ * console.log(result) // ["b", "cc", "aaa"]
+ *
+ * // Explanation:
+ * // The array of strings is sorted based on their lengths. The mapping function `(s) => s.length`
+ * // converts each string into its length, and the `Order.number` specifies that the lengths should
+ * // be sorted in ascending order.
+ * ```
+ *
+ * @since 2.0.0
+ * @category elements
+ */
+ , B>(f: (a: ReadonlyArray.Infer) => B, order: Order.Order): (self: S) => ReadonlyArray.With>;
+ /**
+ * Sorts an array based on a provided mapping function and order. The mapping
+ * function transforms the elements into a value that can be compared, and the
+ * order defines how those values should be sorted.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array, Order } from "effect"
+ *
+ * const result = Array.sortWith(["aaa", "b", "cc"], (s) => s.length, Order.number)
+ * console.log(result) // ["b", "cc", "aaa"]
+ *
+ * // Explanation:
+ * // The array of strings is sorted based on their lengths. The mapping function `(s) => s.length`
+ * // converts each string into its length, and the `Order.number` specifies that the lengths should
+ * // be sorted in ascending order.
+ * ```
+ *
+ * @since 2.0.0
+ * @category elements
+ */
+ (self: NonEmptyReadonlyArray, f: (a: A) => B, O: Order.Order): NonEmptyArray;
+ /**
+ * Sorts an array based on a provided mapping function and order. The mapping
+ * function transforms the elements into a value that can be compared, and the
+ * order defines how those values should be sorted.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array, Order } from "effect"
+ *
+ * const result = Array.sortWith(["aaa", "b", "cc"], (s) => s.length, Order.number)
+ * console.log(result) // ["b", "cc", "aaa"]
+ *
+ * // Explanation:
+ * // The array of strings is sorted based on their lengths. The mapping function `(s) => s.length`
+ * // converts each string into its length, and the `Order.number` specifies that the lengths should
+ * // be sorted in ascending order.
+ * ```
+ *
+ * @since 2.0.0
+ * @category elements
+ */
+ (self: Iterable, f: (a: A) => B, order: Order.Order): Array;
+};
+/**
+ * Sorts the elements of an `Iterable` in increasing order based on the provided
+ * orders. The elements are compared using the first order in `orders`, then the
+ * second order if the first comparison is equal, and so on.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array, Order, pipe } from "effect"
+ *
+ * const users = [
+ * { name: "Alice", age: 30 },
+ * { name: "Bob", age: 25 },
+ * { name: "Charlie", age: 30 }
+ * ]
+ *
+ * const result = pipe(
+ * users,
+ * Array.sortBy(
+ * Order.mapInput(Order.number, (user: (typeof users)[number]) => user.age),
+ * Order.mapInput(Order.string, (user: (typeof users)[number]) => user.name)
+ * )
+ * )
+ *
+ * console.log(result)
+ * // [
+ * // { name: "Bob", age: 25 },
+ * // { name: "Alice", age: 30 },
+ * // { name: "Charlie", age: 30 }
+ * // ]
+ *
+ * // Explanation:
+ * // The array of users is sorted first by age in ascending order. When ages are equal,
+ * // the users are further sorted by name in ascending order.
+ * ```
+ *
+ * @category sorting
+ * @since 2.0.0
+ */
+export declare const sortBy: >(...orders: ReadonlyArray>>) => (self: S) => S extends NonEmptyReadonlyArray ? NonEmptyArray : S extends Iterable ? Array : never;
+/**
+ * Takes two `Iterable`s and returns an `Array` of corresponding pairs.
+ * If one input `Iterable` is short, excess elements of the
+ * longer `Iterable` are discarded.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.zip([1, 2, 3], ['a', 'b'])
+ * console.log(result) // [[1, 'a'], [2, 'b']]
+ * ```
+ *
+ * @category zipping
+ * @since 2.0.0
+ */
+export declare const zip: {
+ /**
+ * Takes two `Iterable`s and returns an `Array` of corresponding pairs.
+ * If one input `Iterable` is short, excess elements of the
+ * longer `Iterable` are discarded.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.zip([1, 2, 3], ['a', 'b'])
+ * console.log(result) // [[1, 'a'], [2, 'b']]
+ * ```
+ *
+ * @category zipping
+ * @since 2.0.0
+ */
+ (that: NonEmptyReadonlyArray): (self: NonEmptyReadonlyArray) => NonEmptyArray<[A, B]>;
+ /**
+ * Takes two `Iterable`s and returns an `Array` of corresponding pairs.
+ * If one input `Iterable` is short, excess elements of the
+ * longer `Iterable` are discarded.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.zip([1, 2, 3], ['a', 'b'])
+ * console.log(result) // [[1, 'a'], [2, 'b']]
+ * ```
+ *
+ * @category zipping
+ * @since 2.0.0
+ */
+ (that: Iterable): (self: Iterable) => Array<[A, B]>;
+ /**
+ * Takes two `Iterable`s and returns an `Array` of corresponding pairs.
+ * If one input `Iterable` is short, excess elements of the
+ * longer `Iterable` are discarded.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.zip([1, 2, 3], ['a', 'b'])
+ * console.log(result) // [[1, 'a'], [2, 'b']]
+ * ```
+ *
+ * @category zipping
+ * @since 2.0.0
+ */
+ (self: NonEmptyReadonlyArray, that: NonEmptyReadonlyArray): NonEmptyArray<[A, B]>;
+ /**
+ * Takes two `Iterable`s and returns an `Array` of corresponding pairs.
+ * If one input `Iterable` is short, excess elements of the
+ * longer `Iterable` are discarded.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.zip([1, 2, 3], ['a', 'b'])
+ * console.log(result) // [[1, 'a'], [2, 'b']]
+ * ```
+ *
+ * @category zipping
+ * @since 2.0.0
+ */
+ (self: Iterable, that: Iterable): Array<[A, B]>;
+};
+/**
+ * Apply a function to pairs of elements at the same index in two `Iterable`s, collecting the results in a new `Array`. If one
+ * input `Iterable` is short, excess elements of the longer `Iterable` are discarded.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.zipWith([1, 2, 3], [4, 5, 6], (a, b) => a + b)
+ * console.log(result) // [5, 7, 9]
+ * ```
+ *
+ * @category zipping
+ * @since 2.0.0
+ */
+export declare const zipWith: {
+ /**
+ * Apply a function to pairs of elements at the same index in two `Iterable`s, collecting the results in a new `Array`. If one
+ * input `Iterable` is short, excess elements of the longer `Iterable` are discarded.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.zipWith([1, 2, 3], [4, 5, 6], (a, b) => a + b)
+ * console.log(result) // [5, 7, 9]
+ * ```
+ *
+ * @category zipping
+ * @since 2.0.0
+ */
+ (that: NonEmptyReadonlyArray, f: (a: A, b: B) => C): (self: NonEmptyReadonlyArray) => NonEmptyArray;
+ /**
+ * Apply a function to pairs of elements at the same index in two `Iterable`s, collecting the results in a new `Array`. If one
+ * input `Iterable` is short, excess elements of the longer `Iterable` are discarded.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.zipWith([1, 2, 3], [4, 5, 6], (a, b) => a + b)
+ * console.log(result) // [5, 7, 9]
+ * ```
+ *
+ * @category zipping
+ * @since 2.0.0
+ */
+ (that: Iterable, f: (a: A, b: B) => C): (self: Iterable) => Array;
+ /**
+ * Apply a function to pairs of elements at the same index in two `Iterable`s, collecting the results in a new `Array`. If one
+ * input `Iterable` is short, excess elements of the longer `Iterable` are discarded.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.zipWith([1, 2, 3], [4, 5, 6], (a, b) => a + b)
+ * console.log(result) // [5, 7, 9]
+ * ```
+ *
+ * @category zipping
+ * @since 2.0.0
+ */
+ (self: NonEmptyReadonlyArray, that: NonEmptyReadonlyArray, f: (a: A, b: B) => C): NonEmptyArray;
+ /**
+ * Apply a function to pairs of elements at the same index in two `Iterable`s, collecting the results in a new `Array`. If one
+ * input `Iterable` is short, excess elements of the longer `Iterable` are discarded.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.zipWith([1, 2, 3], [4, 5, 6], (a, b) => a + b)
+ * console.log(result) // [5, 7, 9]
+ * ```
+ *
+ * @category zipping
+ * @since 2.0.0
+ */
+ (self: Iterable, that: Iterable, f: (a: A, b: B) => C): Array;
+};
+/**
+ * This function is the inverse of `zip`. Takes an `Iterable` of pairs and return two corresponding `Array`s.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.unzip([[1, "a"], [2, "b"], [3, "c"]])
+ * console.log(result) // [[1, 2, 3], ['a', 'b', 'c']]
+ * ```
+ *
+ * @since 2.0.0
+ */
+export declare const unzip: >(self: S) => S extends NonEmptyReadonlyArray ? [NonEmptyArray, NonEmptyArray] : S extends Iterable ? [Array, Array] : never;
+/**
+ * Places an element in between members of an `Iterable`.
+ * If the input is a non-empty array, the result is also a non-empty array.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.intersperse([1, 2, 3], 0)
+ * console.log(result) // [1, 0, 2, 0, 3]
+ * ```
+ *
+ * @since 2.0.0
+ */
+export declare const intersperse: {
+ /**
+ * Places an element in between members of an `Iterable`.
+ * If the input is a non-empty array, the result is also a non-empty array.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.intersperse([1, 2, 3], 0)
+ * console.log(result) // [1, 0, 2, 0, 3]
+ * ```
+ *
+ * @since 2.0.0
+ */
+ (middle: B): >(self: S) => ReadonlyArray.With | B>;
+ /**
+ * Places an element in between members of an `Iterable`.
+ * If the input is a non-empty array, the result is also a non-empty array.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.intersperse([1, 2, 3], 0)
+ * console.log(result) // [1, 0, 2, 0, 3]
+ * ```
+ *
+ * @since 2.0.0
+ */
+ (self: NonEmptyReadonlyArray, middle: B): NonEmptyArray;
+ /**
+ * Places an element in between members of an `Iterable`.
+ * If the input is a non-empty array, the result is also a non-empty array.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.intersperse([1, 2, 3], 0)
+ * console.log(result) // [1, 0, 2, 0, 3]
+ * ```
+ *
+ * @since 2.0.0
+ */
+ (self: Iterable, middle: B): Array;
+};
+/**
+ * Apply a function to the head, creating a new `NonEmptyReadonlyArray`.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.modifyNonEmptyHead([1, 2, 3], n => n * 10)
+ * console.log(result) // [10, 2, 3]
+ * ```
+ *
+ * @since 2.0.0
+ */
+export declare const modifyNonEmptyHead: {
+ /**
+ * Apply a function to the head, creating a new `NonEmptyReadonlyArray`.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.modifyNonEmptyHead([1, 2, 3], n => n * 10)
+ * console.log(result) // [10, 2, 3]
+ * ```
+ *
+ * @since 2.0.0
+ */
+ (f: (a: A) => B): (self: NonEmptyReadonlyArray) => NonEmptyArray;
+ /**
+ * Apply a function to the head, creating a new `NonEmptyReadonlyArray`.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.modifyNonEmptyHead([1, 2, 3], n => n * 10)
+ * console.log(result) // [10, 2, 3]
+ * ```
+ *
+ * @since 2.0.0
+ */
+ (self: NonEmptyReadonlyArray, f: (a: A) => B): NonEmptyArray;
+};
+/**
+ * Change the head, creating a new `NonEmptyReadonlyArray`.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.setNonEmptyHead([1, 2, 3], 10)
+ * console.log(result) // [10, 2, 3]
+ * ```
+ *
+ * @since 2.0.0
+ */
+export declare const setNonEmptyHead: {
+ /**
+ * Change the head, creating a new `NonEmptyReadonlyArray`.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.setNonEmptyHead([1, 2, 3], 10)
+ * console.log(result) // [10, 2, 3]
+ * ```
+ *
+ * @since 2.0.0
+ */
+ (b: B): (self: NonEmptyReadonlyArray) => NonEmptyArray;
+ /**
+ * Change the head, creating a new `NonEmptyReadonlyArray`.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.setNonEmptyHead([1, 2, 3], 10)
+ * console.log(result) // [10, 2, 3]
+ * ```
+ *
+ * @since 2.0.0
+ */
+ (self: NonEmptyReadonlyArray, b: B): NonEmptyArray;
+};
+/**
+ * Apply a function to the last element, creating a new `NonEmptyReadonlyArray`.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.modifyNonEmptyLast([1, 2, 3], n => n * 2)
+ * console.log(result) // [1, 2, 6]
+ * ```
+ *
+ * @since 2.0.0
+ */
+export declare const modifyNonEmptyLast: {
+ /**
+ * Apply a function to the last element, creating a new `NonEmptyReadonlyArray`.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.modifyNonEmptyLast([1, 2, 3], n => n * 2)
+ * console.log(result) // [1, 2, 6]
+ * ```
+ *
+ * @since 2.0.0
+ */
+ (f: (a: A) => B): (self: NonEmptyReadonlyArray) => NonEmptyArray;
+ /**
+ * Apply a function to the last element, creating a new `NonEmptyReadonlyArray`.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.modifyNonEmptyLast([1, 2, 3], n => n * 2)
+ * console.log(result) // [1, 2, 6]
+ * ```
+ *
+ * @since 2.0.0
+ */
+ (self: NonEmptyReadonlyArray, f: (a: A) => B): NonEmptyArray;
+};
+/**
+ * Change the last element, creating a new `NonEmptyReadonlyArray`.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.setNonEmptyLast([1, 2, 3], 4)
+ * console.log(result) // [1, 2, 4]
+ * ```
+ *
+ * @since 2.0.0
+ */
+export declare const setNonEmptyLast: {
+ /**
+ * Change the last element, creating a new `NonEmptyReadonlyArray`.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.setNonEmptyLast([1, 2, 3], 4)
+ * console.log(result) // [1, 2, 4]
+ * ```
+ *
+ * @since 2.0.0
+ */
+ (b: B): (self: NonEmptyReadonlyArray) => NonEmptyArray;
+ /**
+ * Change the last element, creating a new `NonEmptyReadonlyArray`.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.setNonEmptyLast([1, 2, 3], 4)
+ * console.log(result) // [1, 2, 4]
+ * ```
+ *
+ * @since 2.0.0
+ */
+ (self: NonEmptyReadonlyArray, b: B): NonEmptyArray;
+};
+/**
+ * Rotate an `Iterable` by `n` steps.
+ * If the input is a non-empty array, the result is also a non-empty array.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.rotate(['a', 'b', 'c', 'd', 'e'], 2)
+ * console.log(result) // [ 'd', 'e', 'a', 'b', 'c' ]
+ * ```
+ *
+ * @since 2.0.0
+ */
+export declare const rotate: {
+ /**
+ * Rotate an `Iterable` by `n` steps.
+ * If the input is a non-empty array, the result is also a non-empty array.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.rotate(['a', 'b', 'c', 'd', 'e'], 2)
+ * console.log(result) // [ 'd', 'e', 'a', 'b', 'c' ]
+ * ```
+ *
+ * @since 2.0.0
+ */
+ (n: number): >(self: S) => ReadonlyArray.With>;
+ /**
+ * Rotate an `Iterable` by `n` steps.
+ * If the input is a non-empty array, the result is also a non-empty array.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.rotate(['a', 'b', 'c', 'd', 'e'], 2)
+ * console.log(result) // [ 'd', 'e', 'a', 'b', 'c' ]
+ * ```
+ *
+ * @since 2.0.0
+ */
+ (self: NonEmptyReadonlyArray, n: number): NonEmptyArray;
+ /**
+ * Rotate an `Iterable` by `n` steps.
+ * If the input is a non-empty array, the result is also a non-empty array.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.rotate(['a', 'b', 'c', 'd', 'e'], 2)
+ * console.log(result) // [ 'd', 'e', 'a', 'b', 'c' ]
+ * ```
+ *
+ * @since 2.0.0
+ */
+ (self: Iterable, n: number): Array;
+};
+/**
+ * Returns a function that checks if a `ReadonlyArray` contains a given value using a provided `isEquivalent` function.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array, pipe } from "effect"
+ *
+ * const isEquivalent = (a: number, b: number) => a === b
+ * const containsNumber = Array.containsWith(isEquivalent)
+ * const result = pipe([1, 2, 3, 4], containsNumber(3))
+ * console.log(result) // true
+ * ```
+ *
+ * @category elements
+ * @since 2.0.0
+ */
+export declare const containsWith: (isEquivalent: (self: A, that: A) => boolean) => {
+ (a: A): (self: Iterable) => boolean;
+ (self: Iterable, a: A): boolean;
+};
+/**
+ * Returns a function that checks if a `ReadonlyArray` contains a given value using the default `Equivalence`.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array, pipe } from "effect"
+ *
+ * const result = pipe(['a', 'b', 'c', 'd'], Array.contains('c'))
+ * console.log(result) // true
+ * ```
+ *
+ * @category elements
+ * @since 2.0.0
+ */
+export declare const contains: {
+ /**
+ * Returns a function that checks if a `ReadonlyArray` contains a given value using the default `Equivalence`.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array, pipe } from "effect"
+ *
+ * const result = pipe(['a', 'b', 'c', 'd'], Array.contains('c'))
+ * console.log(result) // true
+ * ```
+ *
+ * @category elements
+ * @since 2.0.0
+ */
+ (a: A): (self: Iterable) => boolean;
+ /**
+ * Returns a function that checks if a `ReadonlyArray` contains a given value using the default `Equivalence`.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array, pipe } from "effect"
+ *
+ * const result = pipe(['a', 'b', 'c', 'd'], Array.contains('c'))
+ * console.log(result) // true
+ * ```
+ *
+ * @category elements
+ * @since 2.0.0
+ */
+ (self: Iterable, a: A): boolean;
+};
+/**
+ * A useful recursion pattern for processing an `Iterable` to produce a new `Array`, often used for "chopping" up the input
+ * `Iterable`. Typically chop is called with some function that will consume an initial prefix of the `Iterable` and produce a
+ * value and the rest of the `Array`.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.chop([1, 2, 3, 4, 5], (as): [number, Array] => [as[0] * 2, as.slice(1)])
+ * console.log(result) // [2, 4, 6, 8, 10]
+ *
+ * // Explanation:
+ * // The `chopFunction` takes the first element of the array, doubles it, and then returns it along with the rest of the array.
+ * // The `chop` function applies this `chopFunction` recursively to the input array `[1, 2, 3, 4, 5]`,
+ * // resulting in a new array `[2, 4, 6, 8, 10]`.
+ * ```
+ *
+ * @since 2.0.0
+ */
+export declare const chop: {
+ /**
+ * A useful recursion pattern for processing an `Iterable` to produce a new `Array`, often used for "chopping" up the input
+ * `Iterable`. Typically chop is called with some function that will consume an initial prefix of the `Iterable` and produce a
+ * value and the rest of the `Array`.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.chop([1, 2, 3, 4, 5], (as): [number, Array] => [as[0] * 2, as.slice(1)])
+ * console.log(result) // [2, 4, 6, 8, 10]
+ *
+ * // Explanation:
+ * // The `chopFunction` takes the first element of the array, doubles it, and then returns it along with the rest of the array.
+ * // The `chop` function applies this `chopFunction` recursively to the input array `[1, 2, 3, 4, 5]`,
+ * // resulting in a new array `[2, 4, 6, 8, 10]`.
+ * ```
+ *
+ * @since 2.0.0
+ */
+ , B>(f: (as: NonEmptyReadonlyArray>) => readonly [B, ReadonlyArray>]): (self: S) => ReadonlyArray.With>;
+ /**
+ * A useful recursion pattern for processing an `Iterable` to produce a new `Array`, often used for "chopping" up the input
+ * `Iterable`. Typically chop is called with some function that will consume an initial prefix of the `Iterable` and produce a
+ * value and the rest of the `Array`.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.chop([1, 2, 3, 4, 5], (as): [number, Array] => [as[0] * 2, as.slice(1)])
+ * console.log(result) // [2, 4, 6, 8, 10]
+ *
+ * // Explanation:
+ * // The `chopFunction` takes the first element of the array, doubles it, and then returns it along with the rest of the array.
+ * // The `chop` function applies this `chopFunction` recursively to the input array `[1, 2, 3, 4, 5]`,
+ * // resulting in a new array `[2, 4, 6, 8, 10]`.
+ * ```
+ *
+ * @since 2.0.0
+ */
+ (self: NonEmptyReadonlyArray, f: (as: NonEmptyReadonlyArray) => readonly [B, ReadonlyArray]): NonEmptyArray;
+ /**
+ * A useful recursion pattern for processing an `Iterable` to produce a new `Array`, often used for "chopping" up the input
+ * `Iterable`. Typically chop is called with some function that will consume an initial prefix of the `Iterable` and produce a
+ * value and the rest of the `Array`.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.chop([1, 2, 3, 4, 5], (as): [number, Array] => [as[0] * 2, as.slice(1)])
+ * console.log(result) // [2, 4, 6, 8, 10]
+ *
+ * // Explanation:
+ * // The `chopFunction` takes the first element of the array, doubles it, and then returns it along with the rest of the array.
+ * // The `chop` function applies this `chopFunction` recursively to the input array `[1, 2, 3, 4, 5]`,
+ * // resulting in a new array `[2, 4, 6, 8, 10]`.
+ * ```
+ *
+ * @since 2.0.0
+ */
+ (self: Iterable, f: (as: NonEmptyReadonlyArray) => readonly [B, ReadonlyArray]): Array;
+};
+/**
+ * Splits an `Iterable` into two segments, with the first segment containing a maximum of `n` elements.
+ * The value of `n` can be `0`.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.splitAt([1, 2, 3, 4, 5], 3)
+ * console.log(result) // [[1, 2, 3], [4, 5]]
+ * ```
+ *
+ * @category splitting
+ * @since 2.0.0
+ */
+export declare const splitAt: {
+ /**
+ * Splits an `Iterable` into two segments, with the first segment containing a maximum of `n` elements.
+ * The value of `n` can be `0`.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.splitAt([1, 2, 3, 4, 5], 3)
+ * console.log(result) // [[1, 2, 3], [4, 5]]
+ * ```
+ *
+ * @category splitting
+ * @since 2.0.0
+ */
+ (n: number): (self: Iterable) => [beforeIndex: Array, fromIndex: Array];
+ /**
+ * Splits an `Iterable` into two segments, with the first segment containing a maximum of `n` elements.
+ * The value of `n` can be `0`.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.splitAt([1, 2, 3, 4, 5], 3)
+ * console.log(result) // [[1, 2, 3], [4, 5]]
+ * ```
+ *
+ * @category splitting
+ * @since 2.0.0
+ */
+ (self: Iterable, n: number): [beforeIndex: Array, fromIndex: Array];
+};
+/**
+ * Splits a `NonEmptyReadonlyArray` into two segments, with the first segment containing a maximum of `n` elements.
+ * The value of `n` must be `>= 1`.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.splitNonEmptyAt(["a", "b", "c", "d", "e"], 3)
+ * console.log(result) // [["a", "b", "c"], ["d", "e"]]
+ * ```
+ *
+ * @category splitting
+ * @since 2.0.0
+ */
+export declare const splitNonEmptyAt: {
+ /**
+ * Splits a `NonEmptyReadonlyArray` into two segments, with the first segment containing a maximum of `n` elements.
+ * The value of `n` must be `>= 1`.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.splitNonEmptyAt(["a", "b", "c", "d", "e"], 3)
+ * console.log(result) // [["a", "b", "c"], ["d", "e"]]
+ * ```
+ *
+ * @category splitting
+ * @since 2.0.0
+ */
+ (n: number): (self: NonEmptyReadonlyArray) => [beforeIndex: NonEmptyArray, fromIndex: Array];
+ /**
+ * Splits a `NonEmptyReadonlyArray` into two segments, with the first segment containing a maximum of `n` elements.
+ * The value of `n` must be `>= 1`.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.splitNonEmptyAt(["a", "b", "c", "d", "e"], 3)
+ * console.log(result) // [["a", "b", "c"], ["d", "e"]]
+ * ```
+ *
+ * @category splitting
+ * @since 2.0.0
+ */
+ (self: NonEmptyReadonlyArray, n: number): [beforeIndex: NonEmptyArray, fromIndex: Array];
+};
+/**
+ * Splits this iterable into `n` equally sized arrays.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.split([1, 2, 3, 4, 5, 6, 7, 8], 3)
+ * console.log(result) // [[1, 2, 3], [4, 5, 6], [7, 8]]
+ * ```
+ *
+ * @since 2.0.0
+ * @category splitting
+ */
+export declare const split: {
+ /**
+ * Splits this iterable into `n` equally sized arrays.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.split([1, 2, 3, 4, 5, 6, 7, 8], 3)
+ * console.log(result) // [[1, 2, 3], [4, 5, 6], [7, 8]]
+ * ```
+ *
+ * @since 2.0.0
+ * @category splitting
+ */
+ (n: number): (self: Iterable) => Array>;
+ /**
+ * Splits this iterable into `n` equally sized arrays.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.split([1, 2, 3, 4, 5, 6, 7, 8], 3)
+ * console.log(result) // [[1, 2, 3], [4, 5, 6], [7, 8]]
+ * ```
+ *
+ * @since 2.0.0
+ * @category splitting
+ */
+ (self: Iterable, n: number): Array>;
+};
+/**
+ * Splits this iterable on the first element that matches this predicate.
+ * Returns a tuple containing two arrays: the first one is before the match, and the second one is from the match onward.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.splitWhere([1, 2, 3, 4, 5], n => n > 3)
+ * console.log(result) // [[1, 2, 3], [4, 5]]
+ * ```
+ *
+ * @category splitting
+ * @since 2.0.0
+ */
+export declare const splitWhere: {
+ /**
+ * Splits this iterable on the first element that matches this predicate.
+ * Returns a tuple containing two arrays: the first one is before the match, and the second one is from the match onward.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.splitWhere([1, 2, 3, 4, 5], n => n > 3)
+ * console.log(result) // [[1, 2, 3], [4, 5]]
+ * ```
+ *
+ * @category splitting
+ * @since 2.0.0
+ */
+ (predicate: (a: NoInfer, i: number) => boolean): (self: Iterable) => [beforeMatch: Array, fromMatch: Array];
+ /**
+ * Splits this iterable on the first element that matches this predicate.
+ * Returns a tuple containing two arrays: the first one is before the match, and the second one is from the match onward.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.splitWhere([1, 2, 3, 4, 5], n => n > 3)
+ * console.log(result) // [[1, 2, 3], [4, 5]]
+ * ```
+ *
+ * @category splitting
+ * @since 2.0.0
+ */
+ (self: Iterable, predicate: (a: A, i: number) => boolean): [beforeMatch: Array, fromMatch: Array];
+};
+/**
+ * Copies an array.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.copy([1, 2, 3])
+ * console.log(result) // [1, 2, 3]
+ * ```
+ *
+ * @since 2.0.0
+ */
+export declare const copy: {
+ /**
+ * Copies an array.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.copy([1, 2, 3])
+ * console.log(result) // [1, 2, 3]
+ * ```
+ *
+ * @since 2.0.0
+ */
+ (self: NonEmptyReadonlyArray): NonEmptyArray;
+ /**
+ * Copies an array.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.copy([1, 2, 3])
+ * console.log(result) // [1, 2, 3]
+ * ```
+ *
+ * @since 2.0.0
+ */
+ (self: ReadonlyArray): Array;
+};
+/**
+ * Pads an array.
+ * Returns a new array of length `n` with the elements of `array` followed by `fill` elements if `array` is shorter than `n`.
+ * If `array` is longer than `n`, the returned array will be a slice of `array` containing the `n` first elements of `array`.
+ * If `n` is less than or equal to 0, the returned array will be an empty array.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.pad([1, 2, 3], 6, 0)
+ * console.log(result) // [1, 2, 3, 0, 0, 0]
+ * ```
+ *
+ * @since 3.8.4
+ */
+export declare const pad: {
+ /**
+ * Pads an array.
+ * Returns a new array of length `n` with the elements of `array` followed by `fill` elements if `array` is shorter than `n`.
+ * If `array` is longer than `n`, the returned array will be a slice of `array` containing the `n` first elements of `array`.
+ * If `n` is less than or equal to 0, the returned array will be an empty array.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.pad([1, 2, 3], 6, 0)
+ * console.log(result) // [1, 2, 3, 0, 0, 0]
+ * ```
+ *
+ * @since 3.8.4
+ */
+ (n: number, fill: T): (self: Array) => Array;
+ /**
+ * Pads an array.
+ * Returns a new array of length `n` with the elements of `array` followed by `fill` elements if `array` is shorter than `n`.
+ * If `array` is longer than `n`, the returned array will be a slice of `array` containing the `n` first elements of `array`.
+ * If `n` is less than or equal to 0, the returned array will be an empty array.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.pad([1, 2, 3], 6, 0)
+ * console.log(result) // [1, 2, 3, 0, 0, 0]
+ * ```
+ *
+ * @since 3.8.4
+ */
+ (self: Array, n: number, fill: T): Array;
+};
+/**
+ * Splits an `Iterable` into length-`n` pieces. The last piece will be shorter if `n` does not evenly divide the length of
+ * the `Iterable`. Note that `chunksOf(n)([])` is `[]`, not `[[]]`. This is intentional, and is consistent with a recursive
+ * definition of `chunksOf`; it satisfies the property that
+ *
+ * ```ts skip-type-checking
+ * chunksOf(n)(xs).concat(chunksOf(n)(ys)) == chunksOf(n)(xs.concat(ys)))
+ * ```
+ *
+ * whenever `n` evenly divides the length of `self`.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.chunksOf([1, 2, 3, 4, 5], 2)
+ * console.log(result) // [[1, 2], [3, 4], [5]]
+ *
+ * // Explanation:
+ * // The `chunksOf` function takes an array of numbers `[1, 2, 3, 4, 5]` and a number `2`.
+ * // It splits the array into chunks of length 2. Since the array length is not evenly divisible by 2,
+ * // the last chunk contains the remaining elements.
+ * // The result is `[[1, 2], [3, 4], [5]]`.
+ * ```
+ *
+ * @category splitting
+ * @since 2.0.0
+ */
+export declare const chunksOf: {
+ /**
+ * Splits an `Iterable` into length-`n` pieces. The last piece will be shorter if `n` does not evenly divide the length of
+ * the `Iterable`. Note that `chunksOf(n)([])` is `[]`, not `[[]]`. This is intentional, and is consistent with a recursive
+ * definition of `chunksOf`; it satisfies the property that
+ *
+ * ```ts skip-type-checking
+ * chunksOf(n)(xs).concat(chunksOf(n)(ys)) == chunksOf(n)(xs.concat(ys)))
+ * ```
+ *
+ * whenever `n` evenly divides the length of `self`.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.chunksOf([1, 2, 3, 4, 5], 2)
+ * console.log(result) // [[1, 2], [3, 4], [5]]
+ *
+ * // Explanation:
+ * // The `chunksOf` function takes an array of numbers `[1, 2, 3, 4, 5]` and a number `2`.
+ * // It splits the array into chunks of length 2. Since the array length is not evenly divisible by 2,
+ * // the last chunk contains the remaining elements.
+ * // The result is `[[1, 2], [3, 4], [5]]`.
+ * ```
+ *
+ * @category splitting
+ * @since 2.0.0
+ */
+ (n: number): >(self: S) => ReadonlyArray.With>>;
+ /**
+ * Splits an `Iterable` into length-`n` pieces. The last piece will be shorter if `n` does not evenly divide the length of
+ * the `Iterable`. Note that `chunksOf(n)([])` is `[]`, not `[[]]`. This is intentional, and is consistent with a recursive
+ * definition of `chunksOf`; it satisfies the property that
+ *
+ * ```ts skip-type-checking
+ * chunksOf(n)(xs).concat(chunksOf(n)(ys)) == chunksOf(n)(xs.concat(ys)))
+ * ```
+ *
+ * whenever `n` evenly divides the length of `self`.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.chunksOf([1, 2, 3, 4, 5], 2)
+ * console.log(result) // [[1, 2], [3, 4], [5]]
+ *
+ * // Explanation:
+ * // The `chunksOf` function takes an array of numbers `[1, 2, 3, 4, 5]` and a number `2`.
+ * // It splits the array into chunks of length 2. Since the array length is not evenly divisible by 2,
+ * // the last chunk contains the remaining elements.
+ * // The result is `[[1, 2], [3, 4], [5]]`.
+ * ```
+ *
+ * @category splitting
+ * @since 2.0.0
+ */
+ (self: NonEmptyReadonlyArray, n: number): NonEmptyArray>;
+ /**
+ * Splits an `Iterable` into length-`n` pieces. The last piece will be shorter if `n` does not evenly divide the length of
+ * the `Iterable`. Note that `chunksOf(n)([])` is `[]`, not `[[]]`. This is intentional, and is consistent with a recursive
+ * definition of `chunksOf`; it satisfies the property that
+ *
+ * ```ts skip-type-checking
+ * chunksOf(n)(xs).concat(chunksOf(n)(ys)) == chunksOf(n)(xs.concat(ys)))
+ * ```
+ *
+ * whenever `n` evenly divides the length of `self`.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.chunksOf([1, 2, 3, 4, 5], 2)
+ * console.log(result) // [[1, 2], [3, 4], [5]]
+ *
+ * // Explanation:
+ * // The `chunksOf` function takes an array of numbers `[1, 2, 3, 4, 5]` and a number `2`.
+ * // It splits the array into chunks of length 2. Since the array length is not evenly divisible by 2,
+ * // the last chunk contains the remaining elements.
+ * // The result is `[[1, 2], [3, 4], [5]]`.
+ * ```
+ *
+ * @category splitting
+ * @since 2.0.0
+ */
+ (self: Iterable, n: number): Array>;
+};
+/**
+ * Creates sliding windows of size `n` from an `Iterable`.
+ * If the number of elements is less than `n` or if `n` is not greater than zero,
+ * an empty array is returned.
+ *
+ * @example
+ * ```ts
+ * import * as assert from "node:assert"
+ * import { Array } from "effect"
+ *
+ * const numbers = [1, 2, 3, 4, 5]
+ * assert.deepStrictEqual(Array.window(numbers, 3), [[1, 2, 3], [2, 3, 4], [3, 4, 5]])
+ * assert.deepStrictEqual(Array.window(numbers, 6), [])
+ * ```
+ *
+ * @category splitting
+ * @since 3.13.2
+ */
+export declare const window: {
+ /**
+ * Creates sliding windows of size `n` from an `Iterable`.
+ * If the number of elements is less than `n` or if `n` is not greater than zero,
+ * an empty array is returned.
+ *
+ * @example
+ * ```ts
+ * import * as assert from "node:assert"
+ * import { Array } from "effect"
+ *
+ * const numbers = [1, 2, 3, 4, 5]
+ * assert.deepStrictEqual(Array.window(numbers, 3), [[1, 2, 3], [2, 3, 4], [3, 4, 5]])
+ * assert.deepStrictEqual(Array.window(numbers, 6), [])
+ * ```
+ *
+ * @category splitting
+ * @since 3.13.2
+ */
+ (n: N): (self: Iterable) => Array>;
+ /**
+ * Creates sliding windows of size `n` from an `Iterable`.
+ * If the number of elements is less than `n` or if `n` is not greater than zero,
+ * an empty array is returned.
+ *
+ * @example
+ * ```ts
+ * import * as assert from "node:assert"
+ * import { Array } from "effect"
+ *
+ * const numbers = [1, 2, 3, 4, 5]
+ * assert.deepStrictEqual(Array.window(numbers, 3), [[1, 2, 3], [2, 3, 4], [3, 4, 5]])
+ * assert.deepStrictEqual(Array.window(numbers, 6), [])
+ * ```
+ *
+ * @category splitting
+ * @since 3.13.2
+ */
+ (self: Iterable, n: N): Array>;
+};
+/**
+ * Group equal, consecutive elements of a `NonEmptyReadonlyArray` into `NonEmptyArray`s using the provided `isEquivalent` function.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.groupWith(["a", "a", "b", "b", "b", "c", "a"], (x, y) => x === y)
+ * console.log(result) // [["a", "a"], ["b", "b", "b"], ["c"], ["a"]]
+ * ```
+ *
+ * @category grouping
+ * @since 2.0.0
+ */
+export declare const groupWith: {
+ /**
+ * Group equal, consecutive elements of a `NonEmptyReadonlyArray` into `NonEmptyArray`s using the provided `isEquivalent` function.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.groupWith(["a", "a", "b", "b", "b", "c", "a"], (x, y) => x === y)
+ * console.log(result) // [["a", "a"], ["b", "b", "b"], ["c"], ["a"]]
+ * ```
+ *
+ * @category grouping
+ * @since 2.0.0
+ */
+ (isEquivalent: (self: A, that: A) => boolean): (self: NonEmptyReadonlyArray) => NonEmptyArray>;
+ /**
+ * Group equal, consecutive elements of a `NonEmptyReadonlyArray` into `NonEmptyArray`s using the provided `isEquivalent` function.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.groupWith(["a", "a", "b", "b", "b", "c", "a"], (x, y) => x === y)
+ * console.log(result) // [["a", "a"], ["b", "b", "b"], ["c"], ["a"]]
+ * ```
+ *
+ * @category grouping
+ * @since 2.0.0
+ */
+ (self: NonEmptyReadonlyArray, isEquivalent: (self: A, that: A) => boolean): NonEmptyArray>;
+};
+/**
+ * Group equal, consecutive elements of a `NonEmptyReadonlyArray` into `NonEmptyArray`s.
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const result = Array.group([1, 1, 2, 2, 2, 3, 1])
+ * console.log(result) // [[1, 1], [2, 2, 2], [3], [1]]
+ * ```
+ *
+ * @category grouping
+ * @since 2.0.0
+ */
+export declare const group: (self: NonEmptyReadonlyArray) => NonEmptyArray>;
+/**
+ * Splits an `Iterable` into sub-non-empty-arrays stored in an object, based on the result of calling a `string`-returning
+ * function on each element, and grouping the results according to values returned
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const people = [
+ * { name: "Alice", group: "A" },
+ * { name: "Bob", group: "B" },
+ * { name: "Charlie", group: "A" }
+ * ]
+ *
+ * const result = Array.groupBy(people, person => person.group)
+ * console.log(result)
+ * // {
+ * // A: [{ name: "Alice", group: "A" }, { name: "Charlie", group: "A" }],
+ * // B: [{ name: "Bob", group: "B" }]
+ * // }
+ * ```
+ *
+ * @category grouping
+ * @since 2.0.0
+ */
+export declare const groupBy: {
+ /**
+ * Splits an `Iterable` into sub-non-empty-arrays stored in an object, based on the result of calling a `string`-returning
+ * function on each element, and grouping the results according to values returned
+ *
+ * **Example**
+ *
+ * ```ts
+ * import { Array } from "effect"
+ *
+ * const people = [
+ * { name: "Alice", group: "A" },
+ * { name: "Bob", group: "B" },
+ * { name: "Charlie", group: "A" }
+ * ]
+ *
+ * const result = Array.groupBy(people, person => person.group)
+ * console.log(result)
+ * // {
+ * // A: [{ name: "Alice", group: "A" }, { name: "Charlie", group: "A" }],
+ * // B: [{ name: "Bob", group: "B" }]
+ * // }
+ * ```
+ *
+ * @category grouping
+ * @since 2.0.0
+ */
+ (f: (a: A) => K): (self: Iterable) => Record