/**
 * Note that some limitations exist in the type system pertaining to
 * polymorphic (generic) functions which could impact the usage of any of the
 * functions here. All of these functions will work provided monomorphic
 * (non-generic) input functions.
 *
 * @since 0.1.0
 */
import type { Applicative2 } from "fp-ts/Applicative";
import { type Endomorphism } from "fp-ts/Endomorphism";
import type { Eq } from "fp-ts/Eq";
import { type Functor2 } from "fp-ts/Functor";
import type { Monad2 } from "fp-ts/Monad";
import * as O from "fp-ts/Option";
import { type Predicate } from "fp-ts/Predicate";
import type { Refinement } from "fp-ts/Refinement";
/**
 * Typeclass machinery.
 *
 * @category 4 Minutiae
 * @since 0.15.0
 */
export declare const URI = "Function";
/**
 * Typeclass machinery.
 *
 * @category 4 Minutiae
 * @since 0.15.0
 */
export type URI = typeof URI;
declare module "fp-ts/HKT" {
    interface URItoKind2<E, A> {
        readonly [URI]: (x: E) => A;
    }
}
/**
 * Map a unary function's output. Equivalent to function composition.
 *
 * @example
 * import * as Fn from 'fp-ts-std/Function'
 * import * as Str from 'fp-ts-std/String'
 *
 * const exclaimF = Fn.map(Str.append('!'))
 * const toStrExclaim = exclaimF(Str.fromNumber)
 *
 * assert.strictEqual(toStrExclaim(123), '123!')
 *
 * @category 2 Typeclass Methods
 * @since 0.15.0
 */
export declare const map: <B, C>(f: (x: B) => C) => <A>(g: (x: A) => B) => (x: A) => C;
/**
 * Formal `Functor` instance for unary functions to be provided to
 * higher-kinded functions that require it.
 *
 * @category 1 Typeclass Instances
 * @since 0.15.0
 */
export declare const Functor: Functor2<URI>;
/**
 * Lift a value to a function from any other value. Equivalent to `constant`.
 *
 * @example
 * import * as Fn from 'fp-ts-std/Function'
 *
 * const constant = Fn.of
 * const foo = constant('foo')
 *
 * assert.strictEqual(foo('bar'), 'foo')
 *
 * @category 2 Typeclass Methods
 * @since 0.15.0
 */
export declare const of: <A>(x: A) => <B>(y: B) => A;
/**
 * Fork an input across a binary and a tertiary function, applying the output
 * of the former to the latter.
 *
 * @example
 * import * as Fn from 'fp-ts-std/Function'
 * import * as Str from 'fp-ts-std/String'
 *
 * const rev = Fn.ap(Str.reverse)(x => y => `${x} -> ${y}`)
 *
 * assert.strictEqual(rev('foo'), 'foo -> oof')
 *
 * @category 2 Typeclass Methods
 * @since 0.15.0
 */
export declare const ap: <A, B>(f: (x: A) => B) => <C>(g: (x: A) => (y: B) => C) => (x: A) => C;
/**
 * Formal `Applicative` instance for unary functions to be provided to
 * higher-kinded functions that require it.
 *
 * @category 1 Typeclass Instances
 * @since 0.15.0
 */
export declare const Applicative: Applicative2<URI>;
/**
 * Sequence actions, discarding the value of the first argument.
 *
 * @category 2 Typeclass Methods
 * @since 0.17.0
 */
export declare const apFirst: <E, B>(second: (x: E) => B) => <A>(first: (x: E) => A) => (x: E) => A;
/**
 * Sequence actions, discarding the value of the second argument.
 *
 * @category 2 Typeclass Methods
 * @since 0.17.0
 */
export declare const apSecond: <E, B>(second: (x: E) => B) => <A>(first: (x: E) => A) => (x: E) => B;
/**
 * Fork an input across a binary and a tertiary function, applying the output of
 * the former to the latter. As it applies to functions this is essentially
 * `ap` with some flips thrown in.
 *
 * @example
 * import * as Fn from 'fp-ts-std/Function'
 * import * as Str from 'fp-ts-std/String'
 *
 * const rev = Fn.chain((x: string) => (y: string) => `${y} -> ${x}`)(Str.reverse)
 *
 * assert.strictEqual(rev('foo'), 'foo -> oof')
 *
 * @category 2 Typeclass Methods
 * @since 0.15.0
 */
