fp-ts
Version:
Functional programming in TypeScript
228 lines (227 loc) • 5.36 kB
JavaScript
import { flow, pipe } from './function';
import * as T from './Task';
import * as TH from './These';
/**
* @category constructors
* @since 2.4.0
*/
export var left =
/*#__PURE__*/
flow(TH.left, T.of);
/**
* @category constructors
* @since 2.4.0
*/
export var right =
/*#__PURE__*/
flow(TH.right, T.of);
/**
* @category constructors
* @since 2.4.0
*/
export var both =
/*#__PURE__*/
flow(TH.both, T.of);
/**
* @category constructors
* @since 2.4.0
*/
export var rightTask =
/*#__PURE__*/
T.map(TH.right);
/**
* @category constructors
* @since 2.4.0
*/
export var leftTask =
/*#__PURE__*/
T.map(TH.left);
/**
* @category constructors
* @since 2.4.0
*/
export var rightIO =
/*#__PURE__*/
flow(T.fromIO, rightTask);
/**
* @category constructors
* @since 2.4.0
*/
export var leftIO =
/*#__PURE__*/
flow(T.fromIO, leftTask);
/**
* @category constructors
* @since 2.4.0
*/
export var fromIOEither =
/*#__PURE__*/
T.fromIO;
// -------------------------------------------------------------------------------------
// destructors
// -------------------------------------------------------------------------------------
/**
* @category destructors
* @since 2.4.0
*/
export var fold =
/*#__PURE__*/
flow(TH.fold, T.chain);
// TODO: make lazy in v3
/* tslint:disable:readonly-array */
/**
* @category destructors
* @since 2.4.0
*/
export var toTuple =
/*#__PURE__*/
flow(TH.toTuple, T.map);
/* tslint:enable:readonly-array */
// -------------------------------------------------------------------------------------
// combinators
// -------------------------------------------------------------------------------------
/**
* @category combinators
* @since 2.4.0
*/
export var swap =
/*#__PURE__*/
T.map(TH.swap);
// -------------------------------------------------------------------------------------
// non-pipeables
// -------------------------------------------------------------------------------------
var map_ = function (fa, f) { return pipe(fa, map(f)); };
/* istanbul ignore next */
var bimap_ = function (fa, f, g) { return pipe(fa, bimap(f, g)); };
/* istanbul ignore next */
var mapLeft_ = function (fa, f) { return pipe(fa, mapLeft(f)); };
// -------------------------------------------------------------------------------------
// pipeables
// -------------------------------------------------------------------------------------
/**
* `map` can be used to turn functions `(a: A) => B` into functions `(fa: F<A>) => F<B>` whose argument and return types
* use the type constructor `F` to represent some computational context.
*
* @category Functor
* @since 2.4.0
*/
export var map = function (f) { return T.map(TH.map(f)); };
/**
* Map a pair of functions over the two type arguments of the bifunctor.
*
* @category Bifunctor
* @since 2.4.0
*/
export var bimap = function (f, g) {
return T.map(TH.bimap(f, g));
};
/**
* Map a function over the first type argument of a bifunctor.
*
* @category Bifunctor
* @since 2.4.0
*/
export var mapLeft = function (f) {
return T.map(TH.mapLeft(f));
};
/**
* Wrap a value into the type constructor.
*
* Equivalent to [`right`](#right).
*
* @category Applicative
* @since 2.7.0
*/
export var of = right;
/**
* @category MonadIO
* @since 2.7.0
*/
export var fromIO = rightIO;
/**
* @category MonadIO
* @since 2.7.0
*/
export var fromTask = rightTask;
// -------------------------------------------------------------------------------------
// instances
// -------------------------------------------------------------------------------------
/**
* @category instances
* @since 2.4.0
*/
export var URI = 'TaskThese';
/**
* @category instances
* @since 2.4.0
*/
export function getSemigroup(SE, SA) {
return T.getSemigroup(TH.getSemigroup(SE, SA));
}
/**
* @category instances
* @since 2.7.0
*/
export function getApplicative(A, SE) {
var AV = TH.getApplicative(SE);
var ap = function (fga) { return function (fgab) {
return A.ap(A.map(fgab, function (h) { return function (ga) { return AV.ap(h, ga); }; }), fga);
}; };
return {
URI: URI,
_E: undefined,
map: map_,
ap: function (fab, fa) { return pipe(fab, ap(fa)); },
of: of
};
}
// TODO: remove in v3 in favour of a non-constrained Monad / MonadTask instance
/**
* @category instances
* @since 2.4.0
*/
export function getMonad(SE) {
var A = getApplicative(T.ApplicativePar, SE);
return {
URI: URI,
_E: undefined,
map: map_,
ap: A.ap,
of: of,
chain: function (ma, f) {
return pipe(ma, T.chain(TH.fold(left, f, function (e1, a) {
return pipe(f(a), T.map(TH.fold(function (e2) { return TH.left(SE.concat(e1, e2)); }, function (b) { return TH.both(e1, b); }, function (e2, b) { return TH.both(SE.concat(e1, e2), b); })));
})));
},
fromIO: fromIO,
fromTask: fromTask
};
}
/**
* @category instances
* @since 2.7.0
*/
export var functorTaskThese = {
URI: URI,
map: map_
};
/**
* @category instances
* @since 2.7.0
*/
export var bifunctorTaskThese = {
URI: URI,
bimap: bimap_,
mapLeft: mapLeft_
};
// TODO: remove in v3
/**
* @category instances
* @since 2.4.0
*/
export var taskThese = {
URI: URI,
map: map_,
bimap: bimap_,
mapLeft: mapLeft_
};