@hazae41/option
Version:
Rust-like Option for TypeScript
1 lines • 14.1 kB
Source Map (JSON)
{"version":3,"file":"some.mjs","sources":["../../../../src/mods/option/some.ts"],"sourcesContent":["import { Ok } from \"@hazae41/result\"\nimport { Awaitable } from \"libs/awaitable/index.js\"\nimport { None } from \"./none.js\"\nimport { Option } from \"./option.js\"\n\nexport interface SomeInit<T> {\n readonly inner: T\n}\n\nexport class Some<T> {\n\n /**\n * An existing value\n * @param inner \n */\n constructor(\n readonly inner: T\n ) { }\n\n static create<T>(inner: T): Some<T> {\n return new Some<T>(inner)\n }\n\n static from<T>(init: SomeInit<T>) {\n return new Some<T>(init.inner)\n }\n\n /**\n * Returns an iterator over the possibly contained value\n * @yields `this.inner` if `Some`\n */\n *[Symbol.iterator](): Iterator<T, void> {\n yield this.inner\n }\n\n /**\n * Type guard for `Some`\n * @returns `true` if `Some`, `false` if `None`\n */\n isSome(): this is Some<T> {\n return true\n }\n\n /**\n * Returns `true` if the option is a `Some` and the value inside of it matches a predicate\n * @param somePredicate \n * @returns `true` if `Some` and `await somePredicate(this.inner)`, `None` otherwise\n */\n async isSomeAnd(somePredicate: (inner: T) => Awaitable<boolean>): Promise<boolean> {\n return await somePredicate(this.inner)\n }\n\n /**\n * Returns `true` if the option is a `Some` and the value inside of it matches a predicate\n * @param somePredicate \n * @returns `true` if `Some` and `somePredicate(this.inner)`, `None` otherwise\n */\n isSomeAndSync(somePredicate: (inner: T) => boolean): boolean {\n return somePredicate(this.inner)\n }\n\n /**\n * Type guard for `None`\n * @returns `true` if `None`, `false` if `Some`\n */\n isNone(): false {\n return false\n }\n\n /**\n * Compile-time safely get `this.inner`\n * @returns `this.inner`\n */\n get(): T {\n return this.inner\n }\n\n /**\n * Get the inner value or throw an error\n * @returns \n */\n getOrThrow() {\n return this.inner\n }\n\n /**\n * Get the inner value or `null`\n * @returns \n */\n getOrNull(): T {\n return this.inner\n }\n\n /**\n * Get the inner value or a default one\n * @param value \n * @returns `this.inner` if `Some`, `value` if `None`\n */\n getOr(value: unknown): T {\n return this.inner\n }\n\n /**\n * Returns the contained `Some` value or computes it from a closure\n * @param noneCallback \n * @returns `this.inner` if `Some`, `await noneCallback()` if `None`\n */\n async getOrElse(noneCallback: unknown): Promise<T> {\n return this.inner\n }\n\n /**\n * Returns the contained `Some` value or computes it from a closure\n * @param noneCallback \n * @returns `this.inner` if `Some`, `noneCallback()` if `None`\n */\n getOrElseSync(noneCallback: unknown): T {\n return this.inner\n }\n\n /**\n * Transform `Option<T>` into `Result<T, NoneError>`\n * @returns `Ok(this.inner)` if `Some`, `Err(NoneError)` if `None`\n */\n ok(): Ok<T> {\n return new Ok(this.inner)\n }\n\n /**\n * Transform `Option<T>` into `Result<T, E>`\n * @param error\n * @returns `Ok(this.inner)` if `Some`, `Err(error)` if `None`\n */\n okOr(error: unknown): Ok<T> {\n return new Ok(this.inner)\n }\n\n /**\n * Transforms the `Option<T>` into a `Result<T, E>`, mapping `Some(v)` to `Ok(v)` and `None` to `Err(err())`\n * @param noneCallback \n * @returns `Ok(this.inner)` if `Some`, `Err(await noneCallback())` is `None`\n */\n async okOrElse(noneCallback: unknown): Promise<Ok<T>> {\n return new Ok(this.inner)\n }\n\n /**\n * Transforms the `Option<T>` into a `Result<T, E>`, mapping `Some(v)` to `Ok(v)` and `None` to `Err(err())`\n * @param noneCallback \n * @returns `Ok(this.inner)` if `Some`, `Err(noneCallback())` is `None`\n */\n okOrElseSync(noneCallback: unknown): Ok<T> {\n return new Ok(this.inner)\n }\n\n /**\n * Returns `None` if the option is `None`, otherwise calls `somePredicate` with the wrapped value\n * @param somePredicate \n * @returns `Some` if `Some` and `await somePredicate(this.inner)`, `None` otherwise\n */\n async filter(somePredicate: (inner: T) => Awaitable<boolean>): Promise<Option<T>> {\n if (await somePredicate(this.inner))\n return this\n else\n return new None()\n }\n\n /**\n * Returns `None` if the option is `None`, otherwise calls `somePredicate` with the wrapped value\n * @param somePredicate \n * @returns `Some` if `Some` and `somePredicate(this.inner)`, `None` otherwise\n */\n filterSync(somePredicate: (inner: T) => boolean): Option<T> {\n if (somePredicate(this.inner))\n return this\n else\n return new None()\n }\n\n /**\n * Transform `Option<Promise<T>>` into `Promise<Option<T>>`\n * @returns `Promise<Option<T>>`\n */\n async await(): Promise<Some<Awaited<T>>> {\n return new Some(await this.inner)\n }\n\n /**\n * Returns `true` if the option is a `Some` value containing the given value\n * @param value \n * @returns `true` if `Some` and `this.inner === value`, `None` otherwise\n */\n contains(value: T): boolean {\n return this.inner === value\n }\n\n /**\n * Calls the given callback with the inner value if `Ok`\n * @param someCallback \n * @returns `this`\n */\n async inspect(someCallback: (inner: T) => Awaitable<void>): Promise<this> {\n await someCallback(this.inner)\n return this\n }\n\n /**\n * Calls the given callback with the inner value if `Ok`\n * @param someCallback \n * @returns `this`\n */\n inspectSync(someCallback: (inner: T) => void): this {\n someCallback(this.inner)\n return this\n }\n\n /**\n * Maps an `Option<T>` to `Option<U>` by applying a function to a contained value (if `Some`) or returns `None` (if `None`)\n * @param someMapper \n * @returns `Some(await someMapper(this.inner))` if `Some`, `this` if `None`\n */\n async map<U>(someMapper: (inner: T) => Awaitable<U>): Promise<Some<U>> {\n return new Some<U>(await someMapper(this.inner))\n }\n\n /**\n * Maps an `Option<T>` to `Option<U>` by applying a function to a contained value (if `Some`) or returns `None` (if `None`)\n * @param someMapper \n * @returns `Some(someMapper(this.inner))` if `Some`, `this` if `None`\n */\n mapSync<U>(someMapper: (inner: T) => U): Some<U> {\n return new Some<U>(someMapper(this.inner))\n }\n\n /**\n * Returns the provided default result (if none), or applies a function to the contained value (if any)\n * @param value \n * @param someMapper \n * @returns `value` if `None`, `await someMapper(this.inner)` if `Some`\n */\n async mapOr<U>(value: U, someMapper: (inner: T) => Awaitable<U>): Promise<U> {\n return await someMapper(this.inner)\n }\n\n /**\n * Returns the provided default result (if none), or applies a function to the contained value (if any)\n * @param value \n * @param someMapper \n * @returns `value` if `None`, `someMapper(this.inner)` if `Some`\n */\n mapOrSync<U>(value: U, someMapper: (inner: T) => U): U {\n return someMapper(this.inner)\n }\n\n /**\n * Computes a default function result (if none), or applies a different function to the contained value (if any)\n * @param noneCallback \n * @param someMapper \n * @returns `await someMapper(this.inner)` if `Some`, `await noneCallback()` if `None`\n */\n async mapOrElse<U>(noneCallback: unknown, someMapper: (inner: T) => Awaitable<U>): Promise<U> {\n return await someMapper(this.inner)\n }\n\n /**\n * Computes a default function result (if none), or applies a different function to the contained value (if any)\n * @param noneCallback \n * @param someMapper \n * @returns `someMapper(this.inner)` if `Some`, `noneCallback()` if `None`\n */\n mapOrElseSync<U>(noneCallback: unknown, someMapper: (inner: T) => U): U {\n return someMapper(this.inner)\n }\n\n /**\n * Returns `None` if the option is `None`, otherwise returns `value`\n * @param value \n * @returns `None` if `None`, `value` if `Some`\n */\n and<U>(value: U): U {\n return value\n }\n\n /**\n * Returns `None` if the option is `None`, otherwise calls `someMapper` with the wrapped value and returns the result\n * @param someMapper \n * @returns `None` if `None`, `await someMapper(this.inner)` if `Some`\n */\n async andThen<U>(someMapper: (inner: T) => Awaitable<U>): Promise<U> {\n return await someMapper(this.inner)\n }\n\n /**\n * Returns `None` if the option is `None`, otherwise calls `someMapper` with the wrapped value and returns the result\n * @param someMapper \n * @returns `None` if `None`, `someMapper(this.inner)` if `Some`\n */\n andThenSync<U>(someMapper: (inner: T) => U): U {\n return someMapper(this.inner)\n }\n\n /**\n * Returns `this` if `Some`, otherwise returns `value`\n * @param value \n * @returns `this` if `Some`, `value` if `None`\n */\n or(value: unknown): this {\n return this\n }\n\n /**\n * Returns `this` if `Some`, otherwise calls `noneCallback` and returns the result\n * @param noneCallback \n * @returns `this` if `Some`, `await noneCallback()` if `None`\n */\n async orElse(noneCallback: unknown): Promise<this> {\n return this\n }\n\n /**\n * Returns `this` if `Some`, otherwise calls `noneCallback` and returns the result\n * @param noneCallback \n * @returns `this` if `Some`, `noneCallback()` if `None`\n */\n orElseSync(noneCallback: unknown): this {\n return this\n }\n\n /**\n * Returns `Some` if exactly one of the options is `Some`, otherwise returns `None`\n * @param value \n * @returns `None` if both are `Some` or both are `None`, the only `Some` otherwise\n */\n xor<U>(value: Option<U>): Option<T> {\n if (value.isSome())\n return new None()\n else\n return this\n }\n\n /**\n * Zips `this` with another `Option`\n * @param other \n * @returns `Some([this.inner, other.inner])` if both are `Some`, `None` if one of them is `None`\n */\n zip<U>(other: Option<U>): Option<[T, U]> {\n if (other.isSome())\n return new Some<[T, U]>([this.inner, other.inner])\n else\n return other\n }\n\n}"],"names":[],"mappings":"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"}