import * as tfunctor from '../../typeclass/functor';
import * as tOf from '../../typeclass/of';
import * as tTo from '../../typeclass/to';
import * as tNone from '../../typeclass/none';
import * as tApplicative from '../../typeclass/applicative';
import * as tMonad from '../../typeclass/monad';
import * as tFoldable from '../../typeclass/foldable';
import * as tFilterable from '../../typeclass/filterable';
import * as tSemiAlternative from '../../typeclass/semialternative';
import * as tAlternative from '../../typeclass/alternative';
import * as tSemiAlign from '../../typeclass/semialign';
import type { Option, TOption } from './option.types';
/**
* produce none Option of type a
*
* none :: `() -> Option`
*
* none :: `<...>() => none`
*
* @returns `Option`
*
* @example
* ```ts
* pipe(none(), map(x => x + 1)) // none
* ```
*/
export declare const none: () => Option;
/**
* produce some Option of type a
*
* some :: `a -> Option`
*
* some :: `(a: A) => Option`
*
* @param a any value
* @returns `Option`
*
* @example
* ```ts
* pipe(some(1), map(x => x + 1)) // some(2)
* ```
*/
export declare const some: (a: A) => Option;
/**
* isNone :: `Option -> boolean`
*
* isNone :: `(option: Option) => option is None`
*
* @param option `Option`
* @returns `boolean`
*
* @example
* ```ts
* pipe(some(1), isNone) // false
* pipe(none, isNone) // true
* ```
*/
export declare const isNone: (option: Option) => option is Option.None;
/**
* isSome :: `Option -> boolean`
*
* isSome :: `(option: Option) => option is Some`
*
* @param option `Option`
* @returns `boolean`
*
* @example
* ```ts
* pipe(some(1), isSome) // true
* pipe(none, isSome) // false
* ```
*/
export declare const isSome: (option: Option) => option is Option.Some;
/**
* fromNullable :: `a | null | undefined -> Option`
*
* fromNullable :: `(a: A | null | undefined) => Option`
*
* @param a `a | null | undefined`
* @returns `Option`
*
* @example
* ```ts
* pipe(1, fromNullable) // some(1)
* pipe(null, fromNullable) // none
* pipe(undefined, fromNullable) // none
* ```
*/
export declare const fromNullable: (a: A | null | undefined) => Option;
/**
* fromPredicate :: `(a -> boolean) -> a -> Option`
*
* fromPredicate :: `(predicate: (a: A) => boolean) => (a: A) => Option`
*
* @param predicate `(a -> boolean)`
* @returns `a -> Option`
*
* @example
* ```ts
* pipe(1, fromPredicate(x => x > 1)) // none
* pipe(2, fromPredicate(x => x > 1)) // some(2)
* ```
*/
export declare const fromPredicate: (predicate: (a: A) => boolean) => (a: A) => Option;
/**
* fromIterable :: `Iterable -> Option`
*
* fromIterable :: `(iterable: Iterable) => Option`
*
* @param iterable `Iterable`
* @returns `Option`
*
* @example
* ```ts
* pipe([1, 2, 3], fromIterable) // some(1)
* pipe([], fromIterable) // none
* ```
*/
export declare const fromIterable: (iterable: Iterable) => Option;
/**
* toNullable :: `Option -> a | null`
*
* toNullable :: `(option: Option) => A | null`
*
* @param option `Option`
* @returns `a | null`
*
* @example
* ```ts
* pipe(some(1), toNullable) // 1
* pipe(none, toNullable) // null
* ```
*/
export declare const toNullable: (option: Option) => A | null;
/**
* toUndefined :: `Option -> a | undefined`
*
* toUndefined :: `(option: Option) => A | undefined`
*
* @param option `Option`
* @returns `a | undefined`
*
* @example
* ```ts
* pipe(some(1), toUndefined) // 1
* pipe(none, toUndefined) // undefined
* ```
*/
export declare const toUndefined: (option: Option) => A | undefined;
export declare const None: tNone.None;
export declare const Of: tOf.Of;
export declare const To: tTo.To;
export declare const Functor: tfunctor.Functor;
export declare const SemiAlternative: tSemiAlternative.SemiAlternative;
export declare const Foldable: tFoldable.Foldable;
export declare const Filterable: tFilterable.Filterable;
export declare const Applicative: tApplicative.Applicative;
export declare const Alternative: tAlternative.Alternative;
export declare const Monad: tMonad.Monad;
export declare const SemiAlign: tSemiAlign.SemiAlign;
export declare const match: (onSome: (a: A) => B, onNone: () => C) => (fa: Option) => B | C;
/**
* of :: `a -> Option`
*
* of :: `(a: A) => Option`
*
* @param a any value
* @returns `Option`
*
* @example
* ```ts
* pipe(1, of) // some(1)
* ```
*/
export declare const of: (a: A) => Option;
/**
* getOrElse :: `() -> b -> Option -> a | b`
*
* getOrElse :: `(f: () => B) => (fa: Option) => A | B`
*
* @param f `() -> b`
* @returns `Option -> a | b`
*
* @example
* ```ts
* pipe(some(1), getOrElse(() => 0)) // 1
* pipe(none, getOrElse(() => 0)) // 0
* ```
*/
export declare const getOrElse: (f: () => A1) => (fa: Option) => A1 | A;
/**
* getOr :: `b -> Option -> a | b`
*
* getOr :: `(b: B) => (fa: Option) => A | B`
*
* @param b `b`
* @returns `Option -> a | b`
*
* @example
* ```ts
* pipe(some(1), getOr(0)) // 1
* pipe(none, getOr(0)) // 0
* ```
*/
export declare const getOr: (args_0: A1) => (args_0: Option) => A1 | B1;
/**
* orElse :: `(() -> Option) -> Option -> Option`
*
* orElse :: `(fb: () => Option) => (fa: Option) => Option`
*
* @param fb `() -> Option`
* @returns `Option -> Option`
*
* @example
* ```ts
* pipe(some(1), orElse(() => some(2))) // some(1)
* pipe(some(1), orElse(() => none)) // some(1)
* pipe(none, orElse(() => some(2))) // some(2)
* pipe(none, orElse(() => none)) // none
* ```
*/
export declare const orElse: (args_0: () => Option) => (args_0: Option) => Option;
/**
* or :: `Option -> Option -> Option`
*
* or :: `(fb: Option) => (fa: Option) => Option`
*
* @param fb `Option`
* @returns `Option -> Option`
*
* @example
* ```ts
* pipe(some(1), or(some(2))) // some(1)
* pipe(some(1), or(none)) // some(1)
* pipe(none, or(some(2))) // some(2)
* pipe(none, or(none)) // none
* ```
*/
export declare const or: (args_0: Option) => (args_0: Option) => Option;
/**
* map :: `(a -> b) -> Option -> Option`
*
* map :: `(f: (a: A) => B) => (fa: Option) => Option`
*
* @param f `a -> b`
* @returns `Option -> Option`
*
* @example
* ```ts
* pipe(some(1), map(x => x + 1)) // some(2)
* pipe(none, map(x => x + 1)) // none
* ```
*/
export declare const map: (args_0: (args_0: A1) => A2) => (args_0: Option) => Option;
/**
* flap :: `a -> Option<(a -> b)> -> Option`
*
* flap :: `(a: A) => (fab: Option<(a: A) => B>) => Option`
*
* @param a `a`
* @returns `Option<(a -> b)> -> Option`
*
* @example
* ```ts
* pipe(some(x => x + 1), flap(0)) // some(1)
* pipe(none, flap(0)) // none
* ```
*/
export declare const flap: (args_0: A1) => (args_0: Option<(args_0: A1) => B1>) => Option;
/**
* as :: `b -> Option -> Option`
*
* as :: `(b: B) => (fa: Option) => Option`
*
* @param b `b`
* @returns `Option -> Option`
*
* @example
* ```ts
* pipe(some(1), as(0)) // some(0)
* pipe(none, as(0)) // none
* ```
*/
export declare const as: (args_0: A1) => (args_0: Option) => Option;
/**
* tap :: `(a -> void) -> Option -> Option`
*
* tap :: `(f: (a: A) => void) => (fa: Option) => Option`
*
* @param f `(a -> void)`
* @returns `Option -> Option`
*
* @example
* ```ts
* pipe(some(1), tap(console.log)) // some(1)
* pipe(none, tap(console.log)) // none
* ```
*/
export declare const tap: (args_0: (args_0: A1) => void) => (args_0: Option) => Option;
/**
* doubleMap :: `(a -> b) -> Option