export declare const chain: <A, B, C>(f: (x: B) => (y: A) => C) => (g: (x: A) => B) => (x: A) => C;
/**
 * Alias of `chain`.
 *
 * @category 2 Typeclass Methods
 * @since 0.17.0
 */
export declare const flatMap: <A, B, C>(f: (x: B) => (y: A) => C) => (g: (x: A) => B) => (x: A) => C;
/**
 * Formal `Monad` instance for unary functions to be provided to higher-kinded
 * functions that require it.
 *
 * @category 1 Typeclass Instances
 * @since 0.15.0
 */
export declare const Monad: Monad2<URI>;
/**
 * Initiate do notation in the context of a unary function.
 *
 * @category 2 Typeclass Methods
 * @since 0.17.0
 */
export declare const Do: <A>(x: A) => {};
/**
 * Bind the provided value, typically preceding it in a pipeline, to the
 * specified key in do notation.
 *
 * @category 2 Typeclass Methods
 * @since 0.17.0
 */
export declare const bindTo: <N extends string>(name: N) => <E, A>(fa: (x: E) => A) => (x: E) => { readonly [K in N]: A; };
/**
 * Bind the output of the provided function to the specified key in do notation.
 *
 * @category 2 Typeclass Methods
 * @since 0.17.0
 */
export declare const bind: <N extends string, A, E, B>(name: Exclude<N, keyof A>, f: (a: A) => (x: E) => B) => (ma: (x: E) => A) => (x: E) => { readonly [K in N | keyof A]: K extends keyof A ? A[K] : B; };
/**
 * Bind the provided value to the specified key in do notation.
 *
 * @category 2 Typeclass Methods
 * @since 0.17.0
 */
export declare const apS: <N extends string, A, E, B>(name: Exclude<N, keyof A>, fb: (x: E) => B) => (fa: (x: E) => A) => (x: E) => { readonly [K in N | keyof A]: K extends keyof A ? A[K] : B; };
declare const let_: <N extends string, A, B>(name: Exclude<N, keyof A>, f: (a: A) => B) => <E>(fa: (x: E) => A) => (x: E) => { readonly [K in N | keyof A]: K extends keyof A ? A[K] : B; };
export { 
/**
 * Assign a variable in do notation.
 *
 * @category 2 Typeclass Methods
 * @since 0.17.0
 */
let_ as let, };
/**
 * Given a curried function with an iterative callback, this returns a new
 * function that behaves identically except that it also supplies an index for
 * each iteration of the callback.
 *
 * @example
 * import * as A from 'fp-ts/Array'
 * import { withIndex } from 'fp-ts-std/Function'
 *
 * const mapWithIndex = withIndex<number, number, number>(A.map)
 * assert.deepStrictEqual(mapWithIndex(i => x => x + i)([1, 2, 3]), [1, 3, 5])
 *
 * @category 3 Functions
 * @since 0.5.0
 */
export declare const withIndex: <A, B, C>(f: (g: (x: A) => B) => (ys: Array<A>) => Array<C>) => (g: (i: number) => (x: A) => B) => (ys: Array<A>) => Array<C>;
/**
 * Converts a variadic function to a unary function. Alias of `tupled`.
 *
 * Whilst this isn't very useful for functions that ought to be curried,
 * it is helpful for functions which take an indefinite number of arguments
 * instead of more appropriately an array.
 *
 * @example
 * import { unary } from 'fp-ts-std/Function'
 *
 * const max = unary(Math.max)
 *
 * assert.strictEqual(max([1, 3, 2]), 3)
 *
 * @category 3 Functions
 * @since 0.6.0
 */
export declare const unary: <A extends Array<unknown>, B>(f: (...xs: A) => B) => (xs: A) => B;
/**
 * Given an array of predicates and morphisms, returns the first morphism output
 * for which the paired predicate succeeded. If all predicates fail, the
 * fallback value is returned.
 *
 * This is analagous to Haskell's guards.
 *
 * @example
 * import { guard } from 'fp-ts-std/Function'
 * import { constant } from 'fp-ts/function'
 *
 * const numSize = guard<number, string>([
 *     [n => n > 100, n => `${n} is large!`],
 *     [n => n > 50, n => `${n} is medium.`],
 *     [n => n > 0, n => `${n} is small...`],
 * ])(n => `${n} is not a positive number.`)
 *
 * assert.strictEqual(numSize(101), '101 is large!')
 * assert.strictEqual(numSize(99), '99 is medium.')
 * assert.strictEqual(numSize(5), '5 is small...')
 * assert.strictEqual(numSize(-3), '-3 is not a positive number.')
 *
 * @category 3 Functions
 * @since 0.6.0
 */
