/**
* Various functions to aid in working with tuples.
*
* @since 0.12.0
*/
import type { Bounded } from "fp-ts/Bounded";
import { type Eq } from "fp-ts/Eq";
import type { Functor, Functor1, Functor2, Functor2C, Functor3, Functor4 } from "fp-ts/Functor";
import type { HKT, Kind, Kind2, Kind3, Kind4, URIS, URIS2, URIS3, URIS4 } from "fp-ts/HKT";
import { type Ord } from "fp-ts/Ord";
import type { Enum } from "./Enum";
/**
* Duplicate a value into a tuple.
*
* @example
* import { dup } from 'fp-ts-std/Tuple'
*
* assert.deepStrictEqual(dup('x'), ['x', 'x'])
*
* @category 3 Functions
* @since 0.12.0
*/
export declare const dup: (x: A) => [A, A];
/**
* Apply a function, collecting the output alongside the input. A dual to
* `toSnd`.
*
* @example
* import { toFst } from 'fp-ts-std/Tuple'
* import { fromNumber } from 'fp-ts-std/String'
*
* assert.deepStrictEqual(toFst(fromNumber)(5), ['5', 5])
*
* @category 3 Functions
* @since 0.12.0
*/
export declare const toFst: (f: (x: A) => B) => (x: A) => [B, A];
/**
* Apply a function, collecting the input alongside the output. A dual to
* `toFst`.
*
* @example
* import { toFst } from 'fp-ts-std/Tuple'
* import { fromNumber } from 'fp-ts-std/String'
*
* assert.deepStrictEqual(toFst(fromNumber)(5), ['5', 5])
*
* @category 3 Functions
* @since 0.12.0
*/
export declare const toSnd: (f: (x: A) => B) => (x: A) => [A, B];
/**
* Apply a functorial function, collecting the output alongside the input. A
* dual to `traverseToSnd`.
*
* @example
* import { traverseToFst } from 'fp-ts-std/Tuple'
* import * as O from 'fp-ts/Option'
* import { flow, constant } from 'fp-ts/function'
* import { fromNumber } from 'fp-ts-std/String'
*
* const traverseToFstO = traverseToFst(O.Functor)
* const fromNumberO = flow(fromNumber, O.some)
*
* assert.deepStrictEqual(traverseToFstO(fromNumberO)(5), O.some(['5', 5]))
* assert.deepStrictEqual(traverseToFstO(constant(O.none))(5), O.none)
*
* @category 2 Typeclass Methods
* @since 0.12.0
*/
export declare function traverseToFst(F: Functor4): (g: (x: A) => Kind4) => (x: A) => Kind4;
export declare function traverseToFst(F: Functor3): (g: (x: A) => Kind3) => (x: A) => Kind3;
export declare function traverseToFst(F: Functor2): (g: (x: A) => Kind2) => (x: A) => Kind2;
export declare function traverseToFst(F: Functor2C): (g: (x: A) => Kind2) => (x: A) => Kind2;
export declare function traverseToFst(F: Functor1): (g: (x: A) => Kind) => (x: A) => Kind;
export declare function traverseToFst(F: Functor): (g: (x: A) => HKT) => (x: A) => HKT;
/**
* Apply a functorial function, collecting the input alongside the output. A
* dual to `traverseToFst`.
*
* @example
* import { traverseToSnd } from 'fp-ts-std/Tuple'
* import * as O from 'fp-ts/Option'
* import { flow, constant } from 'fp-ts/function'
* import { fromNumber } from 'fp-ts-std/String'
*
* const traverseToSndO = traverseToSnd(O.Functor)
* const fromNumberO = flow(fromNumber, O.some)
*
* assert.deepStrictEqual(traverseToSndO(fromNumberO)(5), O.some([5, '5']))
* assert.deepStrictEqual(traverseToSndO(constant(O.none))(5), O.none)
*
* @category 2 Typeclass Methods
* @since 0.12.0
*/
export declare function traverseToSnd(F: Functor4): (g: (x: A) => Kind4) => (x: A) => Kind4;
export declare function traverseToSnd(F: Functor3): (g: (x: A) => Kind3) => (x: A) => Kind3;
export declare function traverseToSnd(F: Functor2): (g: (x: A) => Kind2) => (x: A) => Kind2;
export declare function traverseToSnd(F: Functor2C): (g: (x: A) => Kind2) => (x: A) => Kind2;
export declare function traverseToSnd(F: Functor1): (g: (x: A) => Kind) => (x: A) => Kind;
export declare function traverseToSnd(F: Functor): (g: (x: A) => HKT) => (x: A) => HKT;
/**
* Curried tuple construction. A dual to `withSnd`. Equivalent to Haskell's
* tuple sections.
*
* @example
* import { pipe } from 'fp-ts/function'
* import { withFst } from 'fp-ts-std/Tuple'
*
* assert.deepStrictEqual(pipe('x', withFst('y')), ['y', 'x'])
*
* @category 3 Functions
* @since 0.12.0
*/
export declare const withFst: (x: A) => (y: B) => [A, B];
/**
* Curried tuple construction. A dual to `withFst`. Equivalent to Haskell's
* tuple sections.
*
* @example
* import { pipe } from 'fp-ts/function'
* import { withSnd } from 'fp-ts-std/Tuple'
*
* assert.deepStrictEqual(pipe('x', withSnd('y')), ['x', 'y'])
*
* @category 3 Functions
* @since 0.12.0
*/
export declare const withSnd: (x: A) => (y: B) => [B, A];
/**
* Create a tuple. Helps with fighting TypeScript's type inferrence without
* having to repeat yourself or use `as const`.
*
* @example
* import { create } from 'fp-ts-std/Tuple'
*
* assert.deepStrictEqual(create(['x', 'y']), ['x', 'y'])
*
* @category 3 Functions
* @since 0.12.0
*/
export declare const create: (xs: [A, B]) => [A, B];
/**
* Apply a function to both elements of a tuple.
*
* @example
* import { pipe } from 'fp-ts/function'
* import { mapBoth } from 'fp-ts-std/Tuple'
* import { multiply } from 'fp-ts-std/Number'
*
* const xs = pipe([3, 5], mapBoth(multiply(2)))
*
* assert.deepStrictEqual(xs, [6, 10])
*
* @category 2 Typeclass Methods
* @since 0.14.0
*/
export declare const mapBoth: (f: (x: A) => B) => (xs: [A, A]) => [B, B];
/**
* Send an input to two functions and combine their outputs in a tuple. For a
* variadic version, consider `fork` in `Function`.
*
* @example
* import { fanout } from 'fp-ts-std/Tuple'
* import { add } from 'fp-ts-std/Number'
* import * as S from 'fp-ts-std/String'
*
* const add2 = add(2)
*
* assert.deepStrictEqual(fanout(S.fromNumber)(add2)(0), ['0', 2])
*
* @category 3 Functions
* @since 0.15.0
*/
export declare const fanout: (f: (x: A) => B) => (g: (x: A) => C) => (x: A) => [B, C];
/**
* Derive `Eq` for a tuple given `Eq` instances for its members.
*
* @example
* import { getEq } from 'fp-ts-std/Tuple'
* import * as Str from 'fp-ts/string'
* import * as Num from 'fp-ts/number'
*
* const Eq = getEq(Str.Eq)(Num.Eq)
*
* assert.strictEqual(Eq.equals(['foo', 123], ['foo', 123]), true)
* assert.strictEqual(Eq.equals(['foo', 123], ['bar', 123]), false)
*
* @category 1 Typeclass Instances
* @since 0.17.0
*/
export declare const getEq: (EA: Eq) => (EB: Eq) => Eq<[A, B]>;
/**
* Derive `Ord` for a tuple given `Ord` instances for its members. The first
* component is compared first.
*
* @example
* import { getOrd } from 'fp-ts-std/Tuple'
* import * as Str from 'fp-ts/string'
* import * as Num from 'fp-ts/number'
* import { LT, EQ, GT } from 'fp-ts-std/Ordering'
*
* const Ord = getOrd(Str.Ord)(Num.Ord)
*
* assert.strictEqual(Ord.compare(['foo', 123], ['foo', 123]), EQ)
* assert.strictEqual(Ord.compare(['foo', 123], ['bar', 123]), GT)
*
* @category 1 Typeclass Instances
* @since 0.17.0
*/
export declare const getOrd: (OA: Ord) => (OB: Ord) => Ord<[A, B]>;
/**
* Derive a `Bounded` instance for a tuple in which the top and bottom
* bounds are `[A.top, B.top]` and `[A.bottom, B.bottom]` respectively.
*
* @example
* import { getBounded } from 'fp-ts-std/Tuple'
* import * as Bool from 'fp-ts-std/Boolean'
*
* assert.deepStrictEqual(
* getBounded(Bool.Bounded)(Bool.Bounded).top,
* [true, true],
* )
*
* @category 1 Typeclass Instances
* @since 0.17.0
*/
export declare const getBounded: (BA: Bounded) => (BB: Bounded) => Bounded<[A, B]>;
/**
* Derive an `Enum` instance for a tuple given an `Enum` instance for each
* member.
*
* @example
* import { universe } from 'fp-ts-std/Enum'
* import { Enum as EnumBool } from 'fp-ts-std/Boolean'
* import { getEnum } from 'fp-ts-std/Tuple'
*
* const E = getEnum(EnumBool)(EnumBool)
*
* assert.deepStrictEqual(
* universe(E),
* [[false, false], [true, false], [false, true], [true, true]],
* )
*
* @category 1 Typeclass Instances
* @since 0.17.0
*/
export declare const getEnum: (EA: Enum) => (EB: Enum) => Enum<[A, B]>;
//# sourceMappingURL=Tuple.d.ts.map