import * as Tp from "../Collections/Immutable/Tuple/index.js";
import type { Either } from "../Either/core.js";
import type { Lazy, Predicate, Refinement } from "../Function/core.js";
import * as St from "../Structural/index.js";
import type { HasUnify } from "../Utils/index.js";
/**
* Definitions
*/
export declare class None implements HasUnify {
readonly _tag = "None";
[St.equalsSym](that: unknown): boolean;
get [St.hashSym](): number;
}
export declare class Some implements HasUnify {
readonly value: A;
readonly _tag = "Some";
constructor(value: A);
[St.equalsSym](that: unknown): boolean;
get [St.hashSym](): number;
}
export declare type Option = None | Some;
/**
* Constructs none
*/
export declare const none: Option;
/**
* Constructs none
*/
export declare function emptyOf(): Option;
/**
* Constructs Some(A)
*/
export declare function some(a: A): Option;
/**
* Classic applicative
*/
export declare function ap_(fab: Option<(a: A) => B>, fa: Option): Option;
/**
* Classic applicative
*
* @ets_data_first ap_
*/
export declare function ap(fa: Option): (fab: Option<(a: A) => B>) => Option;
/**
* Zips `Option[A]` and `Option[B]` into `Option[(A, B)]`
*/
export declare function zip_(fa: Option, fb: Option): Option>;
/**
* Zips `Option[A]` and `Option[B]` into `Option[(A, B)]`
*
* @ets_data_first zip_
*/
export declare function zip(fb: Option): (fa: Option) => Option>;
/**
* Apply both and return first
*
* @ets_data_first zipFirst_
*/
export declare function zipFirst(fb: Option): (fa: Option) => Option;
/**
* Apply both and return first
*/
export declare function zipFirst_(fa: Option, fb: Option): Option;
/**
* Apply both and return second
*
* @ets_data_first zipSecond_
*/
export declare function zipSecond(fb: Option): (fa: Option) => Option;
/**
* Apply both and return second
*/
export declare function zipSecond_(fa: Option, fb: Option): Option;
/**
* Builds a new option constructed using the value of self
*/
export declare function chain_(self: Option, f: (a: A) => Option): Option;
/**
* Builds a new option constructed using the value of self
*
* @ets_data_first chain_
*/
export declare function chain(f: (a: A) => Option): (self: Option) => Option;
/**
* Like chain but ignores the constructed outout
*
* @ets_data_first tap_
*/
export declare function tap(f: (a: A) => Option): (ma: Option) => Option;
/**
* Like chain but ignores the constructed outout
*/
export declare function tap_(ma: Option, f: (a: A) => Option): Option;
/**
* Flattens nested options
*/
export declare function flatten(fa: Option