export declare const guard: <A, B>(branches: [Predicate<A>, (x: A) => B][]) => (fallback: (x: A) => B) => (input: A) => B;
/**
 * Creates a function that processes the first morphism if the predicate
 * succeeds, else the second morphism.
 *
 * @example
 * import { ifElse } from 'fp-ts-std/Function'
 * import { increment, decrement } from 'fp-ts-std/Number'
 * import { Predicate } from 'fp-ts/Predicate'
 *
 * const isPositive: Predicate<number> = n => n > 0
 * const normalise = ifElse(decrement)(increment)(isPositive)
 *
 * assert.strictEqual(normalise(-3), -2)
 * assert.strictEqual(normalise(3), 2)
 *
 * @category 3 Functions
 * @since 0.6.0
 */
export declare const ifElse: <A, B>(onTrue: (x: A) => B) => (onFalse: (x: A) => B) => (f: Predicate<A>) => (x: A) => B;
/**
 * Runs the provided morphism on the input value if the predicate fails.
 *
 * @example
 * import { unless } from 'fp-ts-std/Function'
 * import { increment } from 'fp-ts-std/Number'
 * import { Predicate } from 'fp-ts/Predicate'
 *
 * const isEven: Predicate<number> = n => n % 2 === 0
 * const ensureEven = unless(isEven)(increment)
 *
 * assert.strictEqual(ensureEven(1), 2)
 * assert.strictEqual(ensureEven(2), 2)
 *
 * @category 3 Functions
 * @since 0.6.0
 */
export declare const unless: <A>(f: Predicate<A>) => (onFalse: Endomorphism<A>) => Endomorphism<A>;
/**
 * Runs the provided morphism on the input value if the predicate holds.
 *
 * @example
 * import { when } from 'fp-ts-std/Function'
 * import { increment } from 'fp-ts-std/Number'
 * import { Predicate } from 'fp-ts/Predicate'
 *
 * const isEven: Predicate<number> = n => n % 2 === 0
 * const ensureOdd = when(isEven)(increment)
 *
 * assert.strictEqual(ensureOdd(1), 1)
 * assert.strictEqual(ensureOdd(2), 3)
 *
 * @category 3 Functions
 * @since 0.6.0
 */
export declare const when: <A>(f: Predicate<A>) => (onTrue: Endomorphism<A>) => Endomorphism<A>;
/**
 * Yields the result of applying the morphism to the input until the predicate
 * holds.
 *
 * @example
 * import { until } from 'fp-ts-std/Function'
 * import { increment } from 'fp-ts-std/Number'
 * import { Predicate } from 'fp-ts/Predicate'
 *
 * const isOver100: Predicate<number> = n => n > 100
 * const doubleUntilOver100 = until(isOver100)(n => n * 2)
 *
 * assert.strictEqual(doubleUntilOver100(1), 128)
 *
 * @category 3 Functions
 * @since 0.6.0
 */
export declare const until: <A>(f: Predicate<A>) => (g: Endomorphism<A>) => Endomorphism<A>;
/**
 * Wraps a constructor function for functional invocation.
 *
 * @example
 * import { construct } from 'fp-ts-std/Function'
 *
 * const mkURL = construct(URL)
 *
 * const xs: [string, string] = ['/x/y/z.html', 'https://samhh.com']
 *
 * assert.deepStrictEqual(mkURL(xs), new URL(...xs))
 *
 * @category 3 Functions
 * @since 0.7.0
 */
export declare const construct: <A extends unknown[], B>(x: new (...xs: A) => B) => (xs: A) => B;
/**
 * Invoke a method of the specified name with the provided arguments on an
 * object. Helpful for a one-time usage of an object-oriented construct you're
 * working with that doesn't have functional bindings.
 *
 * To write your own bindings more conveniently, check out `invokeOn`.
 *
 * @example
 * import { invoke } from 'fp-ts-std/Function'
 *
 * const f = invoke('padStart')([8, '.'])
 *
 * assert.strictEqual(f('hello'), '...hello')
 *
 * @category 3 Functions
 * @since 0.12.0
 */
