/**
* The Predicate type represents unary functions that return boolean values.
* Typically, these functions indicate the existence of some quality for the
* values passed as inputs. Some simple examples of Predicates are postive for
* numbers, non-null values, etc.
*
* @module Predicate
* @since 2.0.0
*/
import "./_dnt.polyfills.js";
import type { In, Kind } from "./kind.js";
import type { Combinable } from "./combinable.js";
import type { Initializable } from "./initializable.js";
/**
* The Predicate type is a function that takes some
* value of type A and returns boolean, indicating
* that a property is true or false for the value A.
*
* @example
* ```ts
* import type { Predicate } from "./predicate.ts";
* import * as O from "./option.ts";
*
* function fromPredicate(predicate: Predicate) {
* return (a: A): O.Option => predicate(a)
* ? O.some(a) : O.none;
* }
*
* function isPositive(n: number): boolean {
* return n > 0;
* }
*
* const isPos = fromPredicate(isPositive);
*
* const resultSome = isPos(1); // Some(1)
* const resultNone = isPos(-1); // None
* ```
*
* @since 2.0.0
*/
export type Predicate = (a: A) => boolean;
/**
* Specifies Predicate as a Higher Kinded Type, with
* contravariant parameter A corresponding to the 0th
* index of any Substitutions.
*
* @since 2.0.0
*/
export interface KindPredicate extends Kind {
readonly kind: Predicate>;
}
/**
* Create a Predicate using a Predicate and a function that takes
* a type L and returns a type D. This maps over the input value of
* the predicate.
*
* @example
* ```ts
* import { premap } from "./predicate.ts";
* import { pipe } from "./fn.ts";
*
* const isGreaterThan3 = (n: number) => n > 3;
* const isLongerThan3 = pipe(
* isGreaterThan3,
* premap((s: string) => s.length),
* );
*
* const result1 = isLongerThan3("Hello"); // true
* const result2 = isLongerThan3("Hi"); // false
* ```
*
* @since 2.0.0
*/
export declare function premap(fia: (i: I) => A): (ua: Predicate) => Predicate;
/**
* Negates the result of an existing Predicate.
*
* @example
* ```ts
* import { not } from "./predicate.ts";
*
* const isPositive = (n: number) => n > 0;
* const isZeroOrNegative = not(isPositive);
*
* const result1 = isZeroOrNegative(1); // false
* const result2 = isZeroOrNegative(0); // true
* const result3 = isZeroOrNegative(-1); // true
* ```
*
* @since 2.0.0
*/
export declare function not(predicate: Predicate): Predicate;
/**
* Creates the union of two predicates, returning true if either
* predicate returns true.
*
* @example
* ```ts
* import { or } from "./predicate.ts";
* import { string, number } from "./refinement.ts";
* import { pipe } from "./fn.ts";
*
* // A Refinement is also a Predicate
* const stringOrNumber = pipe(
* string,
* or(number),
* );
*
* const result1 = stringOrNumber("Hello"); // true
* const result2 = stringOrNumber(1); // true
* const result3 = stringOrNumber({}); // false
* ```
*
* @since 2.0.0
*/
export declare function or(second: Predicate): (first: Predicate) => Predicate;
/**
* Creates the intersection of two predicates, returning true if both
* predicates return true.
*
* @example
* ```ts
* import { and } from "./predicate.ts";
* import { pipe } from "./fn.ts";
*
* const isPositive = (n: number) => n > 0;
* const isInteger = (n: number) => Number.isInteger(n);
*
* const isPositiveInteger = pipe(
* isPositive,
* and(isInteger),
* );
*
* const result1 = isPositiveInteger(1); // true
* const result2 = isPositiveInteger(100); // true
* const result3 = isPositiveInteger(-1); // false
* ```
*
* @since 2.0.0
*/
export declare function and(second: Predicate): (first: Predicate) => Predicate;
/**
* @since 2.0.0
*/
export declare function getCombinableAny(): Combinable>;
/**
* @since 2.0.0
*/
export declare function getCombinableAll(): Combinable>;
/**
* Get a Initializable> for any type A that combines using the
* Predicate or function.
*
* @example
* ```ts
* import { getInitializableAny } from "./predicate.ts";
* import { pipe } from "./fn.ts";
*
* const { combine } = getInitializableAny();
*
* const lessThanZero = (n: number) => n < 0;
* const greaterThanFifty = (n: number) => n > 50;
*
* const notBetweenZeroAndFifty = pipe(
* lessThanZero,
* combine(greaterThanFifty),
* );
*
* const result1 = notBetweenZeroAndFifty(10); // false
* const result2 = notBetweenZeroAndFifty(-10); // true
* const result3 = notBetweenZeroAndFifty(100); // true
* ```
*
* @since 2.0.0
*/
export declare function getInitializableAny(): Initializable>;
/**
* Get a Initializable> for any type A that combines using the
* Predicate and function.
*
* @example
* ```ts
* import { getInitializableAll } from "./predicate.ts";
* import { pipe } from "./fn.ts";
*
* const { combine } = getInitializableAll();
*
* const greaterThanZero = (n: number) => n > 0;
* const lessThanFifty = (n: number) => n < 50;
*
* const betweenZeroAndFifty = pipe(
* greaterThanZero,
* combine(lessThanFifty)
* );
*
* const result1 = betweenZeroAndFifty(10); // true
* const result2 = betweenZeroAndFifty(-10); // false
* const result3 = betweenZeroAndFifty(100); // false
* ```
*
* @since 2.0.0
*/
export declare function getInitializableAll(): Initializable>;