import { Either } from './Either';
import { Lazy } from './function';
import { Alternative1 } from './Functors/Alternative';
import { Chain1 } from './Functors/Chain';
import { Extend1 } from './Functors/Extend';
import { Monad1 } from './Functors/Monad';
import { PipeableTraverse1, Traversable1 } from './Functors/Traversable';
import { Predicate } from './Predicate';
import { Refinement } from './Refinement';
export interface None {
readonly _tag: 'None';
}
export interface Some {
readonly _tag: 'Some';
readonly value: A;
}
export declare type Maybe = None | Some;
export declare const MaybeKind: unique symbol;
export declare type MaybeKind = typeof MaybeKind;
declare module './Functors/HKT' {
interface Kinded {
readonly [MaybeKind]: Maybe;
}
}
/**
* Returns whether the maybe is `None` or not.
*
* @example
*
* ```ts
* assert.deepStrictEqual(isNone(none), true)
* assert.deepStrictEqual(isNone(some(1)), false)
* ```
*/
export declare const isNone: (ma: Maybe) => ma is None;
/**
* Returns whether the maybe is `Some` or not.
*
* @example
*
* ```ts
* assert.deepStrictEqual(isSome(some(1)), true)
* assert.deepStrictEqual(isSome(none), false)
* ```
*/
export declare const isSome: (ma: Maybe) => ma is Some;
/**
* `None` value. Represents a missing value.
*/
export declare const none: Maybe;
/**
* Constructs a `Some`. Represents an optional value that exists.
*/
export declare const some: (value: A) => Maybe;
/**
* Returns `Some` or `None` based on the given predicate.
*
* @example
*
* ```ts
* const getMaybe = fromPredicate((n: number) => n > 0)
*
* assert.deepStrictEqual(getMaybe(-1), none)
* assert.deepStrictEqual(getMaybe(1), some(1))
* ```
*/
export declare function fromPredicate(Refinement: Refinement): (a: A) => Maybe;
export declare function fromPredicate(predicate: Predicate): (b: B) => Maybe;
export declare function fromPredicate(predicate: Predicate): (a: A) => Maybe;
/**
* Transforms the `Maybe` with a given function. Returns `None` if the `Maybe` is `None`.
*/
export declare const map: (f: (a: A) => B) => (fa: Maybe) => Maybe;
/**
* Takes a value and wraps it into a `Some`.
*/
export declare const of: (value: A) => Maybe;
/**
* Returns the `Maybe` if it is `Some`, otherwise returns the function result.
*/
export declare const alt: (that: Lazy>) => (ma: Maybe) => Maybe;
/**
* Applies a `Some` function over a `Some` value. Returns `None` if the `Maybe` or the function is `None`.
*/
export declare const ap: (ma: Maybe) => (fab: Maybe<(a: A) => B>) => Maybe;
/**
* Returns `None`.
*/
export declare const empty: () => None;
/**
* Alias of `empty`.
*/
export declare const zero: () => None;
/**
* Takes a predicate function and a `Maybe`, returns the `Maybe` if it's `Some` and the predicate returns true, otherwise returns `None`.
*
* @example
*
* ```ts
* const f = flow(
* filter((n: number) => n > 0)
* )
*
* assert.deepStrictEqual(f(some(1)), some(1))
* assert.deepStrictEqual(f(some(0)), none)
* assert.deepStrictEqual(none, none)
* ```
*/
export declare const filter: (predicate: Predicate) => (ma: Maybe) => Maybe;
/**
* Returns the onNone default value if the `Maybe` is `None`, otherwise returns the onSome function result with `Maybe`.
*
* @example
*
* ```ts
* const f = flow(
* match(() => 0, (n: number) => n + 1)
* )
*
* assert.deepStrictEqual(f(some(1)), 2)
* assert.deepStrictEqual(f(none), 1)
* ```
*/
export declare const match: (onNone: Lazy, onSome: (a: A) => C) => (ma: Maybe) => B | C;
/**
* Composes computations in sequence. Useful for chaining many computations that may result in a missing value.
*
* @example
*
* ```ts
* const f = flow(
* chain((n: number) => some(n + 1)
* )
*
* assert.deepStrictEqual(f(some(1)), some(2))
* assert.deepStrictEqual(f(none), none)
* ```
*/
export declare const chain: (f: (a: A) => Maybe) => (ma: Maybe) => Maybe;
/**
* Returns none if the `Maybe` is a `None`, otherwise returns the result of the applying function and wrapped in a `Some`.
*
* @example
*
* ```ts
* assert.deepStrictEqual(pipe(some(1), extend(getOrElse(zero))), some(1))
* assert.deepStrictEqual(pipe(none, extend(getOrElse(zero))), none)
* ```
*/
export declare const extend: (f: (a: Maybe) => B) => (ma: Maybe) => Maybe;
/**
* Returns a `Right` from a `Some` or a `Left` with a default left value if `Maybe` is `None`.
*
* @example
*
* ```ts
* const f = flow(
* () => 0
* )
*
* assert.deepStrictEqual(f(some(1)), right(1))
* assert.deepStrictEqual(f(none), left(0))
* ```
*/
export declare const toEither: (f: Lazy) => (ma: Maybe) => Either;
/**
* Extracts the value out of `Maybe` if it exists, otherwise returns `null`.
*
* @example
*
* ```ts
* const f = flow(
* toNullable
* )
*
* assert.deepStrictEqual(f(some(1)), 1)
* assert.deepStrictEqual(f(none), null)
* ```
*/
export declare const toNullable: (ma: Maybe) => A | null;
/**
* Extracts the value out of `Maybe` if it exists, otherwise returns `undefined`.
*
* @example
*
* ```ts
* const f = flow(
* toUndefined
* )
*
* assert.deepStrictEqual(f(some(1)), 1)
* assert.deepStrictEqual(f(none), undefined)
* ```
*/
export declare const toUndefined: (ma: Maybe) => A | undefined;
/**
* Extracts the value of `Maybe` if it exists, otherwise returns then default onNone value.
*
* @example
*
* ```ts
* const f = flow(
* getOrElse(() => 0)
* )
*
* assert.deepStrictEqual(f(some(1)), 1)
* assert.deepStrictEqual(f(none)), 0)
* ```
*/
export declare const getOrElse: (onNone: Lazy) => (ma: Maybe) => A | B;
/**
* Returns `Maybe` if it's a `Some`, otherwise returns onNone result.
*
* @example
* const f = flow(
* orElse(() => some(1))
* )
*
* assert.deepStrictEqual(f(some(0)), some(0))
* assert.deepStrictEqual(f(none), some(1))
*/
export declare const orElse: (onNone: Lazy>) => (ma: Maybe) => Maybe;
/**
* Returns a `Maybe` from a function that might throw.
*
* @example
*
* ```ts
* const unsafeDiv = (top: number, bottom: number) => {
* if(bottom === 0) throw new Error('unsafe division')
* return top / bottom
* }
* const div = (top: number, bottom: number) =>
* tryCatch(() => unsafeDiv(top, bottom))
*
* assert.deepStrictEqual(div(2, 0), none)
* assert.deepStrictEqual(div(2, 1), some(2))
* ```
*/
export declare const tryCatch: (f: Lazy) => Maybe;
/**
* Maps each element of a `HKT` structure to an action, and collects the results wrapped in `Some`.
*
* Returns a `HKT` contains a none if the `Maybe` is a `None`.
*
* @example
*
* ```ts
* const f = traverse(Maybe.Monad)((n: number) => n > 0 ? some(n): none)
* assert.deepStrictEqual(pipe(some(1), f), some(some(1)))
* assert.deepStrictEqual(pipe(none, f), some(none))
* assert.deepStrictEqual(pipe(some(-1), f), none)
* ```
*/
export declare const traverse: PipeableTraverse1;
/**
* Takes a function and an initial value and returns the initial value if `Maybe` is `none`,
* otherwise returns the result of applying the function to the initial value and the value inside `Maybe`.
*
* @example
*
* ```ts
* assert.deepStrictEqual(pipe(some(1), reduce((acc, a) => acc + a, 1), 2)
* assert.deepStrictEqual(pipe(none, reduce((acc, a) => acc + a, 1), 1)
* ```
*/
export declare const reduce: (f: (acc: B, a: A) => B, b: B) => (ma: Maybe) => B;
/**
* Compares one `Maybe` to another `Maybe`. Returns false if maybes or the wrapped values are different.
*
* @example
*
* ```ts
* assert.deepStrictEqual(equals(some(1), some(1)), true)
* assert.deepStrictEqual(equals(some(2), some(1)), false)
* assert.deepStrictEqual(equals(some(1), none), false)
* assert.deepStrictEqual(equals(none, none), true)
* assert.deepStrictEqual(equals(none, right(1)), false)
* ```
*/
export declare const equals: (a: Maybe, b: Maybe) => boolean;
/**
* Alternative Functor
*/
export declare const Alternative: Alternative1;
/**
* Monad Functor
*/
export declare const Monad: Monad1;
/**
* Chain Functor
*/
export declare const Chain: Chain1;
/**
* Extend Functor
*/
export declare const Extend: Extend1;
/**
* Traversable Functor
*/
export declare const Traversable: Traversable1;