export declare const invoke: <A extends string>(x: A) => <B extends unknown[]>(ys: [...B]) => <C>(z: Record<A, (...xs: B) => C>) => C;
/**
 * `invoke` specialised to nullary methods.
 *
 * @example
 * import { invokeNullary } from 'fp-ts-std/Function'
 *
 * const f = invokeNullary('trim')
 *
 * assert.strictEqual(f(' hello '), 'hello')
 *
 * @category 3 Functions
 * @since 0.14.0
 */
export declare const invokeNullary: <A extends string>(x: A) => <B>(y: Record<A, () => B>) => B;
/**
 * Like `invoke`, but takes an initial type argument to hint at what shape the
 * arguments tuple should be. This function is useful for producing bindings for
 * object-oriented methods in tandem with the tuple*N*T range of functions.
 *
 * @example
 * import { invokeOn, curry2T } from 'fp-ts-std/Function'
 *
 * const padStart = curry2T(invokeOn<string>()('padStart'))
 * const x = 'hello'
 *
 * assert.strictEqual(padStart(8)('.')(x), x.padStart(8, '.'))
 *
 * @category 3 Functions
 * @since 0.12.0
 */
export declare const invokeOn: <A>() => <B extends { [K in keyof A]: A[K] extends (...xs: Array<any>) => unknown ? A[K] : never; }, C extends keyof B>(x: C) => (xs: Required<Parameters<B[C]>>) => (y: B) => ReturnType<B[C]>;
/**
 * Given a function and an `Eq` instance for determining input equivalence,
 * returns a new function that caches the result of applying an input to said
 * function. If the cache hits, the cached value is returned and the function
 * is not called again. Useful for expensive computations.
 *
 * Provided the input function is pure, this function is too.
 *
 * The cache is implemented as a simple `Map`. There is no mechanism by which
 * cache entries can be cleared from memory.
 *
 * @example
 * import { memoize } from 'fp-ts-std/Function'
 * import { add } from 'fp-ts-std/Number'
 * import { eqNumber } from 'fp-ts/Eq'
 *
 * let runs = 0
 * const f = memoize(eqNumber)(n => {
 *     runs++
 *     return add(5)(n)
 * })
 *
 * assert.strictEqual(runs, 0)
 * assert.strictEqual(f(2), 7)
 * assert.strictEqual(runs, 1)
 * assert.strictEqual(f(2), 7)
 * assert.strictEqual(runs, 1)
 *
 * @category 3 Functions
 * @since 0.7.0
 */
export declare const memoize: <A>(eq: Eq<A>) => <B>(f: (x: A) => B) => (x: A) => B;
/**
 * Curry a function with binary tuple input.
 *
 * @example
 * import { curry2T } from 'fp-ts-std/Function'
 * import { Endomorphism } from 'fp-ts/Endomorphism'
 *
 * const concat2 = ([a, b]: [string, string]): string =>
 *      a + b
 * assert.strictEqual(curry2T(concat2)('a')('b'), concat2(['a', 'b']))
 *
 * @category 3 Functions
 * @since 0.7.0
 */
export declare const curry2T: <A, B, C>(f: (xs: [A, B]) => C) => (a: A) => (b: B) => C;
/**
 * Curry a function with binary input.
 *
 * @example
 * import { curry2 } from 'fp-ts-std/Function'
 * import { Endomorphism } from 'fp-ts/Endomorphism'
 *
 * const concat2 = (a: string, b: string): string =>
 *      a + b
 * assert.strictEqual(curry2(concat2)('a')('b'), concat2('a', 'b'))
 *
 * @category 3 Functions
 * @since 0.7.0
 */
export declare const curry2: <A, B, C>(f: (a: A, b: B) => C) => (a: A) => (b: B) => C;
/**
 * Curry a function with ternary tuple input.
 *
 * @example
 * import { curry3T } from 'fp-ts-std/Function'
 * import { Endomorphism } from 'fp-ts/Endomorphism'
 *
 * const concat3 = ([a, b, c]: [string, string, string]): string =>
 *      a + b + c
 * assert.strictEqual(curry3T(concat3)('a')('b')('c'), concat3(['a', 'b', 'c']))
 *
 * @category 3 Functions
 * @since 0.7.0
 */
