{"version":3,"sources":["../src/async_option.ts","../src/async_result.ts","../src/error.ts","../src/symbols.ts","../src/option.ts","../src/result.ts","../src/try.ts","../src/fn.ts","../src/util.ts"],"names":["fn","gen"],"mappings":"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","sourcesContent":["import {AsyncResult} from \".\";\nimport type {Option, OptionMatch, OptionMatchAsync} from \"./option\";\n\n/**\n * A promise that resolves to an `Option`.\n *\n * This class is useful for chaining multiple asynchronous operations that return an `Option`.\n */\nexport class AsyncOption<T> implements PromiseLike<Option<T>> {\n\tconstructor(readonly promise: Promise<Option<T>> | PromiseLike<Option<T>> | AsyncOption<T>) {}\n\n\tthen<A, B>(\n\t\tsuccessCallback?: (res: Option<T>) => A | PromiseLike<A>,\n\t\tfailureCallback?: (reason: unknown) => B | PromiseLike<B>,\n\t): PromiseLike<A | B> {\n\t\treturn this.promise.then(successCallback, failureCallback);\n\t}\n\n\tcatch<B>(rejectionCallback?: (reason: unknown) => B | PromiseLike<B>): PromiseLike<B> {\n\t\treturn this.promise.then(undefined, rejectionCallback);\n\t}\n\n\tfinally(callback: () => void): PromiseLike<Option<T>> {\n\t\treturn this.then(\n\t\t\t(value) => {\n\t\t\t\tcallback();\n\t\t\t\treturn value;\n\t\t\t},\n\t\t\t(reason) => {\n\t\t\t\tcallback();\n\t\t\t\tthrow reason;\n\t\t\t},\n\t\t);\n\t}\n\n\t/**\n\t * Async version of `Option#match`.\n\t */\n\tasync match<A, B>(matcher: OptionMatch<T, A, B>): Promise<A | B> {\n\t\treturn (await this).match(matcher);\n\t}\n\n\tasync matchAsync<A, B>(matcher: OptionMatchAsync<T, A, B>): Promise<A | B> {\n\t\treturn (await this).matchAsync(matcher);\n\t}\n\n\t/**\n\t * Async version of `Option#value`.\n\t */\n\tasync value(): Promise<T | undefined> {\n\t\treturn (await this).value();\n\t}\n\n\t/**\n\t * Async version of `Option#okOr`.\n\t */\n\tokOr<E>(err: E): AsyncResult<T, E> {\n\t\treturn new AsyncResult(this.then((option) => option.okOr(err)));\n\t}\n\n\t/**\n\t * Async version of `Option#okOrElse`.\n\t */\n\tokOrElse<E>(err: () => E): AsyncResult<T, E> {\n\t\treturn new AsyncResult(this.then((option) => option.okOrElse(err)));\n\t}\n\n\t/**\n\t * Async version of `Option#and`.\n\t */\n\tand<U>(other: AsyncOption<U>): AsyncOption<U> {\n\t\treturn new AsyncOption(\n\t\t\tthis.then((option) => other.then((otherOption) => option.and(otherOption))),\n\t\t);\n\t}\n\n\t/**\n\t * Async version of `Option#andThen`.\n\t */\n\tandThen<U>(f: (value: T) => Option<U>): AsyncOption<U> {\n\t\treturn new AsyncOption(this.then((option) => option.andThen((value) => f(value))));\n\t}\n\n\t/**\n\t * Async version of `Option#inspect`.\n\t */\n\tinspect(f: (value: T) => void): AsyncOption<T> {\n\t\treturn new AsyncOption(this.then((option) => option.inspect(f)));\n\t}\n\n\t/**\n\t * Async version of `Option#expect`.\n\t */\n\tasync expect(message: string): Promise<T> {\n\t\treturn (await this).expect(message);\n\t}\n\n\t/**\n\t * Async version of `Option#filter`.\n\t */\n\tfilter(f: (value: T) => boolean): AsyncOption<T> {\n\t\treturn new AsyncOption(this.then((option) => option.filter(f)));\n\t}\n\n\t/**\n\t * Async version of `Option#flatten`.\n\t */\n\tflatten<U>(this: AsyncOption<Option<U>>): AsyncOption<U> {\n\t\treturn new AsyncOption(this.then((option) => option.flatten()));\n\t}\n\n\t/**\n\t * Async version of `Option#map`.\n\t */\n\tmap<U>(f: (value: T) => U): AsyncOption<U> {\n\t\treturn new AsyncOption(this.then((option) => option.map(f)));\n\t}\n\n\t/**\n\t * Async version of `Option#mapOr`.\n\t */\n\tasync mapOr<A, B>(defaultValue: A, f: (value: T) => B): Promise<A | B> {\n\t\treturn (await this).mapOr(defaultValue, f);\n\t}\n\n\t/**\n\t * Async version of `Option#mapOrElse`.\n\t */\n\tasync mapOrElse<A, B>(defaultValue: () => A, f: (value: T) => B): Promise<A | B> {\n\t\treturn (await this).mapOrElse(defaultValue, f);\n\t}\n\n\t/**\n\t * Async version of `Option#or`.\n\t */\n\tor<U>(other: AsyncOption<U>): AsyncOption<T | U> {\n\t\treturn new AsyncOption(\n\t\t\tthis.then((thisOption) => other.then((otherOption) => thisOption.or(otherOption))),\n\t\t);\n\t}\n\n\t/**\n\t * Async version of `Option#orElse`.\n\t */\n\torElse<U>(f: () => Option<U>): AsyncOption<T | U> {\n\t\treturn new AsyncOption(this.then((thisOption) => thisOption.orElse(() => f())));\n\t}\n\n\t/**\n\t * Async version of `Option#unwrap`.\n\t */\n\tasync unwrap(): Promise<T> {\n\t\treturn (await this).unwrap();\n\t}\n\n\t/**\n\t * Async version of `Option#unwrapOr`.\n\t */\n\tasync unwrapOr<U>(defaultValue: U): Promise<T | U> {\n\t\treturn (await this).unwrapOr(defaultValue);\n\t}\n\n\t/**\n\t * Async version of `Option#unwrapOrElse`.\n\t */\n\tasync unwrapOrElse<U>(f: () => U): Promise<T | U> {\n\t\treturn (await this).unwrapOrElse(f);\n\t}\n\n\t/**\n\t * Async version of `Option#xor`.\n\t */\n\txor<U>(other: AsyncOption<U>): AsyncOption<T | U> {\n\t\treturn new AsyncOption(\n\t\t\tthis.then((thisOption) => other.then((otherOption) => thisOption.xor(otherOption))),\n\t\t);\n\t}\n}\n","import {AsyncOption} from \"./async_option\";\nimport type {Result, ResultImpl, ResultMatch, ResultMatchAsync} from \"./result\";\n\n/**\n * A promise that resolves to a `Result`.\n *\n * This class is useful for chaining multiple asynchronous operations that return a `Result`.\n */\nexport class AsyncResult<T, E> implements PromiseLike<Result<T, E>> {\n\tconstructor(\n\t\treadonly promise: Promise<Result<T, E>> | PromiseLike<Result<T, E>> | AsyncResult<T, E>,\n\t) {}\n\n\t*[Symbol.iterator](): Iterator<AsyncResult<T, E>, T, any> {\n\t\treturn yield this;\n\t}\n\n\tthen<A, B>(\n\t\tsuccessCallback?: (res: Result<T, E>) => A | PromiseLike<A>,\n\t\tfailureCallback?: (reason: unknown) => B | PromiseLike<B>,\n\t): PromiseLike<A | B> {\n\t\treturn this.promise.then(successCallback, failureCallback);\n\t}\n\n\tcatch<B>(rejectionCallback?: (reason: unknown) => B | PromiseLike<B>): PromiseLike<B> {\n\t\treturn this.promise.then(undefined, rejectionCallback);\n\t}\n\n\tfinally(callback: () => void): PromiseLike<Result<T, E>> {\n\t\treturn this.then(\n\t\t\t(value) => {\n\t\t\t\tcallback();\n\t\t\t\treturn value;\n\t\t\t},\n\t\t\t(reason) => {\n\t\t\t\tcallback();\n\t\t\t\tthrow reason;\n\t\t\t},\n\t\t);\n\t}\n\n\t/**\n\t * Async version of `Result#match`.\n\t */\n\tasync match<A, B>(matcher: ResultMatch<T, E, A, B>): Promise<A | B> {\n\t\treturn (await this).match(matcher);\n\t}\n\n\tasync matchAsync<A, B>(matcher: ResultMatchAsync<T, E, A, B>): Promise<A | B> {\n\t\treturn (await this).matchAsync(matcher);\n\t}\n\n\tasync value(): Promise<T | undefined> {\n\t\treturn (await this).value();\n\t}\n\n\tasync error(): Promise<E | undefined> {\n\t\treturn (await this).error();\n\t}\n\n\t/**\n\t * Async version of `Result#ok`.\n\t */\n\tok(): AsyncOption<T> {\n\t\treturn new AsyncOption(this.then((result) => result.ok()));\n\t}\n\n\t/**\n\t * Async version of `Result#err`.\n\t */\n\terr(): AsyncOption<E> {\n\t\treturn new AsyncOption(this.then((result) => result.err()));\n\t}\n\n\t/**\n\t * Async version of `Result#and`.\n\t */\n\tand<U, F>(other: AsyncResult<U, F>): AsyncResult<U, E | F> {\n\t\treturn new AsyncResult(\n\t\t\tthis.then((result) => other.then((otherResult) => result.and(otherResult))),\n\t\t);\n\t}\n\n\t/**\n\t * Async version of `Result#andThen`.\n\t */\n\tandThen<U, F>(f: (value: T) => Result<U, F>): AsyncResult<U, E | F> {\n\t\treturn new AsyncResult(this.then((result) => result.andThen((value) => f(value))));\n\t}\n\n\t/**\n\t * Async version of `Result#andThenAsync`.\n\t */\n\tandThenAsync<U, F>(f: (value: T) => Promise<Result<U, F>>): AsyncResult<U, E | F> {\n\t\treturn new AsyncResult(this.then((result) => result.andThenAsync((value) => f(value))));\n\t}\n\n\t/**\n\t * Async version of `Result#expect`.\n\t */\n\tasync expect(message: string): Promise<T> {\n\t\treturn (await this).expect(message);\n\t}\n\n\t/**\n\t * Async version of `Result#expectErr`.\n\t */\n\tasync expectErr(message: string): Promise<E> {\n\t\treturn (await this).expectErr(message);\n\t}\n\n\t/**\n\t * Async version of `Result#flatten`.\n\t */\n\tflatten<U, F>(this: AsyncResult<ResultImpl<U, F>, E>): AsyncResult<U, E | F> {\n\t\treturn new AsyncResult(this.then((result) => result.flatten()));\n\t}\n\n\t/**\n\t * Async version of `Result#inspect`.\n\t */\n\tinspect(f: (value: T) => void): AsyncResult<T, E> {\n\t\treturn new AsyncResult(this.then((result) => result.inspect(f)));\n\t}\n\n\t/**\n\t * Async version of `Result#inspectAsync`.\n\t */\n\tinspectAsync(f: (value: T) => Promise<void>): AsyncResult<T, E> {\n\t\treturn new AsyncResult(this.then((result) => result.inspectAsync(f)));\n\t}\n\n\t/**\n\t * Async version of `Result#inspectErr`.\n\t */\n\tinspectErr(f: (error: E) => void): AsyncResult<T, E> {\n\t\treturn new AsyncResult(this.then((result) => result.inspectErr(f)));\n\t}\n\n\t/**\n\t * Async version of `Result#inspectErrAsync`.\n\t */\n\tinspectErrAsync(f: (error: E) => Promise<void>): AsyncResult<T, E> {\n\t\treturn new AsyncResult(this.then((result) => result.inspectErrAsync(f)));\n\t}\n\n\t/**\n\t * Async version of `Result#map`.\n\t */\n\tmap<U>(f: (value: T) => U): AsyncResult<U, E> {\n\t\treturn new AsyncResult(this.then((result) => result.map(f)));\n\t}\n\n\t/**\n\t * Async version of `Result#mapAsync`.\n\t */\n\tmapAsync<U>(f: (value: T) => Promise<U>): AsyncResult<U, E> {\n\t\treturn new AsyncResult(this.then((result) => result.mapAsync(f)));\n\t}\n\n\t/**\n\t * Async version of `Result#mapErr`.\n\t */\n\tmapErr<F>(f: (error: E) => F): AsyncResult<T, F> {\n\t\treturn new AsyncResult(this.then((result) => result.mapErr(f)));\n\t}\n\n\t/**\n\t * Async version of `Result#mapErrAsync`.\n\t */\n\tmapErrAsync<F>(f: (error: E) => Promise<F>): AsyncResult<T, F> {\n\t\treturn new AsyncResult(this.then((result) => result.mapErrAsync(f)));\n\t}\n\n\t/**\n\t * Async version of `Result#mapOr`.\n\t */\n\tasync mapOr<A, B>(defaultValue: A, f: (value: T) => B): Promise<A | B> {\n\t\treturn (await this).mapOr(defaultValue, f);\n\t}\n\n\t/**\n\t * Async version of `Result#mapOrElse`.\n\t */\n\tasync mapOrElse<A, B>(defaultValue: (error: E) => A, f: (value: T) => B): Promise<A | B> {\n\t\treturn (await this).mapOrElse(defaultValue, f);\n\t}\n\n\t/**\n\t * Async version of `Result#or`.\n\t */\n\tor<U, F>(other: AsyncResult<U, F>): AsyncResult<T | U, F> {\n\t\treturn new AsyncResult(\n\t\t\tthis.then((thisResult) => other.then((otherResult) => thisResult.or(otherResult))),\n\t\t);\n\t}\n\n\t/**\n\t * Async version of `Result#orElse`.\n\t */\n\torElse<U, F>(f: (error: E) => Result<U, F>): AsyncResult<T | U, F> {\n\t\treturn new AsyncResult(this.then((thisResult) => thisResult.orElse((error) => f(error))));\n\t}\n\n\t/**\n\t * Async version of `Result#orElseAsync`.\n\t */\n\torElseAsync<U, F>(f: (error: E) => Promise<Result<U, F>>): AsyncResult<T | U, F> {\n\t\treturn new AsyncResult(\n\t\t\tthis.then((thisResult) => thisResult.orElseAsync((error) => f(error))),\n\t\t);\n\t}\n\n\t/**\n\t * Async version of `Result#unwrap`.\n\t */\n\tasync unwrap(): Promise<T> {\n\t\treturn (await this).unwrap();\n\t}\n\n\t/**\n\t * Async version of `Result#unwrapErr`.\n\t */\n\tasync unwrapErr(): Promise<E> {\n\t\treturn (await this).unwrapErr();\n\t}\n\n\t/**\n\t * Async version of `Result#unwrapOr`.\n\t */\n\tasync unwrapOr<U>(defaultValue: U): Promise<T | U> {\n\t\treturn (await this).unwrapOr(defaultValue);\n\t}\n\n\t/**\n\t * Async version of `Result#unwrapOrElse`.\n\t */\n\tasync unwrapOrElse<U>(defaultValue: (error: E) => U): Promise<T | U> {\n\t\treturn (await this).unwrapOrElse(defaultValue);\n\t}\n}\n","/**\n * A special error to indicate an unrecoverable error.\n *\n * This error is not caught by any function of the library, and is meant to be used to indicate a critical error that should not be caught.\n *\n * Use this error when you want to indicate that the program should stop executing.\n */\nexport class Panic extends Error {\n\toverride readonly name = \"Panic\";\n\toverride readonly cause?: unknown;\n\n\tconstructor(message?: string, options?: {cause?: unknown}) {\n\t\tsuper(message, options);\n\t\tthis.cause = options?.cause;\n\t}\n}\n\n/**\n * An abstract class with a `tag` discriminant.\n *\n * Adding a discriminant field can be beneficial for distinguishing between different types of errors during error handling. It also prevents TypeScript from unifying types, ensuring that each error is treated uniquely based on its discriminant value.\n */\nexport abstract class ErrorWithTag extends Error {\n\tabstract readonly tag: string;\n}\n\n/**\n * An abstract class with a typed `cause` field.\n *\n * This class is useful for errors that have a cause, which is another error that caused the current error to occur.\n */\nexport abstract class ErrorWithCause<Cause> extends ErrorWithTag {\n\toverride readonly cause: Cause;\n\n\tconstructor(message: string, options: {cause: Cause}) {\n\t\tsuper(message);\n\t\tthis.cause = options.cause;\n\t}\n}\n\n/**\n * Parses an error into an `Error` instance.\n *\n * If the error is already an instance of `Error`, it is returned as is. Otherwise, a new `TypeError` instance is created with the error as the cause.\n */\nexport function parseError(error: unknown): Error {\n\tif (error instanceof Error) {\n\t\treturn error;\n\t}\n\treturn new TypeError(`Invalid error type: '${String(error)}'`, {cause: error});\n}\n","export const inspect = Symbol.for(\"nodejs.util.inspect.custom\");\nexport const tag = Symbol(\"tag\");\n","import {AsyncOption} from \"./async_option\";\nimport {AsyncResult} from \"./async_result\";\nimport {Panic} from \"./error\";\nimport {Err, Ok, type Result} from \"./result\";\nimport * as symbols from \"./symbols\";\n\nexport type OptionMatch<T, A, B> = {\n\tSome: (value: T) => A;\n\tNone: () => B;\n};\n\nexport type OptionMatchAsync<T, A, B> = {\n\tSome: (value: T) => Promise<A>;\n\tNone: () => Promise<B>;\n};\n\nexport class OptionImpl<T> {\n\treadonly #kind?: true;\n\treadonly #val?: T;\n\n\tconstructor(some: boolean, x?: T) {\n\t\tif (some) {\n\t\t\tthis.#kind = true;\n\t\t\tthis.#val = x!;\n\t\t}\n\t}\n\n\tprivate unwrapFailed(message: string): never {\n\t\tthrow new Panic(message, {cause: this.#val});\n\t}\n\n\t/**\n\t * Matches the option to its content.\n\t *\n\t * **Examples**\n\t *\n\t * ```\n\t * Some(42).match({\n\t * \tSome: (value) => value + 1,\n\t * \tNone: () => 0\n\t * }) // => 43\n\t * ```\n\t */\n\tmatch<A, B>(pattern: OptionMatch<T, A, B>): A | B {\n\t\treturn this.#kind ? pattern.Some(this.#val as T) : pattern.None();\n\t}\n\n\tmatchAsync<A, B>(pattern: OptionMatchAsync<T, A, B>): Promise<A | B> {\n\t\treturn this.#kind ? pattern.Some(this.#val as T) : pattern.None();\n\t}\n\n\t/**\n\t * Returns the contained `Some` value, if exists.\n\t */\n\tvalue(): T | undefined {\n\t\treturn this.#val;\n\t}\n\n\t/**\n\t * Returns `true` if the option is a `Some` value.\n\t */\n\tisSome(): this is Some<T> {\n\t\treturn this.#kind === true;\n\t}\n\n\t/**\n\t * Returns `true` if the option is a `Some` value and the contained value is equal to `value`.\n\t *\n\t * Maybe not as useful as using `option.isSome() && f(option.value)`, because it doesn't narrow the type, but it's here for completeness.\n\t */\n\tisSomeAnd(predicate: (value: T) => boolean): this is Some<T> {\n\t\treturn this.#kind === true && predicate(this.#val as T);\n\t}\n\n\t/**\n\t * Returns `true` if the option is a `None` value.\n\t */\n\tisNone(): this is None {\n\t\treturn this.#kind !== true;\n\t}\n\n\t/**\n\t * Returns the contained `Some` value, if exists.\n\t *\n\t * Throws `Panic` with the provided message if the value is `None`.\n\t *\n\t * **Examples**\n\t *\n\t * ```\n\t * Some(42).expect(\"The world is ending\") // => 42\n\t * None.expect(\"The world is ending\") // => Panic: The world is ending\n\t * ```\n\t */\n\texpect(message: string): T {\n\t\treturn this.#kind ? (this.#val as T) : this.unwrapFailed(message);\n\t}\n\n\t/**\n\t * Returns the contained `Some` value, if exists.\n\t *\n\t * Throws `Panic` with a default message if the value is `None`.\n\t *\n\t * **Examples**\n\t *\n\t * ```\n\t * Some(42).unwrap() // => 42\n\t * None.unwrap() // => Panic: called \"unwrap()\" on None\n\t * ```\n\t */\n\tunwrap(): T {\n\t\treturn this.expect(`called \\`unwrap()\\` on \\`None\\``);\n\t}\n\n\t/**\n\t * Returns the contained `Some` value, if exists.\n\t *\n\t * Otherwise, returns the provided default value.\n\t *\n\t * **Examples**\n\t *\n\t * ```\n\t * Some(42).unwrapOr(0) // => 42\n\t * None.unwrapOr(0) // => 0\n\t * ```\n\t */\n\tunwrapOr<U>(defaultValue: U): T | U {\n\t\treturn this.#kind ? (this.#val as T) : defaultValue;\n\t}\n\n\t/**\n\t * Returns the contained `Some` value, if exists.\n\t *\n\t * Otherwise, computes the provided default value.\n\t *\n\t * **Examples**\n\t *\n\t * ```\n\t * Some(42).unwrapOrElse(() => 0) // => 42\n\t * None.unwrapOrElse(() => 0) // => 0\n\t * ```\n\t */\n\tunwrapOrElse<U>(defaultValue: () => U): T | U {\n\t\treturn this.#kind ? (this.#val as T) : defaultValue();\n\t}\n\n\tunwrapOrElseAsync<U>(defaultValue: () => Promise<U>): Promise<T | U> {\n\t\treturn this.#kind ? Promise.resolve(this.#val as T) : defaultValue();\n\t}\n\n\t/**\n\t * Maps an `Option<T>` to `Option<U>` by applying a function to a contained value.\n\t *\n\t * **Examples**\n\t *\n\t * ```\n\t * Some(42).map(x => x + 1) // => Some(43)\n\t * None.map(x => x + 1) // => None\n\t * ```\n\t */\n\tmap<U>(f: (value: T) => U): Option<U> {\n\t\treturn this.#kind ? Some(f(this.#val as T)) : None;\n\t}\n\n\tmapAsync<U>(f: (value: T) => Promise<U>): AsyncOption<U> {\n\t\treturn new AsyncOption(this.#kind ? f(this.#val as T).then(Some) : Promise.resolve(None));\n\t}\n\n\t/**\n\t * Calls `f` if the `Option` is `Some`, otherwise returns `None`.\n\t *\n\t * **Examples**\n\t *\n\t * ```\n\t * Ok(42).inspect(console.log) // => 42\n\t * ```\n\t */\n\tinspect(f: (value: T) => void): this {\n\t\tif (this.#kind) {\n\t\t\tf(this.#val as T);\n\t\t}\n\t\treturn this;\n\t}\n\n\tinspectAsync(f: (value: T) => Promise<void>): AsyncOption<T> {\n\t\treturn new AsyncOption(\n\t\t\tthis.#kind\n\t\t\t\t? f(this.#val as T).then(() => this as unknown as Some<T>)\n\t\t\t\t: Promise.resolve(None),\n\t\t);\n\t}\n\n\t/**\n\t * Returns the provided default result (if none), or applies a function to the contained value (if any).\n\t *\n\t * **Examples**\n\t *\n\t * ```\n\t * Some(42).mapOr(0, x => x + 1) // => 43\n\t * None.mapOr(0, x => x + 1) // => 0\n\t * ```\n\t */\n\tmapOr<A, B>(defaultValue: A, f: (value: T) => B): A | B {\n\t\treturn this.#kind ? f(this.#val as T) : defaultValue;\n\t}\n\n\tmapOrAsync<A, B>(defaultValue: A, f: (value: T) => Promise<B>): Promise<A | B> {\n\t\treturn this.#kind ? f(this.#val as T) : Promise.resolve(defaultValue);\n\t}\n\n\t/**\n\t * Returns the provided default result (if none), or computes a default value by applying a function to the contained value (if any).\n\t *\n\t * **Examples**\n\t *\n\t * ```\n\t * const k = 21\n\t * Some(\"foo\").mapOrElse(() => k * 2, (v) => v.length) // => 3\n\t * None.mapOrElse(() => k * 2, (v) => v.length) // => 42\n\t * ```\n\t */\n\tmapOrElse<A, B>(defaultValue: () => A, f: (value: T) => B): A | B {\n\t\treturn this.#kind ? f(this.#val as T) : defaultValue();\n\t}\n\n\tmapOrElseAsync<A, B>(\n\t\tdefaultValue: () => Promise<A>,\n\t\tf: (value: T) => Promise<B>,\n\t): Promise<A | B> {\n\t\treturn this.#kind ? f(this.#val as T) : defaultValue();\n\t}\n\n\t/**\n\t * Transforms the `Option<T>` into a `Result<T, E>`, mapping `Some(v)` to `Ok(v)` and `None` to `Err(err)`.\n\t *\n\t * **Examples**\n\t *\n\t * ```\n\t * Some(42).okOr(\"failed\") // => Ok(42)\n\t * None.okOr(\"failed\") // => Err(\"failed\")\n\t * ```\n\t */\n\tokOr<E>(err: E): Result<T, E> {\n\t\treturn this.#kind ? Ok(this.#val as T) : Err(err);\n\t}\n\n\t/**\n\t * Transforms the `Option<T>` into a `Result<T, E>`, mapping `Some(v)` to `Ok(v)` and `None` to `Err(err())`.\n\t *\n\t * **Examples**\n\t *\n\t * ```\n\t * Some(42).okOrElse(() => \"failed\") // => Ok(42)\n\t * None.okOrElse(() => \"failed\") // => Err(\"failed\")\n\t * ```\n\t */\n\tokOrElse<E>(err: () => E): Result<T, E> {\n\t\treturn this.#kind ? Ok(this.#val as T) : Err(err());\n\t}\n\n\tokOrElseAsync<E>(err: () => Promise<E>): AsyncResult<T, E> {\n\t\treturn new AsyncResult<T, E>(\n\t\t\tthis.#kind\n\t\t\t\t? Promise.resolve(Ok(this.#val as T))\n\t\t\t\t: (err().then(Err) as Promise<Result<T, E>>),\n\t\t);\n\t}\n\n\t/**\n\t * Returns `None` if the option is `None`, otherwise returns `other`.\n\t *\n\t * **Examples**\n\t *\n\t * ```\n\t * Some(42).and(Some(54)) // => Some(54)\n\t * Some(42).and(None) // => None\n\t * None.and(Some(54)) // => None\n\t * None.and(None) // => None\n\t * ```\n\t */\n\tand<U>(other: Option<U>): Option<U> {\n\t\treturn this.#kind ? other : None;\n\t}\n\n\t/**\n\t * Returns `None` if the option is `None`, otherwise calls `f` with the wrapped value and returns the result.\n\t *\n\t * **Examples**\n\t *\n\t * ```\n\t * Some(42).andThen(x => Some(x + 1)) // => Some(43)\n\t * Some(42).andThen(x => None) // => None\n\t * None.andThen(x => Some(x + 1)) // => None\n\t * ```\n\t */\n\tandThen<U>(f: (value: T) => Option<U>): Option<U> {\n\t\treturn this.#kind ? f(this.#val as T) : None;\n\t}\n\n\tandThenAsync<U>(f: (value: T) => Promise<Option<U>> | AsyncOption<U>): AsyncOption<U> {\n\t\treturn new AsyncOption(this.#kind ? f(this.#val as T) : Promise.resolve(None));\n\t}\n\n\t/**\n\t * Returns `None` if the option is `None`, otherwise calls `predicate` with the wrapped value and returns:\n\t * - `Some<T>` if predicate returns true, and\n\t * - `None` if predicate returns false.\n\t *\n\t * **Examples**\n\t *\n\t * ```\n\t * Some(42).filter(x => x > 40) // => Some(42)\n\t * Some(42).filter(x => x > 50) // => None\n\t * None.filter(x => x > 40) // => None\n\t * ```\n\t */\n\tfilter(predicate: (value: T) => boolean): Option<T> {\n\t\treturn (this.#kind && predicate(this.#val as T) ? this : None) as Option<T>;\n\t}\n\n\t/**\n\t * Returns the option if it contains a value, otherwise returns `other`.\n\t *\n\t * **Examples**\n\t *\n\t * ```\n\t * Some(42).or(Some(54)) // => Some(42)\n\t * Some(42).or(None) // => Some(42)\n\t * None.or(Some(54)) // => Some(54)\n\t * None.or(None) // => None\n\t * ```\n\t */\n\tor<U>(other: Option<U>): Option<T | U> {\n\t\treturn (this.#kind ? this : other) as Option<T | U>;\n\t}\n\n\t/**\n\t * Returns the option if it contains a value, otherwise calls `f` and returns the result.\n\t *\n\t * **Examples**\n\t *\n\t * ```\n\t * Some(42).orElse(() => Some(54)) // => Some(42)\n\t * Some(42).orElse(() => None) // => Some(42)\n\t * None.orElse(() => Some(54)) // => Some(54)\n\t * None.orElse(() => None) // => None\n\t * ```\n\t */\n\torElse<U>(f: () => Option<U>): Option<T | U> {\n\t\treturn (this.#kind ? this : f()) as Option<T | U>;\n\t}\n\n\torElseAsync<U>(f: () => Promise<Option<U>> | AsyncOption<U>): AsyncOption<T | U> {\n\t\treturn new AsyncOption(\n\t\t\t(this.#kind ? Promise.resolve(this as unknown as Some<T>) : f()) as Promise<\n\t\t\t\tOption<T | U>\n\t\t\t>,\n\t\t);\n\t}\n\n\t/**\n\t * Returns `Some` if exactly one of `this` and `other` is `Some`, otherwise returns `None`.\n\t *\n\t * **Examples**\n\t *\n\t * ```\n\t * Some(42).xor(Some(54)) // => None\n\t * Some(42).xor(None) // => Some(42)\n\t * None.xor(Some(54)) // => Some(54)\n\t * None.xor(None) // => None\n\t * ```\n\t */\n\txor<U>(other: Option<U>): Option<T | U> {\n\t\treturn (this.#kind ? (other.#kind ? None : this) : other) as Option<T | U>;\n\t}\n\n\t/**\n\t * Converts from `Option<Option<U>>` to `Option<U>`.\n\t *\n\t * **Examples**\n\t *\n\t * ```\n\t * Some(Some(42)).flatten() // => Some(42)\n\t * Some(None).flatten() // => None\n\t * ```\n\t */\n\tflatten<U>(this: Option<Option<U>>): Option<U> {\n\t\treturn this.#kind ? (this.#val as Option<U>) : None;\n\t}\n\n\ttoObject(): {isSome: true; value: T} | {isSome: false; value: null} {\n\t\treturn this.#kind ? {isSome: true, value: this.#val as T} : {isSome: false, value: null};\n\t}\n\n\ttoJSON(): {meta: \"Some\"; value: T} | {meta: \"None\"; value: null} {\n\t\treturn this.#kind ? {meta: \"Some\", value: this.#val as T} : {meta: \"None\", value: null};\n\t}\n\n\ttoString(): `Some(${string})` | \"None\" {\n\t\treturn this.#kind ? `Some(${String(this.#val)})` : \"None\";\n\t}\n\n\t[symbols.inspect](): ReturnType<OptionImpl<T>[\"toString\"]> {\n\t\treturn this.toString();\n\t}\n}\n\nexport interface Some<T> extends OptionImpl<T> {\n\t[symbols.tag]: \"Some\";\n\tvalue(): T;\n\tunwrap(): T;\n\texpect(message: string): T;\n}\n\n/**\n * Some value of type `T`.\n */\nexport function Some<T>(value: T): Some<T> {\n\treturn new OptionImpl(true, value) as Some<T>;\n}\n\nexport interface None<T = never> extends OptionImpl<T> {\n\t[symbols.tag]: \"None\";\n\tvalue(): undefined;\n\tunwrap(): never;\n\texpect(message: string): never;\n}\n\n/**\n * No value.\n */\nexport const None = new OptionImpl(false) as None;\n\n/**\n * `Option` represents an optional value: every `Option` is either `Some` and contains a value, or `None`, and does not.\n */\nexport type Option<T> = Some<T> | None<T>;\n\nexport function Option() {}\n\nOption.from = <T>(value: T | undefined | null): Option<T> => {\n\treturn value == null ? None : Some(value);\n};\n","import {Panic, parseError} from \"./error\";\nimport {type Option, Some, None} from \"./option\";\nimport {AsyncResult} from \"./async_result\";\nimport * as symbols from \"./symbols\";\n\nexport type ResultMatch<T, E, A, B> = {\n\tOk: (value: T) => A;\n\tErr: (error: E) => B;\n};\n\nexport type ResultMatchAsync<T, E, A, B> = {\n\tOk: (value: T) => Promise<A>;\n\tErr: (error: E) => Promise<B>;\n};\n\nexport class ResultImpl<T, E> {\n\treadonly #kind?: true;\n\treadonly #val: T | E;\n\n\tconstructor(k: boolean, v: T | E) {\n\t\tif (k) {\n\t\t\tthis.#kind = true;\n\t\t}\n\t\tthis.#val = v;\n\t}\n\n\t*[Symbol.iterator](): Iterator<Result<T, E>, T, any> {\n\t\tconst self = this as unknown as Result<T, E>;\n\t\treturn yield self;\n\t}\n\n\tprivate unwrapFailed(message: string): never {\n\t\tthrow new Panic(message, {cause: this.#val});\n\t}\n\n\t/**\n\t * Matches the result with two functions.\n\t *\n\t * **Examples**\n\t *\n\t * ```\n\t * const x: Result<number, string> = Ok(2)\n\t * assert.strictEqual(x.match({\n\t * \tOk: (v) => v * 2,\n\t * \tErr: (e) => e.length,\n\t * }), 4)\n\t *\n\t * const y: Result<number, string> = Err(\"error\")\n\t * assert.strictEqual(y.match({\n\t * \tOk: (v) => v * 2,\n\t * \tErr: (e) => e.length,\n\t * }), 5)\n\t * ```\n\t */\n\tmatch<A, B>(pattern: ResultMatch<T, E, A, B>): A | B {\n\t\treturn this.#kind ? pattern.Ok(this.#val as T) : pattern.Err(this.#val as E);\n\t}\n\n\tmatchAsync<A, B>(pattern: ResultMatchAsync<T, E, A, B>): Promise<A | B> {\n\t\treturn this.#kind ? pattern.Ok(this.#val as T) : pattern.Err(this.#val as E);\n\t}\n\n\t/**\n\t * Returns the contained value, if it exists.\n\t */\n\tvalue(): T | undefined {\n\t\treturn this.#kind ? (this.#val as T) : undefined;\n\t}\n\n\t/**\n\t * Returns the contained error, if it exists.\n\t */\n\terror(): E | undefined {\n\t\treturn this.#kind ? undefined : (this.#val as E);\n\t}\n\n\t/**\n\t * Returns `true` if the result is `Ok`.\n\t */\n\tisOk(): this is Ok<T, E> {\n\t\treturn this.#kind === true;\n\t}\n\n\t/**\n\t * Returns `true` if the result is `Ok` and the value satisfies the predicate.\n\t *\n\t * Maybe not as useful as using `result.isOk() && f(result.value)`, because it doesn't narrow the type, but it's here for completeness.\n\t */\n\tisOkAnd(f: (value: T) => boolean): this is Ok<T, E> {\n\t\treturn this.#kind === true && f(this.#val as T);\n\t}\n\n\t/**\n\t * Returns `true` if the result is `Err`.\n\t */\n\tisErr(): this is Err<E, T> {\n\t\treturn this.#kind === undefined;\n\t}\n\n\t/**\n\t * Returns `true` if the result is `Err` and the error satisfies the predicate.\n\t *\n\t * Maybe not as useful as using `result.isErr() && f(result.error)`, because it doesn't narrow the type, but it's here for completeness.\n\t */\n\tisErrAnd(f: (error: E) => boolean): this is Err<E, T> {\n\t\treturn this.#kind === undefined && f(this.#val as E);\n\t}\n\n\t/**\n\t * Converts from `Result<T, E>` to `Option<T>`.\n\t *\n\t * **Examples**\n\t *\n\t * ```\n\t * const x: Result<number, string> = Ok(2)\n\t * assert.strictDeepEqual(x.ok(), Some(2))\n\t *\n\t * const y: Result<number, string> = Err(\"Nothing here\")\n\t * assert.strictDeepEqual(y.ok(), None)\n\t * ```\n\t */\n\tok(): Option<T> {\n\t\treturn this.#kind ? Some(this.#val as T) : None;\n\t}\n\n\t/**\n\t * Converts from `Result<T, E>` to `Option<E>`.\n\t *\n\t * **Examples**\n\t *\n\t * ```\n\t * const x: Result<number, string> = Ok(2)\n\t * assert.strictDeepEqual(x.err(), None)\n\t *\n\t * const y: Result<number, string> = Err(\"Nothing here\")\n\t * assert.strictDeepEqual(y.err(), Some(\"Nothing here\"))\n\t * ```\n\t */\n\terr(): Option<E> {\n\t\treturn this.#kind ? None : Some(this.#val as E);\n\t}\n\n\t/**\n\t * Maps a `Result<T, E>` to `Result<U, E>` by applying a function to a contained `Ok` value, leaving an `Err` value untouched.\n\t *\n\t * **Examples**\n\t *\n\t * ```\n\t * const x = Ok(10)\n\t * const mapped = x.map((n) => `number ${n}`)\n\t * assert.strictEqual(mapped.unwrap(), \"number 10\")\n\t * ```\n\t */\n\tmap<U>(f: (value: T) => U): Result<U, E> {\n\t\treturn this.#kind ? Ok(f(this.#val as T)) : Err(this.#val as E);\n\t}\n\n\t/**\n\t * Maps a `Result<T, E>` to `AsyncResult<U, E>` by applying an async function to a contained `Ok` value, leaving an `Err` value untouched.\n\t *\n\t * **Examples**\n\t *\n\t * ```\n\t * const x = Ok(10)\n\t * const mapped = x.mapAsync((n) => Promise.resolve(`number ${n}`))\n\t * assert.strictEqual(await mapped.unwrap(), \"number 10\")\n\t * ```\n\t */\n\tmapAsync<U>(f: (value: T) => Promise<U>): AsyncResult<U, E> {\n\t\treturn new AsyncResult(\n\t\t\tthis.#kind\n\t\t\t\t? f(this.#val as T).then((v) => Ok(v))\n\t\t\t\t: Promise.resolve(Err(this.#val as E)),\n\t\t);\n\t}\n\n\t/**\n\t * Returns the provided default (if `Err`), or applies a function to the contained value (if `Ok`).\n\t *\n\t * **Examples**\n\t *\n\t * ```\n\t * const x: Result<string, string> = Ok(\"foo\");\n\t * assert.strictEqual(x.mapOr(42, (v) => v.length), 3);\n\t *\n\t * const y: Result<string, string> = Err(\"bar\");\n\t * assert.strictEqual(y.mapOr(42, (v) => v.length), 42);\n\t * ```\n\t */\n\tmapOr<A, B>(defaultValue: A, f: (value: T) => B): A | B {\n\t\treturn this.#kind ? f(this.#val as T) : defaultValue;\n\t}\n\n\tmapOrAsync<A, B>(defaultValue: A, f: (value: T) => Promise<B>): Promise<A | B> {\n\t\treturn this.#kind ? f(this.#val as T) : Promise.resolve(defaultValue);\n\t}\n\n\t/**\n\t * Maps a `Result<T, E>` to `A | B` by applying fallback function `defaultValue` to a contained `Err` value, or function `f` to a contained `Ok` value.\n\t *\n\t * **Examples**\n\t *\n\t * ```\n\t * const k = 21\n\t *\n\t * let x: Result<string, string> = Ok(\"foo\")\n\t * assert.strictEqual(x.mapOrElse(() => k * 2, (v) => v.length), 3)\n\t *\n\t * x = Err(\"bar\")\n\t * assert.strictEqual(x.mapOrElse(() => k * 2, (v) => v.length), 42)\n\t * ```\n\t */\n\tmapOrElse<A, B>(defaultValue: (error: E) => A, f: (value: T) => B): A | B {\n\t\treturn this.#kind ? f(this.#val as T) : defaultValue(this.#val as E);\n\t}\n\n\tmapOrElseAsync<A, B>(\n\t\tdefaultValue: (error: E) => Promise<A>,\n\t\tf: (value: T) => Promise<B>,\n\t): Promise<A | B> {\n\t\treturn this.#kind ? f(this.#val as T) : defaultValue(this.#val as E);\n\t}\n\n\t/**\n\t * Maps a `Result<T, E>` to `Result<T, F>` by applying a function to a contained `Err` value, leaving an `Ok` value untouched.\n\t *\n\t * **Examples**\n\t *\n\t * ```\n\t * const x = Err(\"error\")\n\t * const mapped = x.mapErr((s) => s.length)\n\t * assert.strictEqual(mapped.unwrapErr(), 5)\n\t * ```\n\t */\n\tmapErr<F>(f: (error: E) => F): Result<T, F> {\n\t\treturn this.#kind ? Ok(this.#val as T) : Err(f(this.#val as E));\n\t}\n\n\t/**\n\t * Maps a `Result<T, E>` to `AsyncResult<T, F>` by applying an async function to a contained `Err` value, leaving an `Ok` value untouched.\n\t *\n\t * **Examples**\n\t *\n\t * ```\n\t * const x = Err(\"error\")\n\t * const mapped = x.mapErrAsync((s) => Promise.resolve(s.length))\n\t * assert.strictEqual(await mapped.unwrapErr(), 5)\n\t * ```\n\t */\n\tmapErrAsync<F>(f: (error: E) => Promise<F>): AsyncResult<T, F> {\n\t\treturn new AsyncResult(\n\t\t\tthis.#kind\n\t\t\t\t? Promise.resolve(Ok(this.#val as T))\n\t\t\t\t: f(this.#val as E).then((v) => Err(v)),\n\t\t);\n\t}\n\n\t/**\n\t * Calls the provided function with the contained value (if `Ok`).\n\t *\n\t * **Examples**\n\t *\n\t * ```\n\t * const x = Ok(2)\n\t * x.inspect((v) => console.log(v))\n\t * ```\n\t */\n\tinspect(f: (value: T) => void): this {\n\t\tif (this.#kind) {\n\t\t\tf(this.#val as T);\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * Calls the provided async function with the contained value (if `Ok`).\n\t *\n\t * **Examples**\n\t *\n\t * ```\n\t * const x = Ok(2)\n\t * x.inspectAsync((v) => Promise.resolve(console.log(v)))\n\t * ```\n\t */\n\tinspectAsync(f: (value: T) => Promise<void>): AsyncResult<T, E> {\n\t\treturn new AsyncResult(\n\t\t\tthis.matchAsync({\n\t\t\t\tOk: (t) => f(t).then(() => Ok(t)),\n\t\t\t\tErr: (e) => Promise.resolve(Err(e)),\n\t\t\t}),\n\t\t);\n\t}\n\n\t/**\n\t * Calls the provided function with the contained error (if `Err`).\n\t *\n\t * **Examples**\n\t *\n\t * ```\n\t * const x = Err(\"error\")\n\t * x.inspectErr((e) => console.error(e))\n\t * ```\n\t */\n\tinspectErr(f: (error: E) => void): this {\n\t\tif (!this.#kind) {\n\t\t\tf(this.#val as E);\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * Calls the provided async function with the contained error (if `Err`).\n\t *\n\t * **Examples**\n\t *\n\t * ```\n\t * const x = Err(\"error\")\n\t * x.inspectErrAsync((e) => Promise.resolve(console.error(e)))\n\t * ```\n\t */\n\tinspectErrAsync(f: (error: E) => Promise<void>): AsyncResult<T, E> {\n\t\treturn new AsyncResult(\n\t\t\tthis.#kind\n\t\t\t\t? Promise.resolve(Ok(this.#val as T))\n\t\t\t\t: f(this.#val as E).then(() => Err(this.#val as E)),\n\t\t);\n\t}\n\n\t/**\n\t * Returns the contained `Ok` value.\n\t *\n\t * Throws `Panic` if the value is an `Err`, with a message containing `message` and content of the `Err` as `cause`.\n\t *\n\t * **Examples**\n\t *\n\t * ```\n\t * const x = Err(\"emergency failure\")\n\t * x.expect(\"Testing expect\") // throws Panic: Testing expect\n\t * ```\n\t */\n\texpect(message: string): T {\n\t\treturn this.#kind ? (this.#val as T) : this.unwrapFailed(message);\n\t}\n\n\t/**\n\t * Returns the contained `Ok` value.\n\t *\n\t * Throws `Panic` if the value is an `Err`, with a message containing the content of the `Err` and `this` as `cause`.\n\t *\n\t * **Examples**\n\t *\n\t * ```\n\t * const x = Err(\"emergency failure\")\n\t * x.unwrap() // throws Panic: called\n\t * ```\n\t */\n\tunwrap(): T {\n\t\treturn this.expect(`called \\`unwrap()\\` on \\`Err\\``);\n\t}\n\n\t/**\n\t * Returns the contained `Err` value.\n\t *\n\t * Throws `Panic` if the value is an `Ok`, with a message containing `message` and content of the `Ok` as `cause`.\n\t *\n\t * **Examples**\n\t *\n\t * ```\n\t * const x = Ok(2)\n\t * x.expectErr(\"Testing expectErr\") // throws Panic: Testing expectErr\n\t * ```\n\t */\n\texpectErr(message: string): E {\n\t\treturn this.#kind ? this.unwrapFailed(message) : (this.#val as E);\n\t}\n\n\t/**\n\t * Returns the contained `Err` value.\n\t *\n\t * Throws `Panic` if the value is an `Ok`, with a message containing the content of the `Ok` and `this` as `cause`.\n\t *\n\t * **Examples**\n\t *\n\t * ```\n\t * const x = Ok(2)\n\t * x.unwrapErr() // throws Panic\n\t * ```\n\t */\n\tunwrapErr(): E {\n\t\treturn this.expectErr(`called \\`unwrapErr()\\` on \\`Ok\\``);\n\t}\n\n\t/**\n\t * Returns `other` if the result is `Ok`, otherwise returns `this` (as `Err`).\n\t *\n\t * **Examples**\n\t *\n\t * ```\n\t * let x: Result<number, string> = Ok(2)\n\t * let y: Result<string, string> = Err(\"late error\")\n\t * assert.deepStrictEqual(x.and(y), Err(\"late error\"))\n\t *\n\t * x = Err(\"early error\")\n\t * y = Ok(\"foo\")\n\t * assert.deepStrictEqual(x.and(y), Err(\"early error\"))\n\t *\n\t * x = Err(\"not a 2\")\n\t * y = Err(\"late error\")\n\t * assert.deepStrictEqual(x.and(y), Err(\"not a 2\"))\n\t *\n\t * x = Ok(2)\n\t * y = Ok(\"different result type\")\n\t * assert.deepStrictEqual(x.and(y), Ok(\"different result type\"))\n\t * ```\n\t */\n\tand<U, F>(other: Result<U, F>): Result<U, E | F> {\n\t\treturn (this.#kind ? other : this) as Result<U, E | F>;\n\t}\n\n\t/**\n\t * Calls `f` if the result is `Ok`, otherwise returns `this` (as `Err`).\n\t *\n\t * **Examples**\n\t *\n\t * ```\n\t * let x: Result<number, string> = Ok(2)\n\t * assert.deepStrictEqual(x.andThen((n) => Ok(n * 2)), Ok(4))\n\t *\n\t * let y: Result<string, string> = Err(\"late error\")\n\t * assert.deepStrictEqual(y.andThen((n) => Ok(n * 2)), Err(\"late error\"))\n\t * ```\n\t */\n\tandThen<U, F>(f: (value: T) => Result<U, F>): Result<U, E | F> {\n\t\treturn (this.#kind ? f(this.#val as T) : this) as Result<U, E | F>;\n\t}\n\n\t/**\n\t * Calls `f` if the result is `Ok`, otherwise returns `this` (as `Err`).\n\t *\n\t * **Examples**\n\t *\n\t * ```\n\t * let x: Result<number, string> = Ok(2)\n\t * assert.deepStrictEqual(x.andThenAsync((n) => Promise.resolve(Ok(n * 2))), Ok(4))\n\t *\n\t * let y: Result<string, string> = Err(\"late error\")\n\t * assert.deepStrictEqual(y.andThenAsync((n) => Promise.resolve(Ok(n * 2))), Err(\"late error\"))\n\t * ```\n\t */\n\tandThenAsync<U, F>(\n\t\tf: (value: T) => AsyncResult<U, F> | Promise<Result<U, F>>,\n\t): AsyncResult<U, E | F> {\n\t\treturn new AsyncResult(\n\t\t\t(this.#kind\n\t\t\t\t? f(this.#val as T)\n\t\t\t\t: Promise.resolve(this as unknown as Err<E, T>)) as Promise<Result<U, E | F>>,\n\t\t);\n\t}\n\n\t/**\n\t * Returns `other` if the result is `Err`, otherwise returns `this` (as `Ok`).\n\t *\n\t * **Examples**\n\t *\n\t * ```\n\t * let x: Result<number, string> = Ok(2)\n\t * let y: Result<number, string> = Err(\"late error\")\n\t * assert.deepStrictEqual(x.or(y), Ok(2))\n\t * assert.deepStrictEqual(y.or(x), Ok(2))\n\t * ```\n\t */\n\tor<U, F>(other: Result<U, F>): Result<T | U, F> {\n\t\treturn (this.#kind ? this : other) as Result<T | U, F>;\n\t}\n\n\t/**\n\t * Calls `f` if the result is `Err`, otherwise returns `this` (as `Ok`).\n\t *\n\t * **Examples**\n\t *\n\t * ```\n\t * let x: Result<number, string> = Ok(2)\n\t * assert.deepStrictEqual(x.orElse((e) => Err(e + \"bar\")), Ok(2))\n\t *\n\t * let y: Result<number, string> = Err(\"foo\")\n\t * assert.deepStrictEqual(y.orElse((e) => Err(e + \"bar\")), Err(\"foobar\"))\n\t * ```\n\t */\n\torElse<U, F>(f: (error: E) => Result<U, F>): Result<T | U, F> {\n\t\treturn (this.#kind ? this : f(this.#val as E)) as Result<T | U, F>;\n\t}\n\n\t/**\n\t * Calls `f` if the result is `Err`, otherwise returns `this` (as `Ok`).\n\t *\n\t * **Examples**\n\t *\n\t * ```\n\t * let x: Result<number, string> = Ok(2)\n\t * assert.deepStrictEqual(x.orElseAsync((e) => Promise.resolve(Err(e + \"bar\"))), Ok(2))\n\t *\n\t * let y: Result<number, string> = Err(\"foo\")\n\t * assert.deepStrictEqual(y.orElseAsync((e) => Promise.resolve(Err(e + \"bar\"))), Err(\"foobar\"))\n\t * ```\n\t */\n\torElseAsync<U, F>(\n\t\tf: (error: E) => AsyncResult<U, F> | Promise<Result<U, F>>,\n\t): AsyncResult<T | U, F> {\n\t\treturn new AsyncResult(\n\t\t\t(this.#kind\n\t\t\t\t? Promise.resolve(this as unknown as Ok<T, E>)\n\t\t\t\t: f(this.#val as E)) as Promise<Result<T | U, F>>,\n\t\t);\n\t}\n\n\t/**\n\t * Returns the contained `Ok` value or a provided default.\n\t *\n\t * **Examples**\n\t *\n\t * ```\n\t * const x: Result<number, string> = Ok(2)\n\t * assert.strictEqual(x.unwrapOr(0), 2)\n\t *\n\t * const y: Result<number, string> = Err(\"error\")\n\t * assert.strictEqual(y.unwrapOr(0), 0)\n\t * ```\n\t */\n\tunwrapOr<U>(defaultValue: U): T | U {\n\t\treturn this.#kind ? (this.#val as T) : defaultValue;\n\t}\n\n\t/**\n\t * Returns the contained `Ok` value or computes it from `defaultValue`.\n\t *\n\t * **Examples**\n\t *\n\t * ```\n\t * const x: Result<number, string> = Ok(2)\n\t * assert.strictEqual(x.unwrapOrElse(() => 0), 2)\n\t *\n\t * const y: Result<number, string> = Err(\"error\")\n\t * assert.strictEqual(y.unwrapOrElse(() => 0), 0)\n\t * ```\n\t */\n\tunwrapOrElse<U>(defaultValue: (error: E) => U): T | U {\n\t\treturn this.#kind ? (this.#val as T) : defaultValue(this.#val as E);\n\t}\n\n\tunwrapOrAsync<U>(defaultValue: (error: E) => Promise<U>): Promise<T | U> {\n\t\treturn this.#kind ? Promise.resolve(this.#val as T) : defaultValue(this.#val as E);\n\t}\n\n\t/**\n\t * Converts from `Result<Result<U, F>, E>` to `Result<U, E | F>`.\n\t *\n\t * **Examples**\n\t *\n\t * ```\n\t * const x: Result<Result<number, string>, string> = Ok(Ok(2))\n\t * assert.deepStrictEqual(x.flatten(), Ok(2))\n\t *\n\t * const y: Result<Result<number, string>, string> = Ok(Err(\"late error\"))\n\t * assert.deepStrictEqual(y.flatten(), Err(\"late error\"))\n\t *\n\t * const z: Result<Result<number, string>, string> = Err(\"early error\")\n\t * assert.deepStrictEqual(z.flatten(), Err(\"early error\"))\n\t * ```\n\t */\n\tflatten<U, F>(this: Result<ResultImpl<U, F>, E>): Result<U, E | F> {\n\t\treturn this.#kind ? (this.#val as Result<U, F>) : Err(this.#val as E);\n\t}\n\n\ttoObject(): {isOk: true; value: T} | {isOk: false; error: E} {\n\t\treturn this.#kind\n\t\t\t? {isOk: true, value: this.#val as T}\n\t\t\t: {isOk: false, error: this.#val as E};\n\t}\n\n\ttoJSON(): {meta: \"Ok\"; value: T} | {meta: \"Err\"; error: E} {\n\t\treturn this.#kind\n\t\t\t? {meta: \"Ok\", value: this.#val as T}\n\t\t\t: {meta: \"Err\", error: this.#val as E};\n\t}\n\n\ttoString(): `Ok(${string})` | `Err(${string})` {\n\t\treturn this.#kind ? `Ok(${this.#val})` : `Err(${this.#val})`;\n\t}\n\n\t[symbols.inspect](): ReturnType<ResultImpl<T, E>[\"toString\"]> {\n\t\treturn this.toString();\n\t}\n}\n\nexport interface Ok<T = undefined, E = never> extends ResultImpl<T, E> {\n\t[symbols.tag]: \"Ok\";\n\tvalue(): T;\n\terror(): undefined;\n\tunwrap(): T;\n\tunwrapErr(): never;\n\texpect(message: string): T;\n\texpectErr(message: string): never;\n}\n\n/**\n * Contains the success value.\n */\nexport function Ok(): Ok;\nexport function Ok<T>(value: T): Ok<T>;\nexport function Ok<T>(value?: T): Ok<T> {\n\treturn new ResultImpl<T, never>(true, value as T) as Ok<T>;\n}\n\nexport interface Err<E = undefined, T = never> extends ResultImpl<T, E> {\n\t[symbols.tag]: \"Err\";\n\tvalue(): undefined;\n\terror(): E;\n\tunwrap(): never;\n\tunwrapErr(): E;\n\texpect(message: string): never;\n\texpectErr(message: string): E;\n}\n\n/**\n * Contains the error value.\n */\nexport function Err(): Err;\nexport function Err<E>(error: E): Err<E>;\nexport function Err<E>(error?: E): Err<E> {\n\treturn new ResultImpl<never, E>(false, error as E) as Err<E>;\n}\n\nfunction handlePanic(error: unknown) {\n\tif (error instanceof Panic) {\n\t\tthrow error;\n\t}\n\treturn error;\n}\n\nfunction handleCaughtError(error: unknown) {\n\treturn parseError(handlePanic(error));\n}\n\n/**\n * `Result` is a type that represents either success (`Ok`) or failure (`Err`).\n *\n * `Result<T, E>` is the type used for returning errors. It is a discriminated union with the variants, `Ok<T>`, representing success and containing a value, and `Err<E>`, representing error and containing an error value.\n *\n * Functions return `Result` whenever errors are expected and recoverable.\n */\nexport type Result<T, E> = Ok<T, E> | Err<E, T>;\n\nexport function Result() {}\n\n/**\n * Tries to execute a function and returns the result as a `Result`.\n *\n * **Examples**\n *\n * ```\n * // const result: Result<number, Error>\n * const result = Result.from(() => {\n *   if (Math.random() > 0.5) {\n *\t\treturn 42\n *\t  } else {\n *\t\tthrow new Error(\"random error\")\n *\t  }\n * })\n * ```\n */\nResult.from = <T>(f: () => T): Result<T, Error> => {\n\ttry {\n\t\treturn Ok(f());\n\t} catch (error) {\n\t\treturn Err(handleCaughtError(error));\n\t}\n};\n\n/**\n * Tries to resolve a promise and returns the result as a `AsyncResult`.\n *\n * **Examples**\n *\n * ```\n * // const result: AsyncResult<number, Error>\n * const result = Result.fromPromise(Promise.resolve(42))\n * ```\n */\nResult.fromPromise = <T>(promise: Promise<T>): AsyncResult<T, Error> => {\n\treturn new AsyncResult(\n\t\tpromise.then(\n\t\t\t(value) => Ok(value),\n\t\t\t(error) => Err(handleCaughtError(error)),\n\t\t),\n\t);\n};\n","import {AsyncResult} from \"./async_result\";\nimport {type Result, ResultImpl, Ok} from \"./result\";\nimport type {InferErr} from \"./util\";\n\n/**\n * Runs a generator function that returns a `Result` and infers its return type as `Result<T, E>`.\n *\n * `yield*` must be used to yield the result of a `Result`.\n *\n * **Examples**\n *\n * ```ts\n * // $ExpectType Result<number, string>\n * const result = tryFn(function* () {\n *   const a = yield* Ok(1)\n *   const random = Math.random()\n *   if (random > 0.5) {\n *     yield* Err(\"error\")\n *   }\n *   return a + random\n * })\n * ```\n */\nexport function trySync<T extends Result<any, any>, U>(\n\tfn: () => Generator<T, U, any>,\n): Result<U, InferErr<T>> {\n\tconst gen = fn();\n\tlet done = false;\n\tlet returnResult = Ok();\n\twhile (!done) {\n\t\tconst iter = gen.next(returnResult.unwrap());\n\t\tif (iter.value instanceof ResultImpl) {\n\t\t\tif (iter.value.isErr()) {\n\t\t\t\tdone = true;\n\t\t\t\tgen.return?.(iter.value as any);\n\t\t\t}\n\t\t\treturnResult = iter.value as any;\n\t\t} else {\n\t\t\tdone = true;\n\t\t\treturnResult = Ok(iter.value) as any;\n\t\t}\n\t}\n\treturn returnResult as any;\n}\n\nasync function toPromiseResult<T, E>(value: any): Promise<Result<T, E>> {\n\tconst awaited = await value;\n\tif (value instanceof ResultImpl) {\n\t\treturn awaited as any;\n\t}\n\treturn Ok(awaited);\n}\n\n/**\n * Runs an async generator function that returns a `Result` and infers its return type as `AsyncResult<T, E>`.\n *\n * `yield*` must be used to yield the result of a `AsyncResult` or `Result`.\n *\n * **Examples**\n *\n * ```ts\n * const okOne = () => new AsyncResult(Promise.resolve(Ok(1)))\n *\n * // $ExpectType AsyncResult<number, string>\n * const result = tryAsyncFn(async function* () {\n *   const a = yield* okOne()\n *   const random = Math.random()\n *   if (random > 0.5) {\n *     yield* Err(\"error\")\n *   }\n *   return a + random\n * })\n * ```\n */\nexport function tryAsync<T extends AsyncResult<any, any> | Result<any, any>, U>(\n\tfn: () => AsyncGenerator<T, U, any>,\n): AsyncResult<U, InferErr<Awaited<T>>> {\n\tconst gen = fn();\n\tconst yieldedResultChain = Promise.resolve<Result<any, any>>(Ok()).then(\n\t\tasync function fulfill(nextResult): Promise<Result<any, any>> {\n\t\t\tconst iter = await gen.next(nextResult.unwrap());\n\t\t\tconst result = await toPromiseResult(iter.value);\n\t\t\tif (iter.done) {\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\tif (result.isErr()) {\n\t\t\t\tgen.return?.(iter.value as any);\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\treturn Promise.resolve(result).then(fulfill);\n\t\t},\n\t);\n\treturn new AsyncResult(yieldedResultChain);\n}\n","import {type Result} from \"./result\";\nimport {AsyncResult} from \"./async_result\";\nimport {trySync, tryAsync} from \"./try\";\nimport type {InferErr, InferOk} from \"./util\";\n\n/**\n * Wraps a function that returns any shape of `Result<any, any>` and infers its return type as `Result<T, E>`.\n *\n * **Examples**\n *\n * ```\n * // (a: number, b: number) => Err<string> | Ok<number>\n * const divide = (a: number, b: number) => b === 0 ? Err(\"division by zero\") : Ok(a / b)\n *\n * // (a: number, b: number) => Result<number, string>\n * const wrapped = fn(divide)\n * ```\n */\nexport function fn<A extends any[], R extends Result<any, any>>(\n\tf: (...args: A) => R,\n): (...args: A) => Result<InferOk<R>, InferErr<R>> {\n\treturn f;\n}\n\n/**\n * Wraps a function that returns any shape of `Promise<Result<any, any>>` and wraps the return value in a `AsyncResult`.\n *\n * **Examples**\n *\n * ```\n * // (a: number, b: number) => Promise<Err<string> | Ok<number>>\n * const divide = async (a: number, b: number) => b === 0 ? Err(\"division by zero\") : Ok(a / b)\n *\n * // (a: number, b: number) => AsyncResult<number, string>\n * const wrapped = asyncFn(divide)\n * // now you can do this:\n * const result = await wrapped(1, 2) // => Result<number, string>\n * ```\n */\nexport function asyncFn<A extends any[], R extends AsyncResult<any, any>>(\n\tf: (...args: A) => R,\n): (...args: A) => AsyncResult<InferOk<Awaited<R>>, InferErr<Awaited<R>>>;\nexport function asyncFn<A extends any[], R extends Promise<Result<any, any>>>(\n\tf: (...args: A) => R,\n): (...args: A) => AsyncResult<InferOk<Awaited<R>>, InferErr<Awaited<R>>>;\nexport function asyncFn(f: any): any {\n\treturn function (...args: any[]) {\n\t\treturn new AsyncResult(f(...args));\n\t};\n}\n\n/**\n * Wraps a generator function that returns a `Result` and infers its return type as `Result<T, E>`.\n *\n * `yield*` must be used to yield the result of a `Result`.\n *\n * **Examples**\n *\n * ```ts\n * // $ExpectType (arg: number) => Result<number, string>\n * const fn = genFn(function* (arg: number) {\n *   const a = yield* Ok(1)\n *   if (Math.random() > 0.5) {\n *     yield* Err(\"error\")\n *   }\n *   return a + arg\n * })\n * ```\n */\nexport function gen<A extends any[], R extends Result<any, any>, T>(\n\tfn: (...args: A) => Generator<R, T, any>,\n): (...args: A) => Result<T, InferErr<R>> {\n\treturn function (...args: any[]) {\n\t\treturn trySync(() => fn(...(args as A)));\n\t};\n}\n\n/**\n * Wraps an async generator function that returns a `Result` and infers its return type as `AsyncResult<T, E>`.\n *\n * `yield*` must be used to yield the result of a `Result`.\n *\n * **Examples**\n *\n * ```ts\n * // $ExpectType (arg: number) => AsyncResult<number, string>\n * const fn = asyncGenFn(async function* (arg: number) {\n *   const a = yield* Ok(1)\n *   if (Math.random() > 0.5) {\n *    yield* Err(\"error\")\n *   }\n *   return a + arg\n * })\n * ```\n */\nexport function asyncGen<A extends any[], R extends AsyncResult<any, any> | Result<any, any>, T>(\n\tfn: (...args: A) => AsyncGenerator<R, T, any>,\n): (...args: A) => AsyncResult<T, InferErr<Awaited<R>>> {\n\treturn function (...args: any[]) {\n\t\treturn tryAsync(() => fn(...(args as A)));\n\t};\n}\n","import {ResultImpl, type Ok, type Err, type Result} from \"./result\";\nimport {OptionImpl, type Option} from \"./option\";\nimport {AsyncResult} from \"./async_result\";\nimport {AsyncOption} from \"./async_option\";\n\nexport type InferOk<T> = T extends Ok<infer O, any> ? O : never;\n\nexport type InferErr<T> = T extends Err<infer E, any> ? E : never;\n\nexport type ExtractOk<T> = T extends Ok<infer O, any>\n\t? O\n\t: T extends Result<infer O, infer _>\n\t? O\n\t: never;\n\nexport type ExtractErr<T> = T extends Err<infer E, any>\n\t? E\n\t: T extends Result<infer _, infer E>\n\t? E\n\t: never;\n\nexport function isResult<T, E>(value: unknown): value is Result<T, E> {\n\treturn value instanceof ResultImpl;\n}\n\nexport function isAsyncResult<T, E>(value: unknown): value is AsyncResult<T, E> {\n\treturn value instanceof AsyncResult;\n}\n\nexport function isOption<T>(value: unknown): value is Option<T> {\n\treturn value instanceof OptionImpl;\n}\n\nexport function isAsyncOption<T>(value: unknown): value is AsyncOption<T> {\n\treturn value instanceof AsyncOption;\n}\n"]}