/** * ```ts * interface Separated { * readonly left: E * readonly right: A * } * ``` * * Represents a result of separating a whole into two parts. * * @since 2.10.0 */ import { pipe } from './function'; import { flap as flap_ } from './Functor'; // ------------------------------------------------------------------------------------- // constructors // ------------------------------------------------------------------------------------- /** * @category constructors * @since 2.10.0 */ export var separated = function (left, right) { return ({ left: left, right: right }); }; var _map = function (fa, f) { return pipe(fa, map(f)); }; var _mapLeft = function (fa, f) { return pipe(fa, mapLeft(f)); }; var _bimap = function (fa, g, f) { return pipe(fa, bimap(g, f)); }; /** * `map` can be used to turn functions `(a: A) => B` into functions `(fa: F) => F` whose argument and return types * use the type constructor `F` to represent some computational context. * * @category mapping * @since 2.10.0 */ export var map = function (f) { return function (fa) { return separated(left(fa), f(right(fa))); }; }; /** * Map a function over the first type argument of a bifunctor. * * @category error handling * @since 2.10.0 */ export var mapLeft = function (f) { return function (fa) { return separated(f(left(fa)), right(fa)); }; }; /** * Map a pair of functions over the two type arguments of the bifunctor. * * @category mapping * @since 2.10.0 */ export var bimap = function (f, g) { return function (fa) { return separated(f(left(fa)), g(right(fa))); }; }; /** * @category type lambdas * @since 2.10.0 */ export var URI = 'Separated'; /** * @category instances * @since 2.10.0 */ export var Bifunctor = { URI: URI, mapLeft: _mapLeft, bimap: _bimap }; /** * @category instances * @since 2.10.0 */ export var Functor = { URI: URI, map: _map }; /** * @category mapping * @since 2.10.0 */ export var flap = /*#__PURE__*/ flap_(Functor); // ------------------------------------------------------------------------------------- // utils // ------------------------------------------------------------------------------------- /** * @since 2.10.0 */ export var left = function (s) { return s.left; }; /** * @since 2.10.0 */ export var right = function (s) { return s.right; };