import type { Option } from "."; import type { Args, Fn, GenericFn, GenericResolver } from "../HKT"; import type { AssertBool, IsNever, Lazied, Lazied$Get } from "../helpers"; /** * A type that represents a value that exists (compared to {@link None}). */ export interface Some { readonly _tag: "Some"; readonly value: T; } /** * {@link Lazied} version of {@link Some}. */ export interface SomeL extends Some> {} /** * A type that represents a value that does not exist (compared to {@link Some}). */ export interface None { readonly _tag: "None"; } /** * Wrap a value in a {@link Some}. * * Sig: `(value: T) => Some` */ export type OfSome = Some; interface OfSomeFnResolver extends GenericResolver<[unknown], Some> { on1: ([x]: Args) => [[], Some]; } /** * [Fn] Wrap a value in a {@link Some}. * * Sig: `(value: T) => Some` */ export interface OfSomeFn extends GenericFn { def: ([o]: Args) => OfSome; } /** * Check if an {@link Option} is {@link Some}. * * Sig: `(o: Option) => boolean` */ export type IsSome> = AssertBool< IsNever extends true ? never : O["_tag"] extends "Some" ? true : O["_tag"] extends "None" ? false : boolean >; /** * [Fn] Check if an {@link Option} is {@link Some}. * * Sig: `(o: Option) => boolean` */ export interface IsSomeFn extends Fn<[Option], boolean> { def: ([o]: Args) => IsSome; } /** * Check if an {@link Option} is {@link None}. * * Sig: `(o: Option) => boolean` */ export type IsNone> = AssertBool< IsNever extends true ? never : O["_tag"] extends "None" ? true : O["_tag"] extends "Some" ? false : boolean >; /** * [Fn] Check if an {@link Option} is {@link None}. * * Sig: `(o: Option) => boolean` */ export interface IsNoneFn extends Fn<[Option], boolean> { def: ([o]: Args) => IsNone; }