/** * The `Choice` class extends `Profunctor` with combinators for working with * sum types. * * `left` and `right` lift values in a `Profunctor` to act on the `Left` and * `Right` components of a sum, respectively. * * Looking at `Choice` through the intuition of inputs and outputs * yields the following type signature: * * ```purescript * left :: forall input output a. p input output -> p (Either input a) (Either output a) * right :: forall input output a. p input output -> p (Either a input) (Either a output) * ``` * * If we specialize the profunctor `p` to the `function` arrow, we get the following type * signatures: * * ```purescript * left :: forall input output a. (input -> output) -> (Either input a) -> (Either output a) * right :: forall input output a. (input -> output) -> (Either a input) -> (Either a output) * ``` * * When the `profunctor` is `Function` application, `left` allows you to map a function over the * left side of an `Either`, and `right` maps it over the right side (same as `map` would do). * * Adapted from https://github.com/purescript/purescript-profunctor/blob/master/src/Data/Profunctor/Choice.purs * * @since 2.0.0 */ import { Either } from './Either' import { HKT2, Kind2, Kind3, URIS2, URIS3, URIS4, Kind4 } from './HKT' import { Profunctor, Profunctor2, Profunctor3, Profunctor4 } from './Profunctor' import { Category, Category2, Category3, Category4 } from './Category' /** * @category model * @since 2.0.0 */ export interface Choice extends Profunctor { readonly left: (pab: HKT2) => HKT2, Either> readonly right: (pbc: HKT2) => HKT2, Either> } /** * @category model * @since 2.0.0 */ export interface Choice2 extends Profunctor2 { readonly left: (pab: Kind2) => Kind2, Either> readonly right: (pbc: Kind2) => Kind2, Either> } /** * @category model * @since 2.0.0 */ export interface Choice3 extends Profunctor3 { readonly left: (pab: Kind3) => Kind3, Either> readonly right: (pbc: Kind3) => Kind3, Either> } /** * @category model * @since 2.0.0 */ export interface Choice4 extends Profunctor4 { readonly left: (pab: Kind4) => Kind4, Either> readonly right: (pbc: Kind4) => Kind4, Either> } /** * Compose a value acting on a sum from two values, each acting on one of * the components of the sum. * * Specializing `split` to function application would look like this: * * ```purescript * split :: forall a b c d. (a -> b) -> (c -> d) -> (Either a c) -> (Either b d) * ``` * * We take two functions, `f` and `g`, and we transform them into a single function which * takes an `Either`and maps `f` over the left side and `g` over the right side. Just like * `bimap` would do for the `Bifunctor` instance of `Either`. * * @since 2.10.0 */ export declare function split

( P: Choice4

, C: Category4

): ( pab: Kind4, pcd: Kind4 ) => Kind4, Either> export declare function split

( P: Choice3

, C: Category3

): (pab: Kind3, pcd: Kind3) => Kind3, Either> export declare function split

( P: Choice2

, C: Category2

): (pab: Kind2, pcd: Kind2) => Kind2, Either> export declare function split

( P: Choice

, C: Category

): (pab: HKT2, pcd: HKT2) => HKT2, Either> /** * Compose a value which eliminates a sum from two values, each eliminating * one side of the sum. * * This combinator is useful when assembling values from smaller components, * because it provides a way to support two different types of input. * * Specializing `fanIn` to function application would look like this: * * ```purescript * fanIn :: forall a b c d. (a -> c) -> (b -> c) -> Either a b -> c * ``` * * We take two functions, `f` and `g`, which both return the same type `c` and we transform them into a * single function which takes an `Either` value with the parameter type of `f` on the left side and * the parameter type of `g` on the right side. The function then runs either `f` or `g`, depending on * whether the `Either` value is a `Left` or a `Right`. * This allows us to bundle two different computations which both have the same result type into one * function which will run the appropriate computation based on the parameter supplied in the `Either` value. * * @since 2.10.0 */ export declare function fanIn

( P: Choice4

, C: Category4

): (pac: Kind4, pbc: Kind4) => Kind4, C> export declare function fanIn

( P: Choice3

, C: Category3

): (pac: Kind3, pbc: Kind3) => Kind3, C> export declare function fanIn

( P: Choice2

, C: Category2

): (pac: Kind2, pbc: Kind2) => Kind2, C> export declare function fanIn

( P: Choice

, C: Category

): (pac: HKT2, pbc: HKT2) => HKT2, C> /** * Use [`split`](#split) instead. * * @category zone of death * @since 2.0.0 * @deprecated */ export declare function splitChoice( F: Category3 & Choice3 ): (pab: Kind3, pcd: Kind3) => Kind3, Either> /** @deprecated */ export declare function splitChoice( F: Category2 & Choice2 ): (pab: Kind2, pcd: Kind2) => Kind2, Either> /** @deprecated */ export declare function splitChoice( F: Category & Choice ): (pab: HKT2, pcd: HKT2) => HKT2, Either> /** * Use [`fanIn`](#fanIn) instead. * * @since 2.0.0 * @deprecated */ export declare function fanin( F: Category3 & Choice3 ): (pac: Kind3, pbc: Kind3) => Kind3, C> /** @deprecated */ export declare function fanin( F: Category2 & Choice2 ): (pac: Kind2, pbc: Kind2) => Kind2, C> /** @deprecated */ export declare function fanin( F: Category & Choice ): (pac: HKT2, pbc: HKT2) => HKT2, C>