export declare const curry3T: <A, B, C, D>(f: (xs: [A, B, C]) => D) => (a: A) => (b: B) => (c: C) => D;
/**
 * Curry a function with ternary input.
 *
 * @example
 * import { curry3 } from 'fp-ts-std/Function'
 * import { Endomorphism } from 'fp-ts/Endomorphism'
 *
 * const concat3 = (a: string, b: string, c: string): string =>
 *      a + b + c
 * assert.strictEqual(curry3(concat3)('a')('b')('c'), concat3('a', 'b', 'c'))
 *
 * @category 3 Functions
 * @since 0.7.0
 */
export declare const curry3: <A, B, C, D>(f: (a: A, b: B, c: C) => D) => (a: A) => (b: B) => (c: C) => D;
/**
 * Curry a function with quaternary tuple input.
 *
 * @example
 * import { curry4T } from 'fp-ts-std/Function'
 * import { Endomorphism } from 'fp-ts/Endomorphism'
 *
 * const concat4 = ([a, b, c, d]: [string, string, string, string]): string =>
 *      a + b + c + d
 * assert.strictEqual(curry4T(concat4)('a')('b')('c')('d'), concat4(['a', 'b', 'c', 'd']))
 *
 * @category 3 Functions
 * @since 0.7.0
 */
export declare const curry4T: <A, B, C, D, E>(f: (xs: [A, B, C, D]) => E) => (a: A) => (b: B) => (c: C) => (d: D) => E;
/**
 * Curry a function with quaternary input.
 *
 * @example
 * import { curry4 } from 'fp-ts-std/Function'
 * import { Endomorphism } from 'fp-ts/Endomorphism'
 *
 * const concat4 = (a: string, b: string, c: string, d: string): string =>
 *      a + b + c + d
 * assert.strictEqual(curry4(concat4)('a')('b')('c')('d'), concat4('a', 'b', 'c', 'd'))
 *
 * @category 3 Functions
 * @since 0.7.0
 */
export declare const curry4: <A, B, C, D, E>(f: (a: A, b: B, c: C, d: D) => E) => (a: A) => (b: B) => (c: C) => (d: D) => E;
/**
 * Curry a function with quinary tuple input.
 *
 * @example
 * import { curry5T } from 'fp-ts-std/Function'
 * import { Endomorphism } from 'fp-ts/Endomorphism'
 *
 * const concat5 = ([a, b, c, d, e]: [string, string, string, string, string]): string =>
 *      a + b + c + d + e
 * assert.strictEqual(curry5T(concat5)('a')('b')('c')('d')('e'), concat5(['a', 'b', 'c', 'd', 'e']))
 *
 * @category 3 Functions
 * @since 0.7.0
 */
export declare const curry5T: <A, B, C, D, E, F>(f: (xs: [A, B, C, D, E]) => F) => (a: A) => (b: B) => (c: C) => (d: D) => (e: E) => F;
/**
 * Curry a function with quinary input.
 *
 * @example
 * import { curry5 } from 'fp-ts-std/Function'
 * import { Endomorphism } from 'fp-ts/Endomorphism'
 *
 * const concat5 = (a: string, b: string, c: string, d: string, e: string): string =>
 *      a + b + c + d + e
 * assert.strictEqual(curry5(concat5)('a')('b')('c')('d')('e'), concat5('a', 'b', 'c', 'd', 'e'))
 *
 * @category 3 Functions
 * @since 0.7.0
 */
export declare const curry5: <A, B, C, D, E, F>(f: (a: A, b: B, c: C, d: D, e: E) => F) => (a: A) => (b: B) => (c: C) => (d: D) => (e: E) => F;
/**
 * Uncurry a binary function.
 *
 * @example
 * import { uncurry2 } from 'fp-ts-std/Function'
 * import { Endomorphism } from 'fp-ts/Endomorphism'
 *
 * const concat2 = (a: string): Endomorphism<string> => b =>
 *      a + b
 * assert.strictEqual(uncurry2(concat2)(['a', 'b']), concat2('a')('b'))
 *
 * @category 3 Functions
 * @since 0.7.0
 */
