import { Some, None } from "@"; type Array$0 = Array; /** * ***Brief*** * A type that represents an optional value, encapsulating either a value `Some` * or the absence of a value `None`. */ export type Option = Some | None; export namespace Option { export type Async = Promise>; export type Array = Array$0>; /** * ***Brief*** * Utility class for handling tasks within `Option`. */ export type Handler = { /** * ***Brief*** * Wraps a value into an `Option`, turning `null` or `undefined` to `None`. * * ***Example*** * ```ts * let foo: string | undefined; * Option * .flag(foo) * .map(foo => { * /// ... * }); * ``` */ flag(value: T1 | null | undefined): Option; /** * ***Brief*** * Iterates through an array of `Option`, short-circuiting at the first `None`. * * ***Example*** * ```ts * let o0: Option<200n>; * let o1: Option<201n>; * let o2: Option<202n>; * let o: Option<[200n, 201n, 202n]> = Option.all([o0, o1, o2]); * ``` */ all>(...options: T1): Option>; /** * ***Brief*** * Iterates through an array of `Option`, short-circuiting at the first `Some`. * * ***Example*** * ```ts * let o0: Option<200n>; * let o1: Option<201n>; * let o2: Option<202n>; * let o: Option<200n | 201n | 202n> = Option.any([o0, o1, o2]); * ``` */ any>(...options: T1): Option[number]>; }; export const Handler: Handler = (() => { { return { flag, all, any }; } function flag(value: T1 | null | undefined): Option { if (value === null) return None; if (value === undefined) return None; return Some((value as T1)); } function all>(...options: T1): Option> { let out: Array$0 = []; let i: number = 0; while (i < options.length) { let option: Option = options.at(i)!; if (option.none()) return option as None; out.push(option.unwrap()); i ++; } return Some(out as Some.ValFromAll); } function any>(...options: T1): Option[number]> { let i: number = 0; while (i < options.length) { let option: Option = options.at(i)!; if (option.some()) return option as Some[number]>; i ++; } return None; } })(); }