/** * Works with TypeScript `string` values. * * This module exposes common string operations in a pipe-friendly style. The * helpers cover checks, comparison, concatenation, trimming, casing, slicing, * padding, replacement, normalization, safe character access, search helpers * that return `Option`, and joining strings through a reducer. * * @stability stable * @since 2.0.0 */ import type { NonEmptyArray } from "./Array.ts"; import * as Equ from "./Equivalence.ts"; import * as Option from "./Option.ts"; import * as order from "./Order.ts"; import type * as Ordering from "./Ordering.ts"; import type { Refinement } from "./Predicate.ts"; import * as Reducer from "./Reducer.ts"; /** * Exposes the global string constructor. * * **When to use** * * Use to access native JavaScript string coercion or constructor behavior from * the Effect module namespace. * * **Gotchas** * * Calling `String(value)` returns a primitive string. Calling * `new String(value)` creates a boxed `String` object. * * @see {@link isString} for checking whether a value is a primitive string * * @stability stable * @category constructors * @since 4.0.0 */ export declare const String: StringConstructor; /** * Checks whether a value is a `string`. * * **Example** (Checking for strings) * * ```ts import.meta.vitest * import { String } from "effect" * * String.isString("a") // => true * String.isString(1) // => false * ``` * * @stability stable * @category guards * @since 2.0.0 */ export declare const isString: Refinement; /** * Provides an `Order` instance for comparing strings using lexicographic * ordering. * * **Example** (Comparing strings lexicographically) * * ```ts import.meta.vitest * import { String } from "effect" * * String.Order("apple", "banana") // => -1 * String.Order("banana", "apple") // => 1 * String.Order("apple", "apple") // => 0 * ``` * * @stability stable * @category instances * @since 2.0.0 */ export declare const Order: order.Order; /** * Provides an `Equivalence` instance for strings using strict equality (`===`). * * **Example** (Comparing strings for equality) * * ```ts import.meta.vitest * import { String } from "effect" * * String.Equivalence("hello", "hello") // => true * String.Equivalence("hello", "world") // => false * ``` * * @stability stable * @category instances * @since 2.0.0 */ export declare const Equivalence: Equ.Equivalence; /** * Provides the empty string `""`. * * **When to use** * * Use when you need the canonical empty string value from the `String` module. * * **Example** (Referencing the empty string) * * ```ts import.meta.vitest * import { String } from "effect" * * String.empty // => "" * String.isEmpty(String.empty) // => true * ``` * * @stability stable * @category constants * @since 2.0.0 */ export declare const empty: ""; /** * Concatenates two strings at the type level. * * **Example** (Concatenating string literal types) * * ```ts import.meta.vitest * import type { String } from "effect" * * // Type-level concatenation * type Result = String.Concat<"hello", "world"> // "helloworld" * * const witness: Result = "helloworld" * ``` * * @stability stable * @category models * @since 2.0.0 */ export type Concat = `${A}${B}`; /** * Concatenates two strings at runtime. * * **Example** (Concatenating strings) * * ```ts import.meta.vitest * import { pipe, String } from "effect" * * String.concat("hello", "world") // => "helloworld" * pipe("hello", String.concat("world")) // => "helloworld" * ``` * * @stability stable * @category combining * @since 2.0.0 */ export declare const concat: { /** * Concatenates two strings at runtime. * * **Example** (Concatenating strings) * * ```ts import.meta.vitest * import { pipe, String } from "effect" * * String.concat("hello", "world") // => "helloworld" * pipe("hello", String.concat("world")) // => "helloworld" * ``` * * @stability stable * @category combining * @since 2.0.0 */ (that: B): (self: A) => Concat; /** * Concatenates two strings at runtime. * * **Example** (Concatenating strings) * * ```ts import.meta.vitest * import { pipe, String } from "effect" * * String.concat("hello", "world") // => "helloworld" * pipe("hello", String.concat("world")) // => "helloworld" * ``` * * @stability stable * @category combining * @since 2.0.0 */ (self: A, that: B): Concat; }; /** * Converts a string to uppercase. * * **Example** (Converting strings to uppercase) * * ```ts import.meta.vitest * import { pipe, String } from "effect" * * pipe("a", String.toUpperCase) // => "A" * String.toUpperCase("hello") // => "HELLO" * ``` * * @stability stable * @category transforming * @since 2.0.0 */ export declare const toUpperCase: (self: S) => Uppercase; /** * Converts a string to lowercase. * * **Example** (Converting strings to lowercase) * * ```ts import.meta.vitest * import { pipe, String } from "effect" * * pipe("A", String.toLowerCase) // => "a" * String.toLowerCase("HELLO") // => "hello" * ``` * * @stability stable * @category transforming * @since 2.0.0 */ export declare const toLowerCase: (self: T) => Lowercase; /** * Capitalizes the first character (Unicode code point) of a string. * * **Example** (Capitalizing a string) * * ```ts import.meta.vitest * import { pipe, String } from "effect" * * pipe("abc", String.capitalize) // => "Abc" * String.capitalize("hello") // => "Hello" * String.capitalize("𐐨foo") // => "𐐀foo" * ``` * * @stability stable * @category transforming * @since 2.0.0 */ export declare const capitalize: (self: T) => Capitalize; /** * Uncapitalizes the first character (Unicode code point) of a string. * * **Example** (Uncapitalizing a string) * * ```ts import.meta.vitest * import { pipe, String } from "effect" * * pipe("ABC", String.uncapitalize) // => "aBC" * String.uncapitalize("Hello") // => "hello" * String.uncapitalize("𐐀FOO") // => "𐐨FOO" * ``` * * @stability stable * @category transforming * @since 2.0.0 */ export declare const uncapitalize: (self: T) => Uncapitalize; /** * Replaces matches in a string using `String.prototype.replace`. * * **Details** * * String search values and non-global regular expressions replace the first * match; global regular expressions replace every match. * * **Example** (Replacing a substring) * * ```ts import.meta.vitest * import { pipe, String } from "effect" * * pipe("abc", String.replace("b", "d")) // => "adc" * pipe("hello world", String.replace("world", "Effect")) // => "hello Effect" * ``` * * @stability stable * @category transforming * @since 2.0.0 */ export declare const replace: (searchValue: string | RegExp, replaceValue: string) => (self: string) => string; /** * Type-level representation of trimming whitespace from both ends of a string. * * **Example** (Trimming whitespace at the type level) * * ```ts import.meta.vitest * import type { String } from "effect" * * type Result = String.Trim<" hello "> // "hello" * * const witness: Result = "hello" * ``` * * @stability stable * @category models * @since 2.0.0 */ export type Trim = TrimEnd>; /** * Removes whitespace from both ends of a string. * * **Example** (Trimming whitespace) * * ```ts import.meta.vitest * import { String } from "effect" * * String.trim(" a ") // => "a" * String.trim(" hello world ") // => "hello world" * ``` * * @stability stable * @category transforming * @since 2.0.0 */ export declare const trim: (self: A) => Trim; /** * Type-level representation of trimming whitespace from the start of a string. * * **Example** (Trimming leading whitespace at the type level) * * ```ts import.meta.vitest * import type { String } from "effect" * * type Result = String.TrimStart<" hello"> // "hello" * * const witness: Result = "hello" * ``` * * @stability stable * @category models * @since 2.0.0 */ export type TrimStart = A extends `${" " | "\n" | "\t" | "\r"}${infer B}` ? TrimStart : A; /** * Removes whitespace from the start of a string. * * **Example** (Trimming leading whitespace) * * ```ts import.meta.vitest * import { String } from "effect" * * String.trimStart(" a ") // => "a " * String.trimStart(" hello world") // => "hello world" * ``` * * @stability stable * @category transforming * @since 2.0.0 */ export declare const trimStart: (self: A) => TrimStart; /** * Type-level representation of trimming whitespace from the end of a string. * * **Example** (Trimming trailing whitespace at the type level) * * ```ts import.meta.vitest * import type { String } from "effect" * * type Result = String.TrimEnd<"hello "> // "hello" * * const witness: Result = "hello" * ``` * * @stability stable * @category models * @since 2.0.0 */ export type TrimEnd = A extends `${infer B}${" " | "\n" | "\t" | "\r"}` ? TrimEnd : A; /** * Removes whitespace from the end of a string. * * **Example** (Trimming trailing whitespace) * * ```ts import.meta.vitest * import { String } from "effect" * * String.trimEnd(" a ") // => " a" * String.trimEnd("hello world ") // => "hello world" * ``` * * @stability stable * @category transforming * @since 2.0.0 */ export declare const trimEnd: (self: A) => TrimEnd; /** * Extracts a section of a string and returns it as a new string. * * **Example** (Slicing strings) * * ```ts import.meta.vitest * import { pipe, String } from "effect" * * pipe("abcd", String.slice(1, 3)) // => "bc" * pipe("hello world", String.slice(0, 5)) // => "hello" * ``` * * @stability stable * @category transforming * @since 2.0.0 */ export declare const slice: (start?: number, end?: number) => (self: string) => string; /** * Checks whether a `string` is empty. * * **Example** (Checking for empty strings) * * ```ts import.meta.vitest * import { String } from "effect" * * String.isEmpty("") // => true * String.isEmpty("a") // => false * ``` * * @stability stable * @category guards * @since 2.0.0 */ export declare const isEmpty: (self: string) => self is ""; /** * Checks whether a `string` is non-empty. * * **Example** (Checking for non-empty strings) * * ```ts import.meta.vitest * import { String } from "effect" * * String.isNonEmpty("") // => false * String.isNonEmpty("a") // => true * ``` * * @stability stable * @category predicates * @since 2.0.0 */ export declare const isNonEmpty: (self: string) => boolean; /** * Returns the JavaScript string length, measured in UTF-16 code units. * * **Example** (Getting string length) * * ```ts import.meta.vitest * import { String } from "effect" * * String.length("abc") // => 3 * ``` * * @stability stable * @category getters * @since 2.0.0 */ export declare const length: (self: string) => number; /** * Splits a string into an array of substrings using a separator. * * **Example** (Splitting strings) * * ```ts import.meta.vitest * import { pipe, String } from "effect" * * pipe("abc", String.split("")) // => ["a", "b", "c"] * pipe("", String.split("")) // => [""] * String.split("hello,world", ",") // => ["hello", "world"] * ``` * * @stability stable * @category transforming * @since 2.0.0 */ export declare const split: { /** * Splits a string into an array of substrings using a separator. * * **Example** (Splitting strings) * * ```ts import.meta.vitest * import { pipe, String } from "effect" * * pipe("abc", String.split("")) // => ["a", "b", "c"] * pipe("", String.split("")) // => [""] * String.split("hello,world", ",") // => ["hello", "world"] * ``` * * @stability stable * @category transforming * @since 2.0.0 */ (separator: string | RegExp): (self: string) => NonEmptyArray; /** * Splits a string into an array of substrings using a separator. * * **Example** (Splitting strings) * * ```ts import.meta.vitest * import { pipe, String } from "effect" * * pipe("abc", String.split("")) // => ["a", "b", "c"] * pipe("", String.split("")) // => [""] * String.split("hello,world", ",") // => ["hello", "world"] * ``` * * @stability stable * @category transforming * @since 2.0.0 */ (self: string, separator: string | RegExp): NonEmptyArray; }; /** * Returns `true` if `searchString` appears as a substring of `self`, at one or more positions that are * greater than or equal to `position`; otherwise, returns `false`. * * **Example** (Checking for substrings) * * ```ts import.meta.vitest * import { pipe, String } from "effect" * * pipe("hello world", String.includes("world")) // => true * pipe("hello world", String.includes("foo")) // => false * ``` * * @stability stable * @category predicates * @since 2.0.0 */ export declare const includes: (searchString: string, position?: number) => (self: string) => boolean; /** * Returns `true` if the string starts with the specified search string. * * **Example** (Checking string prefixes) * * ```ts import.meta.vitest * import { pipe, String } from "effect" * * pipe("hello world", String.startsWith("hello")) // => true * pipe("hello world", String.startsWith("world")) // => false * ``` * * @stability stable * @category predicates * @since 2.0.0 */ export declare const startsWith: (searchString: string, position?: number) => (self: string) => boolean; /** * Returns `true` if the string ends with the specified search string. * * **Example** (Checking string suffixes) * * ```ts import.meta.vitest * import { pipe, String } from "effect" * * pipe("hello world", String.endsWith("world")) // => true * pipe("hello world", String.endsWith("hello")) // => false * ``` * * @stability stable * @category predicates * @since 2.0.0 */ export declare const endsWith: (searchString: string, position?: number) => (self: string) => boolean; /** * Returns the character code at the specified index safely, or `None` if the index is out of bounds. * * **Example** (Reading character codes) * * ```ts import.meta.vitest * import { Option, String } from "effect" * * String.charCodeAt("abc", 1) // => Option.some(98) * String.charCodeAt("abc", 4) // => Option.none() * ``` * * @stability stable * @category getters * @since 2.0.0 */ export declare const charCodeAt: { /** * Returns the character code at the specified index safely, or `None` if the index is out of bounds. * * **Example** (Reading character codes) * * ```ts import.meta.vitest * import { Option, String } from "effect" * * String.charCodeAt("abc", 1) // => Option.some(98) * String.charCodeAt("abc", 4) // => Option.none() * ``` * * @stability stable * @category getters * @since 2.0.0 */ (index: number): (self: string) => Option.Option; /** * Returns the character code at the specified index safely, or `None` if the index is out of bounds. * * **Example** (Reading character codes) * * ```ts import.meta.vitest * import { Option, String } from "effect" * * String.charCodeAt("abc", 1) // => Option.some(98) * String.charCodeAt("abc", 4) // => Option.none() * ``` * * @stability stable * @category getters * @since 2.0.0 */ (self: string, index: number): Option.Option; }; /** * Extracts characters from a string between two specified indices. * * **Example** (Extracting substrings) * * ```ts import.meta.vitest * import { pipe, String } from "effect" * * pipe("abcd", String.substring(1)) // => "bcd" * pipe("abcd", String.substring(1, 3)) // => "bc" * ``` * * @stability stable * @category transforming * @since 2.0.0 */ export declare const substring: (start: number, end?: number) => (self: string) => string; /** * Returns the character at the specified relative index safely, or `None` if the index is out of bounds. * * **Example** (Accessing characters safely) * * ```ts import.meta.vitest * import { Option, pipe, String } from "effect" * * pipe("abc", String.at(1)) // => Option.some("b") * pipe("abc", String.at(4)) // => Option.none() * ``` * * @stability stable * @category getters * @since 2.0.0 */ export declare const at: { /** * Returns the character at the specified relative index safely, or `None` if the index is out of bounds. * * **Example** (Accessing characters safely) * * ```ts import.meta.vitest * import { Option, pipe, String } from "effect" * * pipe("abc", String.at(1)) // => Option.some("b") * pipe("abc", String.at(4)) // => Option.none() * ``` * * @stability stable * @category getters * @since 2.0.0 */ (index: number): (self: string) => Option.Option; /** * Returns the character at the specified relative index safely, or `None` if the index is out of bounds. * * **Example** (Accessing characters safely) * * ```ts import.meta.vitest * import { Option, pipe, String } from "effect" * * pipe("abc", String.at(1)) // => Option.some("b") * pipe("abc", String.at(4)) // => Option.none() * ``` * * @stability stable * @category getters * @since 2.0.0 */ (self: string, index: number): Option.Option; }; /** * Returns the character at the specified non-negative index safely, or `None` if the index is out of bounds. * * **Example** (Reading characters safely) * * ```ts import.meta.vitest * import { Option, pipe, String } from "effect" * * pipe("abc", String.charAt(1)) // => Option.some("b") * pipe("abc", String.charAt(4)) // => Option.none() * ``` * * @stability stable * @category getters * @since 2.0.0 */ export declare const charAt: { /** * Returns the character at the specified non-negative index safely, or `None` if the index is out of bounds. * * **Example** (Reading characters safely) * * ```ts import.meta.vitest * import { Option, pipe, String } from "effect" * * pipe("abc", String.charAt(1)) // => Option.some("b") * pipe("abc", String.charAt(4)) // => Option.none() * ``` * * @stability stable * @category getters * @since 2.0.0 */ (index: number): (self: string) => Option.Option; /** * Returns the character at the specified non-negative index safely, or `None` if the index is out of bounds. * * **Example** (Reading characters safely) * * ```ts import.meta.vitest * import { Option, pipe, String } from "effect" * * pipe("abc", String.charAt(1)) // => Option.some("b") * pipe("abc", String.charAt(4)) // => Option.none() * ``` * * @stability stable * @category getters * @since 2.0.0 */ (self: string, index: number): Option.Option; }; /** * Returns the Unicode code point at the specified index safely, or `None` if the index is out of bounds. * * **Example** (Reading code points) * * ```ts import.meta.vitest * import { Option, pipe, String } from "effect" * * pipe("abc", String.codePointAt(1)) // => Option.some(98) * pipe("abc", String.codePointAt(10)) // => Option.none() * ``` * * @stability stable * @category getters * @since 2.0.0 */ export declare const codePointAt: { /** * Returns the Unicode code point at the specified index safely, or `None` if the index is out of bounds. * * **Example** (Reading code points) * * ```ts import.meta.vitest * import { Option, pipe, String } from "effect" * * pipe("abc", String.codePointAt(1)) // => Option.some(98) * pipe("abc", String.codePointAt(10)) // => Option.none() * ``` * * @stability stable * @category getters * @since 2.0.0 */ (index: number): (self: string) => Option.Option; /** * Returns the Unicode code point at the specified index safely, or `None` if the index is out of bounds. * * **Example** (Reading code points) * * ```ts import.meta.vitest * import { Option, pipe, String } from "effect" * * pipe("abc", String.codePointAt(1)) // => Option.some(98) * pipe("abc", String.codePointAt(10)) // => Option.none() * ``` * * @stability stable * @category getters * @since 2.0.0 */ (self: string, index: number): Option.Option; }; /** * Returns the index of the first occurrence of a substring safely, or `None` if not found. * * **Example** (Finding the first substring index) * * ```ts import.meta.vitest * import { Option, pipe, String } from "effect" * * pipe("abbbc", String.indexOf("b")) // => Option.some(1) * pipe("abbbc", String.indexOf("z")) // => Option.none() * ``` * * @stability stable * @category searching * @since 2.0.0 */ export declare const indexOf: (searchString: string) => (self: string) => Option.Option; /** * Returns the index of the last occurrence of a substring safely, or `None` if not found. * * **Example** (Finding the last substring index) * * ```ts import.meta.vitest * import { Option, pipe, String } from "effect" * * pipe("abbbc", String.lastIndexOf("b")) // => Option.some(3) * pipe("abbbc", String.lastIndexOf("d")) // => Option.none() * ``` * * @stability stable * @category searching * @since 2.0.0 */ export declare const lastIndexOf: (searchString: string) => (self: string) => Option.Option; /** * Computes locale-aware ordering for two strings, with optional locales and * collator options, and returns the result as an `Ordering` (`-1`, `0`, or * `1`). * * **Example** (Comparing strings by locale) * * ```ts import.meta.vitest * import { pipe, String } from "effect" * * pipe("a", String.localeCompare("b")) // => -1 * pipe("b", String.localeCompare("a")) // => 1 * pipe("a", String.localeCompare("a")) // => 0 * ``` * * @stability stable * @category comparisons * @since 2.0.0 */ export declare const localeCompare: (that: string, locales?: Array, options?: Intl.CollatorOptions) => (self: string) => Ordering.Ordering; /** * Matches a string against a pattern safely and returns `Option.some` with the match * array, or `Option.none` when the pattern does not match. * * **Example** (Matching regular expressions) * * ```ts import.meta.vitest * import { Option, pipe, String } from "effect" * * pipe( * "hello", * String.match(/l+/), * Option.map((match) => [match[0], match.index]) * ) // => Option.some(["ll", 2]) * pipe("hello", String.match(/x/)) // => Option.none() * ``` * * @stability stable * @category searching * @since 2.0.0 */ export declare const match: (regExp: RegExp | string) => (self: string) => Option.Option; /** * Returns an iterator over all regular expression matches in the string using * native `String.prototype.matchAll` semantics. * * **Example** (Iterating regular expression matches) * * ```ts import.meta.vitest * import { pipe, String } from "effect" * * const matches = pipe("hello world", String.matchAll(/l/g)) * * Array.from(matches, (match) => [match[0], match.index]) // => [["l", 2], ["l", 3], ["l", 9]] * ``` * * @stability stable * @category searching * @since 2.0.0 */ export declare const matchAll: (regExp: RegExp) => (self: string) => IterableIterator; /** * Normalizes a string according to the specified Unicode normalization form. * * **Example** (Normalizing Unicode strings) * * ```ts import.meta.vitest * import { pipe, String } from "effect" * * const str = "\u1E9B\u0323" * Array.from(pipe(str, String.normalize()), (character) => character.codePointAt(0)) // => [0x1e9b, 0x323] * Array.from(pipe(str, String.normalize("NFC")), (character) => character.codePointAt(0)) // => [0x1e9b, 0x323] * Array.from( * pipe(str, String.normalize("NFD")), * (character) => character.codePointAt(0) * ) // => [0x17f, 0x323, 0x307] * Array.from(pipe(str, String.normalize("NFKC")), (character) => character.codePointAt(0)) // => [0x1e69] * Array.from( * pipe(str, String.normalize("NFKD")), * (character) => character.codePointAt(0) * ) // => [0x73, 0x323, 0x307] * ``` * * @stability stable * @category transforming * @since 2.0.0 */ export declare const normalize: (form?: "NFC" | "NFD" | "NFKC" | "NFKD") => (self: string) => string; /** * Pads the string from the end with a given fill string to a specified length. * * **Example** (Padding strings at the end) * * ```ts import.meta.vitest * import { pipe, String } from "effect" * * pipe("a", String.padEnd(5)) // => "a " * pipe("a", String.padEnd(5, "_")) // => "a____" * ``` * * @stability stable * @category transforming * @since 2.0.0 */ export declare const padEnd: (maxLength: number, fillString?: string) => (self: string) => string; /** * Pads the string from the start with a given fill string to a specified length. * * **Example** (Padding strings at the start) * * ```ts import.meta.vitest * import { pipe, String } from "effect" * * pipe("a", String.padStart(5)) // => " a" * pipe("a", String.padStart(5, "_")) // => "____a" * ``` * * @stability stable * @category transforming * @since 2.0.0 */ export declare const padStart: (maxLength: number, fillString?: string) => (self: string) => string; /** * Repeats the string the specified number of times. * * **Details** * * `count` is rounded down. `NaN` and non-positive values are treated as `0`. * * **Example** (Repeating strings) * * ```ts import.meta.vitest * import { pipe, String } from "effect" * * pipe("a", String.repeat(5)) // => "aaaaa" * pipe("hello", String.repeat(3)) // => "hellohellohello" * ``` * * @stability stable * @category transforming * @since 2.0.0 */ export declare const repeat: (count: number) => (self: string) => string; /** * Replaces all occurrences of a substring or pattern in a string. * * **Example** (Replacing all matches) * * ```ts import.meta.vitest * import { pipe, String } from "effect" * * pipe("ababb", String.replaceAll("b", "c")) // => "acacc" * pipe("ababb", String.replaceAll(/ba/g, "cc")) // => "accbb" * ``` * * @stability stable * @category transforming * @since 2.0.0 */ export declare const replaceAll: (searchValue: string | RegExp, replaceValue: string) => (self: string) => string; /** * Returns the index of the first match for a string or regular expression safely, or * `Option.none` when no match is found. * * **Example** (Searching strings) * * ```ts import.meta.vitest * import { Option, String } from "effect" * * String.search("ababb", "b") // => Option.some(1) * String.search("ababb", /abb/) // => Option.some(2) * String.search("ababb", "d") // => Option.none() * ``` * * @stability stable * @category searching * @since 2.0.0 */ export declare const search: { /** * Returns the index of the first match for a string or regular expression safely, or * `Option.none` when no match is found. * * **Example** (Searching strings) * * ```ts import.meta.vitest * import { Option, String } from "effect" * * String.search("ababb", "b") // => Option.some(1) * String.search("ababb", /abb/) // => Option.some(2) * String.search("ababb", "d") // => Option.none() * ``` * * @stability stable * @category searching * @since 2.0.0 */ (regExp: RegExp | string): (self: string) => Option.Option; /** * Returns the index of the first match for a string or regular expression safely, or * `Option.none` when no match is found. * * **Example** (Searching strings) * * ```ts import.meta.vitest * import { Option, String } from "effect" * * String.search("ababb", "b") // => Option.some(1) * String.search("ababb", /abb/) // => Option.some(2) * String.search("ababb", "d") // => Option.none() * ``` * * @stability stable * @category searching * @since 2.0.0 */ (self: string, regExp: RegExp | string): Option.Option; }; /** * Converts the string to lowercase according to the specified locale. * * **Example** (Lowercasing strings by locale) * * ```ts import.meta.vitest * import { pipe, String } from "effect" * * const str = "\u0130" * pipe(str, String.toLocaleLowerCase("tr")) // => "i" * ``` * * @stability stable * @category transforming * @since 2.0.0 */ export declare const toLocaleLowerCase: (locale?: string | Array) => (self: string) => string; /** * Converts the string to uppercase according to the specified locale. * * **Example** (Uppercasing strings by locale) * * ```ts import.meta.vitest * import { pipe, String } from "effect" * * const str = "i\u0307" * pipe(str, String.toLocaleUpperCase("lt-LT")) // => "I" * ``` * * @stability stable * @category transforming * @since 2.0.0 */ export declare const toLocaleUpperCase: (locale?: string | Array) => (self: string) => string; /** * Keeps the specified number of characters from the start of a string. * * **Details** * * If `n` is larger than the available number of characters, the string will * be returned whole. * * If `n` is not a positive number, including `NaN`, an empty string will be * returned. * * If `n` is a float, it will be rounded down to the nearest integer. * * **Example** (Taking characters from the start) * * ```ts import.meta.vitest * import { String } from "effect" * * String.takeLeft("Hello World", 5) // => "Hello" * ``` * * @stability stable * @category transforming * @since 2.0.0 */ export declare const takeLeft: { /** * Keeps the specified number of characters from the start of a string. * * **Details** * * If `n` is larger than the available number of characters, the string will * be returned whole. * * If `n` is not a positive number, including `NaN`, an empty string will be * returned. * * If `n` is a float, it will be rounded down to the nearest integer. * * **Example** (Taking characters from the start) * * ```ts import.meta.vitest * import { String } from "effect" * * String.takeLeft("Hello World", 5) // => "Hello" * ``` * * @stability stable * @category transforming * @since 2.0.0 */ (n: number): (self: string) => string; /** * Keeps the specified number of characters from the start of a string. * * **Details** * * If `n` is larger than the available number of characters, the string will * be returned whole. * * If `n` is not a positive number, including `NaN`, an empty string will be * returned. * * If `n` is a float, it will be rounded down to the nearest integer. * * **Example** (Taking characters from the start) * * ```ts import.meta.vitest * import { String } from "effect" * * String.takeLeft("Hello World", 5) // => "Hello" * ``` * * @stability stable * @category transforming * @since 2.0.0 */ (self: string, n: number): string; }; /** * Keeps the specified number of characters from the end of a string. * * **Details** * * If `n` is larger than the available number of characters, the string will * be returned whole. * * If `n` is not a positive number, including `NaN`, an empty string will be * returned. * * If `n` is a float, it will be rounded down to the nearest integer. * * **Example** (Taking characters from the end) * * ```ts import.meta.vitest * import { String } from "effect" * * String.takeRight("Hello World", 5) // => "World" * ``` * * @stability stable * @category transforming * @since 2.0.0 */ export declare const takeRight: { /** * Keeps the specified number of characters from the end of a string. * * **Details** * * If `n` is larger than the available number of characters, the string will * be returned whole. * * If `n` is not a positive number, including `NaN`, an empty string will be * returned. * * If `n` is a float, it will be rounded down to the nearest integer. * * **Example** (Taking characters from the end) * * ```ts import.meta.vitest * import { String } from "effect" * * String.takeRight("Hello World", 5) // => "World" * ``` * * @stability stable * @category transforming * @since 2.0.0 */ (n: number): (self: string) => string; /** * Keeps the specified number of characters from the end of a string. * * **Details** * * If `n` is larger than the available number of characters, the string will * be returned whole. * * If `n` is not a positive number, including `NaN`, an empty string will be * returned. * * If `n` is a float, it will be rounded down to the nearest integer. * * **Example** (Taking characters from the end) * * ```ts import.meta.vitest * import { String } from "effect" * * String.takeRight("Hello World", 5) // => "World" * ``` * * @stability stable * @category transforming * @since 2.0.0 */ (self: string, n: number): string; }; /** * Returns an `IterableIterator` which yields each line contained within the * string, trimming off the trailing newline character. * * **Example** (Iterating lines without separators) * * ```ts import.meta.vitest * import { String } from "effect" * * Array.from(String.linesIterator("hello\nworld\n")) // => ["hello", "world"] * ``` * * @stability stable * @category splitting * @since 2.0.0 */ export declare const linesIterator: (self: string) => LinesIterator; /** * Returns an `IterableIterator` which yields each line contained within the * string as well as the trailing newline character. * * **Example** (Iterating lines with separators) * * ```ts import.meta.vitest * import { String } from "effect" * * Array.from(String.linesWithSeparators("hello\nworld\n")) // => ["hello\n", "world\n"] * ``` * * @stability stable * @category splitting * @since 2.0.0 */ export declare const linesWithSeparators: (s: string) => LinesIterator; /** * Strips a leading margin prefix from every line using the supplied margin * character. * * **Example** (Stripping custom margins) * * ```ts import.meta.vitest * import { String } from "effect" * * String.stripMarginWith(" |hello\n |world", "|") // => "hello\nworld" * ``` * * @stability stable * @category transforming * @since 2.0.0 */ export declare const stripMarginWith: { /** * Strips a leading margin prefix from every line using the supplied margin * character. * * **Example** (Stripping custom margins) * * ```ts import.meta.vitest * import { String } from "effect" * * String.stripMarginWith(" |hello\n |world", "|") // => "hello\nworld" * ``` * * @stability stable * @category transforming * @since 2.0.0 */ (marginChar: string): (self: string) => string; /** * Strips a leading margin prefix from every line using the supplied margin * character. * * **Example** (Stripping custom margins) * * ```ts import.meta.vitest * import { String } from "effect" * * String.stripMarginWith(" |hello\n |world", "|") // => "hello\nworld" * ``` * * @stability stable * @category transforming * @since 2.0.0 */ (self: string, marginChar: string): string; }; /** * Strips a leading `|` margin prefix from every line. * * **Example** (Stripping pipe margins) * * ```ts import.meta.vitest * import { String } from "effect" * * String.stripMargin(" |hello\n |world") // => "hello\nworld" * ``` * * @stability stable * @category transforming * @since 2.0.0 */ export declare const stripMargin: (self: string) => string; /** * Converts a snake_case string to camelCase. * * **Details** * * Keeps the first character, then replaces each later underscore and the * character after it with that character uppercased. A trailing underscore is * dropped. Input made only of an even number of underscores returns `""`. * * **Example** (Converting snake_case to camelCase) * * ```ts import.meta.vitest * import { String } from "effect" * * String.snakeToCamel("hello_world") // => "helloWorld" * String.snakeToCamel("foo_bar_baz") // => "fooBarBaz" * ``` * * @stability stable * @category transforming * @since 2.0.0 */ export declare const snakeToCamel: (self: string) => string; /** * Converts a snake_case string to PascalCase. * * **Details** * * Uppercases the first character, then replaces each later underscore and the * character after it with that character uppercased. A trailing underscore is * dropped. Input made only of an even number of underscores returns `""`. * * **Example** (Converting snake_case to PascalCase) * * ```ts import.meta.vitest * import { String } from "effect" * * String.snakeToPascal("hello_world") // => "HelloWorld" * String.snakeToPascal("foo_bar_baz") // => "FooBarBaz" * ``` * * @stability stable * @category transforming * @since 2.0.0 */ export declare const snakeToPascal: (self: string) => string; /** * Converts a snake_case string to kebab-case. * * **Example** (Converting snake_case to kebab-case) * * ```ts import.meta.vitest * import { String } from "effect" * * String.snakeToKebab("hello_world") // => "hello-world" * String.snakeToKebab("foo_bar_baz") // => "foo-bar-baz" * ``` * * @stability stable * @category transforming * @since 2.0.0 */ export declare const snakeToKebab: (self: string) => string; /** * Converts a camelCase string to snake_case. * * **Example** (Converting camelCase to snake_case) * * ```ts import.meta.vitest * import { String } from "effect" * * String.camelToSnake("helloWorld") // => "hello_world" * String.camelToSnake("fooBarBaz") // => "foo_bar_baz" * ``` * * @stability stable * @category transforming * @since 2.0.0 */ export declare const camelToSnake: (self: string) => string; /** * Converts a PascalCase string to snake_case. * * **Example** (Converting PascalCase to snake_case) * * ```ts import.meta.vitest * import { String } from "effect" * * String.pascalToSnake("HelloWorld") // => "hello_world" * String.pascalToSnake("FooBarBaz") // => "foo_bar_baz" * ``` * * @stability stable * @category transforming * @since 2.0.0 */ export declare const pascalToSnake: (self: string) => string; /** * Converts a kebab-case string to snake_case. * * **Example** (Converting kebab-case to snake_case) * * ```ts import.meta.vitest * import { String } from "effect" * * String.kebabToSnake("hello-world") // => "hello_world" * String.kebabToSnake("foo-bar-baz") // => "foo_bar_baz" * ``` * * @stability stable * @category transforming * @since 2.0.0 */ export declare const kebabToSnake: (self: string) => string; declare class LinesIterator implements IterableIterator { private index; private readonly length; readonly s: string; readonly stripped: boolean; constructor(s: string, stripped?: boolean); next(): IteratorResult; [Symbol.iterator](): IterableIterator; private get done(); } /** * Normalizes a string by splitting it into word parts, transforming each part, * and joining the parts with a configurable delimiter. * * **When to use** * * Use when you need custom word-case output with a delimiter or part transform * that the fixed case helpers do not provide. * * @see {@link pascalCase} for fixed PascalCase output * @see {@link camelCase} for fixed lower-initial camelCase output * @see {@link constantCase} for fixed uppercase underscore-separated output * @see {@link kebabCase} for fixed lowercase hyphen-separated output * @see {@link snakeCase} for fixed lowercase underscore-separated output * * @stability stable * @category transforming * @since 4.0.0 */ export declare const noCase: { /** * Normalizes a string by splitting it into word parts, transforming each part, * and joining the parts with a configurable delimiter. * * **When to use** * * Use when you need custom word-case output with a delimiter or part transform * that the fixed case helpers do not provide. * * @see {@link pascalCase} for fixed PascalCase output * @see {@link camelCase} for fixed lower-initial camelCase output * @see {@link constantCase} for fixed uppercase underscore-separated output * @see {@link kebabCase} for fixed lowercase hyphen-separated output * @see {@link snakeCase} for fixed lowercase underscore-separated output * * @stability stable * @category transforming * @since 4.0.0 */ (options?: { readonly splitRegExp?: RegExp | ReadonlyArray | undefined; readonly stripRegExp?: RegExp | ReadonlyArray | undefined; readonly delimiter?: string | undefined; readonly transform?: (part: string, index: number, parts: ReadonlyArray) => string; }): (self: string) => string; /** * Normalizes a string by splitting it into word parts, transforming each part, * and joining the parts with a configurable delimiter. * * **When to use** * * Use when you need custom word-case output with a delimiter or part transform * that the fixed case helpers do not provide. * * @see {@link pascalCase} for fixed PascalCase output * @see {@link camelCase} for fixed lower-initial camelCase output * @see {@link constantCase} for fixed uppercase underscore-separated output * @see {@link kebabCase} for fixed lowercase hyphen-separated output * @see {@link snakeCase} for fixed lowercase underscore-separated output * * @stability stable * @category transforming * @since 4.0.0 */ (self: string, options?: { readonly splitRegExp?: RegExp | ReadonlyArray | undefined; readonly stripRegExp?: RegExp | ReadonlyArray | undefined; readonly delimiter?: string | undefined; readonly transform?: (part: string, index: number, parts: ReadonlyArray) => string; }): string; }; /** * Converts a string to PascalCase. * * **When to use** * * Use to normalize strings from spaces, separators, or camel/Pascal word * boundaries into PascalCase. * * @see {@link camelCase} for lower-initial camelCase output * @see {@link noCase} for configurable delimiters and part transforms * @see {@link snakeToPascal} for converting known snake_case input only * * @stability stable * @category transforming * @since 4.0.0 */ export declare const pascalCase: (self: string) => string; /** * Converts a string to camelCase. * * **When to use** * * Use to normalize mixed word separators or existing PascalCase/camelCase text * into lower-initial camelCase identifiers. * * @see {@link noCase} for configurable delimiters and part transforms * @see {@link pascalCase} for upper-initial PascalCase output * @see {@link snakeCase} for lowercase underscore-separated output * @see {@link kebabCase} for lowercase hyphen-separated output * @see {@link constantCase} for uppercase underscore-separated output * * @stability stable * @category transforming * @since 4.0.0 */ export declare const camelCase: (self: string) => string; /** * Converts a string to CONSTANT_CASE (uppercase with underscores). * * **When to use** * * Use to normalize words from mixed input formats into uppercase, * underscore-separated identifiers. * * @see {@link snakeCase} for lowercase underscore-separated output * @see {@link kebabCase} for lowercase hyphen-separated output * @see {@link camelCase} for lower-initial camelCase output * @see {@link pascalCase} for upper-initial PascalCase output * @see {@link configCase} for configuration key casing that preserves numeric word groups * @see {@link noCase} for configurable delimiters and part transforms * * @stability stable * @category transforming * @since 4.0.0 */ export declare const constantCase: (self: string) => string; /** * Converts a string to CONFIG_CASE (uppercase with underscores) for * configuration keys. * * **When to use** * * Use to normalize configuration path segments into environment-variable-like * keys while preserving numeric word groups such as `v2`. * * **Details** * * Unlike {@link constantCase}, digit-letter boundaries are not split. For * example, `"api-v2 xml"` becomes `"API_V2_XML"`. * * @see {@link constantCase} for standard uppercase underscore-separated output * @stability stable * @category transforming * @since 4.0.0 */ export declare const configCase: (self: string) => string; /** * Converts a string to kebab-case (lowercase with hyphens). * * **When to use** * * Use to normalize free-form labels, identifiers, or keys into lowercase * hyphen-separated text. * * @see {@link noCase} for configurable delimiters and part transforms * @see {@link snakeCase} for lowercase underscore-separated output * @see {@link constantCase} for uppercase underscore-separated output * @see {@link camelCase} for lower-initial camelCase output * @see {@link pascalCase} for upper-initial PascalCase output * * @stability stable * @category transforming * @since 4.0.0 */ export declare const kebabCase: (self: string) => string; /** * Converts a string to snake_case (lowercase with underscores). * * **When to use** * * Use to normalize mixed-case or separator-delimited text into lowercase words * joined with underscores. * * @see {@link noCase} for configurable lower-level normalization * @see {@link kebabCase} for lowercase hyphen-separated output * @see {@link constantCase} for uppercase underscore-separated output * * @stability stable * @category transforming * @since 4.0.0 */ export declare const snakeCase: (self: string) => string; /** * Reducer for concatenating `string`s. * * **When to use** * * Use to concatenate many strings through APIs that consume a `Reducer`. * * **Details** * * The reducer starts from `""`, so combining an empty collection returns `""`. * * @see {@link concat} for concatenating two strings directly * * @stability stable * @category combining * @since 4.0.0 */ export declare const ReducerConcat: Reducer.Reducer; export {}; //# sourceMappingURL=String.d.ts.map