export declare const uncurry2: <A, B, C>(f: (a: A) => (b: B) => C) => ([a, b]: [A, B]) => C;
/**
 * Uncurry a ternary function.
 *
 * @example
 * import { uncurry3 } from 'fp-ts-std/Function'
 * import { Endomorphism } from 'fp-ts/Endomorphism'
 *
 * const concat3 = (a: string) => (b: string): Endomorphism<string> => c =>
 *      a + b + c
 * assert.strictEqual(uncurry3(concat3)(['a', 'b', 'c']), concat3('a')('b')('c'))
 *
 * @category 3 Functions
 * @since 0.7.0
 */
export declare const uncurry3: <A, B, C, D>(f: (a: A) => (b: B) => (c: C) => D) => ([a, b, c]: [A, B, C]) => D;
/**
 * Uncurry a quaternary function.
 *
 * @example
 * import { uncurry4 } from 'fp-ts-std/Function'
 * import { Endomorphism } from 'fp-ts/Endomorphism'
 *
 * const concat4 = (a: string) => (b: string) => (c: string): Endomorphism<string> => d =>
 *      a + b + c + d
 * assert.strictEqual(uncurry4(concat4)(['a', 'b', 'c', 'd']), concat4('a')('b')('c')('d'))
 *
 * @category 3 Functions
 * @since 0.7.0
 */
export declare const uncurry4: <A, B, C, D, E>(f: (a: A) => (b: B) => (c: C) => (d: D) => E) => ([a, b, c, d]: [A, B, C, D]) => E;
/**
 * Uncurry a quinary function.
 *
 * @example
 * import { uncurry5 } from 'fp-ts-std/Function'
 * import { Endomorphism } from 'fp-ts/Endomorphism'
 *
 * const concat5 = (a: string) => (b: string) => (c: string) => (d: string): Endomorphism<string> => e =>
 *      a + b + c + d + e
 * assert.strictEqual(uncurry5(concat5)(['a', 'b', 'c', 'd', 'e']), concat5('a')('b')('c')('d')('e'))
 *
 * @category 3 Functions
 * @since 0.7.0
 */
export declare const uncurry5: <A, B, C, D, E, F>(f: (a: A) => (b: B) => (c: C) => (d: D) => (e: E) => F) => ([a, b, c, d, e]: [A, B, C, D, E]) => F;
/**
 * Fork an input across a series of functions, collecting the results in a
 * tuple. Similar to `flap` but overloaded for variadic tuples. Similar to
 * `fanout` but supporting variadic rather than binary tuples.
 *
 * @example
 * import { fork } from 'fp-ts-std/Function'
 * import { add } from 'fp-ts-std/Number'
 * import * as S from 'fp-ts-std/String'
 *
 * const add1 = add(1)
 * const add2 = add(2)
 *
 * assert.deepStrictEqual(fork([add1, S.fromNumber, add2])(0), [1, '0', 2])
 *
 * @category 3 Functions
 * @since 0.11.0
 */
