fp-ts-std
Version:
The missing pseudo-standard library for fp-ts.
249 lines • 8.7 kB
TypeScript
/**
* 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: <A>(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: <A, B>(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: <A, B>(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 extends URIS4>(F: Functor4<F>): <S, R, E, A, B>(g: (x: A) => Kind4<F, S, R, E, B>) => (x: A) => Kind4<F, S, R, E, [B, A]>;
export declare function traverseToFst<F extends URIS3>(F: Functor3<F>): <R, E, A, B>(g: (x: A) => Kind3<F, R, E, B>) => (x: A) => Kind3<F, R, E, [B, A]>;
export declare function traverseToFst<F extends URIS2>(F: Functor2<F>): <E, A, B>(g: (x: A) => Kind2<F, E, B>) => (x: A) => Kind2<F, E, [B, A]>;
export declare function traverseToFst<F extends URIS2, E>(F: Functor2C<F, E>): <A, B>(g: (x: A) => Kind2<F, E, B>) => (x: A) => Kind2<F, E, [B, A]>;
export declare function traverseToFst<F extends URIS>(F: Functor1<F>): <A, B>(g: (x: A) => Kind<F, B>) => (x: A) => Kind<F, [B, A]>;
export declare function traverseToFst<F>(F: Functor<F>): <A, B>(g: (x: A) => HKT<F, B>) => (x: A) => HKT<F, [B, A]>;
/**
* 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 extends URIS4>(F: Functor4<F>): <S, R, E, A, B>(g: (x: A) => Kind4<F, S, R, E, B>) => (x: A) => Kind4<F, S, R, E, [A, B]>;
export declare function traverseToSnd<F extends URIS3>(F: Functor3<F>): <R, E, A, B>(g: (x: A) => Kind3<F, R, E, B>) => (x: A) => Kind3<F, R, E, [A, B]>;
export declare function traverseToSnd<F extends URIS2>(F: Functor2<F>): <E, A, B>(g: (x: A) => Kind2<F, E, B>) => (x: A) => Kind2<F, E, [A, B]>;
export declare function traverseToSnd<F extends URIS2, E>(F: Functor2C<F, E>): <A, B>(g: (x: A) => Kind2<F, E, B>) => (x: A) => Kind2<F, E, [A, B]>;
export declare function traverseToSnd<F extends URIS>(F: Functor1<F>): <A, B>(g: (x: A) => Kind<F, B>) => (x: A) => Kind<F, [A, B]>;
export declare function traverseToSnd<F>(F: Functor<F>): <A, B>(g: (x: A) => HKT<F, B>) => (x: A) => HKT<F, [A, B]>;
/**
* 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: <A>(x: A) => <B>(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: <A>(x: A) => <B>(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: <A, B>(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: <A, B>(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: <A, B>(f: (x: A) => B) => <C>(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: <A>(EA: Eq<A>) => <B>(EB: Eq<B>) => 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: <A>(OA: Ord<A>) => <B>(OB: Ord<B>) => 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: <A>(BA: Bounded<A>) => <B>(BB: Bounded<B>) => 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: <A>(EA: Enum<A>) => <B>(EB: Enum<B>) => Enum<[A, B]>;
//# sourceMappingURL=Tuple.d.ts.map