export declare function fork<A, B, C>(fs: [(x: A) => B, (x: A) => C]): (x: A) => [B, C];
export declare function fork<A, B, C, D>(fs: [(x: A) => B, (x: A) => C, (x: A) => D]): (x: A) => [B, C, D];
export declare function fork<A, B, C, D, E>(fs: [(x: A) => B, (x: A) => C, (x: A) => D, (x: A) => E]): (x: A) => [B, C, D, E];
export declare function fork<A, B, C, D, E, F>(fs: [(x: A) => B, (x: A) => C, (x: A) => D, (x: A) => E, (x: A) => F]): (x: A) => [B, C, D, E, F];
export declare function fork<A, B, C, D, E, F, G>(fs: [
    (x: A) => B,
    (x: A) => C,
    (x: A) => D,
    (x: A) => E,
    (x: A) => F,
    (x: A) => G
]): (x: A) => [B, C, D, E, F, G];
export declare function fork<A, B, C, D, E, F, G, H>(fs: [
    (x: A) => B,
    (x: A) => C,
    (x: A) => D,
    (x: A) => E,
    (x: A) => F,
    (x: A) => G,
    (x: A) => H
]): (x: A) => [B, C, D, E, F, G, H];
export declare function fork<A, B, C, D, E, F, G, H, I>(fs: [
    (x: A) => B,
    (x: A) => C,
    (x: A) => D,
    (x: A) => E,
    (x: A) => F,
    (x: A) => G,
    (x: A) => H,
    (x: A) => I
]): (x: A) => [B, C, D, E, F, G, H, I];
export declare function fork<A, B, C, D, E, F, G, H, I, J>(fs: [
    (x: A) => B,
    (x: A) => C,
    (x: A) => D,
    (x: A) => E,
    (x: A) => F,
    (x: A) => G,
    (x: A) => H,
    (x: A) => I,
    (x: A) => J
]): (x: A) => [B, C, D, E, F, G, H, I, J];
/**
 * Takes a converging function and a tuple of branching functions. The branched
 * return values are collected in a tuple and passed to the converging function.
 *
 * @example
 * import { converge } from 'fp-ts-std/Function'
 * import { flow, identity } from 'fp-ts/function'
 * import * as S from 'fp-ts-std/String'
 * import * as A from 'fp-ts-std/Array'
 *
 * const f = converge(A.join(' '))([S.append('!'), identity, S.prepend('?')])
 *
 * assert.deepStrictEqual(f('hello'), 'hello! hello ?hello')
 *
 * @category 3 Functions
 * @since 0.12.0
 */
export declare const converge: <B, C extends B[], D>(f: (xs: [B, ...C]) => D) => <A>(gs: [(x: A) => B, ...{ [K in keyof C]: (x: A) => C[K]; }]) => (x: A) => D;
/**
 * A curried function equivalent to the `instanceof` operator, for when you
 * absolutely must test a prototype.
 *
 * @example
 * import { isInstanceOf } from 'fp-ts-std/Function'
 *
 * const isStringInstance = isInstanceOf(String)
 *
 * assert.strictEqual(isStringInstance('ciao'), false)
 * assert.strictEqual(isStringInstance(new String('ciao')), true)
 *
 * @category 3 Functions
 * @since 0.12.0
 */
export declare const isInstanceOf: <A>(x: new (...args: Array<any>) => A) => Refinement<unknown, A>;
/**
 * Apply an array of endomorphisms from left-to-right.
 *
 * @example
 * import { applyEvery } from 'fp-ts-std/Function'
 * import { Endomorphism } from 'fp-ts/Endomorphism'
 * import { increment, multiply } from 'fp-ts-std/Number'
 *
 * const fs: Array<Endomorphism<number>> = [increment, multiply(3)]
 * const g = applyEvery(fs)
 *
 * assert.deepStrictEqual(g(1), 6)
 * assert.deepStrictEqual(g(3), 12)
 *
 * @category 3 Functions
 * @since 0.12.0
 */
export declare const applyEvery: <A>(fs: Array<Endomorphism<A>>) => Endomorphism<A>;
/**
 * Apply an array of potential endomorphisms from left-to-right, skipping any
 * that are `None`.
 *
 * @example
 * import { applySomes } from 'fp-ts-std/Function'
 * import * as O from 'fp-ts/Option'
 * import { Option } from 'fp-ts/Option'
 * import { Endomorphism } from 'fp-ts/Endomorphism'
 * import { increment, multiply } from 'fp-ts-std/Number'
 *
 * const fs: Array<Option<Endomorphism<number>>> = [O.some(increment), O.none, O.some(multiply(3))]
 * const g = applySomes(fs)
 *
 * assert.deepStrictEqual(g(1), 6)
 * assert.deepStrictEqual(g(3), 12)
 *
 * @category 3 Functions
 * @since 0.13.0
 */
export declare const applySomes: <A>(fs: O.Option<Endomorphism<A>>[]) => Endomorphism<A>;
/**
 * Apply a function the specified number of times. `n` will be normalised to a
 * non-negative integer according to the semantics of `A.replicate`.
 *
 * @example
 * import { applyN } from 'fp-ts-std/Function'
 * import { increment } from 'fp-ts-std/Number'
 *
 * const add3 = applyN(3)(increment)
 *
 * assert.strictEqual(add3(2), 5)
 *
 * @category 3 Functions
 * @since 0.17.0
 */
export declare const applyN: (n: number) => <A>(f: Endomorphism<A>) => Endomorphism<A>;
//# sourceMappingURL=Function.d.ts.map