|
- import { getApplicativeMonoid } from './Applicative';
- import { apFirst as apFirst_, apS as apS_, apSecond as apSecond_, getApplySemigroup as getApplySemigroup_ } from './Apply';
- import { bind as bind_, chainFirst as chainFirst_ } from './Chain';
- import { chainEitherK as chainEitherK_, fromEitherK as fromEitherK_, chainFirstEitherK as chainFirstEitherK_ } from './FromEither';
- import { constNull, constUndefined, flow, identity, pipe } from './function';
- import { let as let__, bindTo as bindTo_, flap as flap_ } from './Functor';
- import * as _ from './internal';
- import { not } from './Predicate';
- import { first, last } from './Semigroup';
- import { separated } from './Separated';
- import { wiltDefault, witherDefault } from './Witherable';
- import { guard as guard_ } from './Zero';
- // -------------------------------------------------------------------------------------
- // constructors
- // -------------------------------------------------------------------------------------
- /**
- * `None` doesn't have a constructor, instead you can use it directly as a value. Represents a missing value.
- *
- * @category constructors
- * @since 2.0.0
- */
- export var none = _.none;
- /**
- * Constructs a `Some`. Represents an optional value that exists.
- *
- * @category constructors
- * @since 2.0.0
- */
- export var some = _.some;
- export function fromPredicate(predicate) {
- return function (a) { return (predicate(a) ? some(a) : none); };
- }
- /**
- * Returns the `Left` value of an `Either` if possible.
- *
- * @example
- * import { getLeft, none, some } from 'fp-ts/Option'
- * import { right, left } from 'fp-ts/Either'
- *
- * assert.deepStrictEqual(getLeft(right(1)), none)
- * assert.deepStrictEqual(getLeft(left('a')), some('a'))
- *
- * @category constructors
- * @since 2.0.0
- */
- export var getLeft = function (ma) { return (ma._tag === 'Right' ? none : some(ma.left)); };
- /**
- * Returns the `Right` value of an `Either` if possible.
- *
- * @example
- * import { getRight, none, some } from 'fp-ts/Option'
- * import { right, left } from 'fp-ts/Either'
- *
- * assert.deepStrictEqual(getRight(right(1)), some(1))
- * assert.deepStrictEqual(getRight(left('a')), none)
- *
- * @category constructors
- * @since 2.0.0
- */
- export var getRight = function (ma) { return (ma._tag === 'Left' ? none : some(ma.right)); };
- var _map = function (fa, f) { return pipe(fa, map(f)); };
- var _ap = function (fab, fa) { return pipe(fab, ap(fa)); };
- var _chain = function (ma, f) { return pipe(ma, chain(f)); };
- var _reduce = function (fa, b, f) { return pipe(fa, reduce(b, f)); };
- var _foldMap = function (M) {
- var foldMapM = foldMap(M);
- return function (fa, f) { return pipe(fa, foldMapM(f)); };
- };
- var _reduceRight = function (fa, b, f) { return pipe(fa, reduceRight(b, f)); };
- var _traverse = function (F) {
- var traverseF = traverse(F);
- return function (ta, f) { return pipe(ta, traverseF(f)); };
- };
- /* istanbul ignore next */
- var _alt = function (fa, that) { return pipe(fa, alt(that)); };
- var _filter = function (fa, predicate) { return pipe(fa, filter(predicate)); };
- /* istanbul ignore next */
- var _filterMap = function (fa, f) { return pipe(fa, filterMap(f)); };
- /* istanbul ignore next */
- var _extend = function (wa, f) { return pipe(wa, extend(f)); };
- /* istanbul ignore next */
- var _partition = function (fa, predicate) {
- return pipe(fa, partition(predicate));
- };
- /* istanbul ignore next */
- var _partitionMap = function (fa, f) { return pipe(fa, partitionMap(f)); };
- /**
- * @category type lambdas
- * @since 2.0.0
- */
- export var URI = 'Option';
- /**
- * @category instances
- * @since 2.0.0
- */
- export var getShow = function (S) { return ({
- show: function (ma) { return (isNone(ma) ? 'none' : "some(".concat(S.show(ma.value), ")")); }
- }); };
- /**
- * @example
- * import { none, some, getEq } from 'fp-ts/Option'
- * import * as N from 'fp-ts/number'
- *
- * const E = getEq(N.Eq)
- * assert.strictEqual(E.equals(none, none), true)
- * assert.strictEqual(E.equals(none, some(1)), false)
- * assert.strictEqual(E.equals(some(1), none), false)
- * assert.strictEqual(E.equals(some(1), some(2)), false)
- * assert.strictEqual(E.equals(some(1), some(1)), true)
- *
- * @category instances
- * @since 2.0.0
- */
- export var getEq = function (E) { return ({
- equals: function (x, y) { return x === y || (isNone(x) ? isNone(y) : isNone(y) ? false : E.equals(x.value, y.value)); }
- }); };
- /**
- * The `Ord` instance allows `Option` values to be compared with
- * `compare`, whenever there is an `Ord` instance for
- * the type the `Option` contains.
- *
- * `None` is considered to be less than any `Some` value.
- *
- *
- * @example
- * import { none, some, getOrd } from 'fp-ts/Option'
- * import * as N from 'fp-ts/number'
- *
- * const O = getOrd(N.Ord)
- * assert.strictEqual(O.compare(none, none), 0)
- * assert.strictEqual(O.compare(none, some(1)), -1)
- * assert.strictEqual(O.compare(some(1), none), 1)
- * assert.strictEqual(O.compare(some(1), some(2)), -1)
- * assert.strictEqual(O.compare(some(1), some(1)), 0)
- *
- * @category instances
- * @since 2.0.0
- */
- export var getOrd = function (O) { return ({
- equals: getEq(O).equals,
- compare: function (x, y) { return (x === y ? 0 : isSome(x) ? (isSome(y) ? O.compare(x.value, y.value) : 1) : -1); }
- }); };
- /**
- * Monoid returning the left-most non-`None` value. If both operands are `Some`s then the inner values are
- * concatenated using the provided `Semigroup`
- *
- * | x | y | concat(x, y) |
- * | ------- | ------- | ------------------ |
- * | none | none | none |
- * | some(a) | none | some(a) |
- * | none | some(b) | some(b) |
- * | some(a) | some(b) | some(concat(a, b)) |
- *
- * @example
- * import { getMonoid, some, none } from 'fp-ts/Option'
- * import { SemigroupSum } from 'fp-ts/number'
- *
- * const M = getMonoid(SemigroupSum)
- * assert.deepStrictEqual(M.concat(none, none), none)
- * assert.deepStrictEqual(M.concat(some(1), none), some(1))
- * assert.deepStrictEqual(M.concat(none, some(1)), some(1))
- * assert.deepStrictEqual(M.concat(some(1), some(2)), some(3))
- *
- * @category instances
- * @since 2.0.0
- */
- export var getMonoid = function (S) { return ({
- concat: function (x, y) { return (isNone(x) ? y : isNone(y) ? x : some(S.concat(x.value, y.value))); },
- empty: none
- }); };
- /**
- * @category mapping
- * @since 2.0.0
- */
- export var map = function (f) { return function (fa) {
- return isNone(fa) ? none : some(f(fa.value));
- }; };
- /**
- * @category instances
- * @since 2.7.0
- */
- export var Functor = {
- URI: URI,
- map: _map
- };
- /**
- * @category constructors
- * @since 2.7.0
- */
- export var of = some;
- /**
- * @category instances
- * @since 2.10.0
- */
- export var Pointed = {
- URI: URI,
- of: of
- };
- /**
- * @since 2.0.0
- */
- export var ap = function (fa) { return function (fab) {
- return isNone(fab) ? none : isNone(fa) ? none : some(fab.value(fa.value));
- }; };
- /**
- * @category instances
- * @since 2.10.0
- */
- export var Apply = {
- URI: URI,
- map: _map,
- ap: _ap
- };
- /**
- * @category instances
- * @since 2.7.0
- */
- export var Applicative = {
- URI: URI,
- map: _map,
- ap: _ap,
- of: of
- };
- /**
- * Composes computations in sequence, using the return value of one computation to determine the next computation.
- *
- * @category sequencing
- * @since 2.0.0
- */
- export var chain = function (f) { return function (ma) {
- return isNone(ma) ? none : f(ma.value);
- }; };
- /**
- * @category instances
- * @since 2.10.0
- */
- export var Chain = {
- URI: URI,
- map: _map,
- ap: _ap,
- chain: _chain
- };
- /**
- * @category instances
- * @since 2.7.0
- */
- export var Monad = {
- URI: URI,
- map: _map,
- ap: _ap,
- of: of,
- chain: _chain
- };
- /**
- * @category folding
- * @since 2.0.0
- */
- export var reduce = function (b, f) { return function (fa) {
- return isNone(fa) ? b : f(b, fa.value);
- }; };
- /**
- * @category folding
- * @since 2.0.0
- */
- export var foldMap = function (M) { return function (f) { return function (fa) {
- return isNone(fa) ? M.empty : f(fa.value);
- }; }; };
- /**
- * @category folding
- * @since 2.0.0
- */
- export var reduceRight = function (b, f) { return function (fa) {
- return isNone(fa) ? b : f(fa.value, b);
- }; };
- /**
- * @category instances
- * @since 2.7.0
- */
- export var Foldable = {
- URI: URI,
- reduce: _reduce,
- foldMap: _foldMap,
- reduceRight: _reduceRight
- };
- /**
- * Less strict version of [`alt`](#alt).
- *
- * The `W` suffix (short for **W**idening) means that the return types will be merged.
- *
- * @category error handling
- * @since 2.9.0
- */
- export var altW = function (that) { return function (fa) {
- return isNone(fa) ? that() : fa;
- }; };
- /**
- * Identifies an associative operation on a type constructor. It is similar to `Semigroup`, except that it applies to
- * types of kind `* -> *`.
- *
- * In case of `Option` returns the left-most non-`None` value.
- *
- * | x | y | pipe(x, alt(() => y) |
- * | ------- | ------- | -------------------- |
- * | none | none | none |
- * | some(a) | none | some(a) |
- * | none | some(b) | some(b) |
- * | some(a) | some(b) | some(a) |
- *
- * @example
- * import * as O from 'fp-ts/Option'
- * import { pipe } from 'fp-ts/function'
- *
- * assert.deepStrictEqual(
- * pipe(
- * O.none,
- * O.alt(() => O.none)
- * ),
- * O.none
- * )
- * assert.deepStrictEqual(
- * pipe(
- * O.some('a'),
- * O.alt<string>(() => O.none)
- * ),
- * O.some('a')
- * )
- * assert.deepStrictEqual(
- * pipe(
- * O.none,
- * O.alt(() => O.some('b'))
- * ),
- * O.some('b')
- * )
- * assert.deepStrictEqual(
- * pipe(
- * O.some('a'),
- * O.alt(() => O.some('b'))
- * ),
- * O.some('a')
- * )
- *
- * @category error handling
- * @since 2.0.0
- */
- export var alt = altW;
- /**
- * @category instances
- * @since 2.7.0
- */
- export var Alt = {
- URI: URI,
- map: _map,
- alt: _alt
- };
- /**
- * @since 2.7.0
- */
- export var zero = function () { return none; };
- /**
- * @category instances
- * @since 2.11.0
- */
- export var Zero = {
- URI: URI,
- zero: zero
- };
- /**
- * @category do notation
- * @since 2.11.0
- */
- export var guard = /*#__PURE__*/ guard_(Zero, Pointed);
- /**
- * @category instances
- * @since 2.7.0
- */
- export var Alternative = {
- URI: URI,
- map: _map,
- ap: _ap,
- of: of,
- alt: _alt,
- zero: zero
- };
- /**
- * @since 2.0.0
- */
- export var extend = function (f) { return function (wa) {
- return isNone(wa) ? none : some(f(wa));
- }; };
- /**
- * @category instances
- * @since 2.7.0
- */
- export var Extend = {
- URI: URI,
- map: _map,
- extend: _extend
- };
- /**
- * @category filtering
- * @since 2.0.0
- */
- export var compact = /*#__PURE__*/ chain(identity);
- var defaultSeparated = /*#__PURE__*/ separated(none, none);
- /**
- * @category filtering
- * @since 2.0.0
- */
- export var separate = function (ma) {
- return isNone(ma) ? defaultSeparated : separated(getLeft(ma.value), getRight(ma.value));
- };
- /**
- * @category instances
- * @since 2.7.0
- */
- export var Compactable = {
- URI: URI,
- compact: compact,
- separate: separate
- };
- /**
- * @category filtering
- * @since 2.0.0
- */
- export var filter = function (predicate) {
- return function (fa) {
- return isNone(fa) ? none : predicate(fa.value) ? fa : none;
- };
- };
- /**
- * @category filtering
- * @since 2.0.0
- */
- export var filterMap = function (f) { return function (fa) {
- return isNone(fa) ? none : f(fa.value);
- }; };
- /**
- * @category filtering
- * @since 2.0.0
- */
- export var partition = function (predicate) {
- return function (fa) {
- return separated(_filter(fa, not(predicate)), _filter(fa, predicate));
- };
- };
- /**
- * @category filtering
- * @since 2.0.0
- */
- export var partitionMap = function (f) { return flow(map(f), separate); };
- /**
- * @category instances
- * @since 2.7.0
- */
- export var Filterable = {
- URI: URI,
- map: _map,
- compact: compact,
- separate: separate,
- filter: _filter,
- filterMap: _filterMap,
- partition: _partition,
- partitionMap: _partitionMap
- };
- /**
- * @category traversing
- * @since 2.6.3
- */
- export var traverse = function (F) {
- return function (f) {
- return function (ta) {
- return isNone(ta) ? F.of(none) : F.map(f(ta.value), some);
- };
- };
- };
- /**
- * @category traversing
- * @since 2.6.3
- */
- export var sequence = function (F) {
- return function (ta) {
- return isNone(ta) ? F.of(none) : F.map(ta.value, some);
- };
- };
- /**
- * @category instances
- * @since 2.7.0
- */
- export var Traversable = {
- URI: URI,
- map: _map,
- reduce: _reduce,
- foldMap: _foldMap,
- reduceRight: _reduceRight,
- traverse: _traverse,
- sequence: sequence
- };
- var _wither = /*#__PURE__*/ witherDefault(Traversable, Compactable);
- var _wilt = /*#__PURE__*/ wiltDefault(Traversable, Compactable);
- /**
- * @category filtering
- * @since 2.6.5
- */
- export var wither = function (F) {
- var _witherF = _wither(F);
- return function (f) { return function (fa) { return _witherF(fa, f); }; };
- };
- /**
- * @category filtering
- * @since 2.6.5
- */
- export var wilt = function (F) {
- var _wiltF = _wilt(F);
- return function (f) { return function (fa) { return _wiltF(fa, f); }; };
- };
- /**
- * @category instances
- * @since 2.7.0
- */
- export var Witherable = {
- URI: URI,
- map: _map,
- reduce: _reduce,
- foldMap: _foldMap,
- reduceRight: _reduceRight,
- traverse: _traverse,
- sequence: sequence,
- compact: compact,
- separate: separate,
- filter: _filter,
- filterMap: _filterMap,
- partition: _partition,
- partitionMap: _partitionMap,
- wither: _wither,
- wilt: _wilt
- };
- /**
- * @since 2.7.0
- */
- export var throwError = function () { return none; };
- /**
- * @category instances
- * @since 2.7.0
- */
- export var MonadThrow = {
- URI: URI,
- map: _map,
- ap: _ap,
- of: of,
- chain: _chain,
- throwError: throwError
- };
- /**
- * Transforms an `Either` to an `Option` discarding the error.
- *
- * Alias of [getRight](#getright)
- *
- * @category conversions
- * @since 2.0.0
- */
- export var fromEither = getRight;
- /**
- * @category instances
- * @since 2.11.0
- */
- export var FromEither = {
- URI: URI,
- fromEither: fromEither
- };
- // -------------------------------------------------------------------------------------
- // refinements
- // -------------------------------------------------------------------------------------
- /**
- * Returns `true` if the option is an instance of `Some`, `false` otherwise.
- *
- * @example
- * import { some, none, isSome } from 'fp-ts/Option'
- *
- * assert.strictEqual(isSome(some(1)), true)
- * assert.strictEqual(isSome(none), false)
- *
- * @category refinements
- * @since 2.0.0
- */
- export var isSome = _.isSome;
- /**
- * Returns `true` if the option is `None`, `false` otherwise.
- *
- * @example
- * import { some, none, isNone } from 'fp-ts/Option'
- *
- * assert.strictEqual(isNone(some(1)), false)
- * assert.strictEqual(isNone(none), true)
- *
- * @category refinements
- * @since 2.0.0
- */
- export var isNone = function (fa) { return fa._tag === 'None'; };
- /**
- * Less strict version of [`match`](#match).
- *
- * The `W` suffix (short for **W**idening) means that the handler return types will be merged.
- *
- * @category pattern matching
- * @since 2.10.0
- */
- export var matchW = function (onNone, onSome) {
- return function (ma) {
- return isNone(ma) ? onNone() : onSome(ma.value);
- };
- };
- /**
- * Alias of [`matchW`](#matchw).
- *
- * @category pattern matching
- * @since 2.10.0
- */
- export var foldW = matchW;
- /**
- * Takes a (lazy) default value, a function, and an `Option` value, if the `Option` value is `None` the default value is
- * returned, otherwise the function is applied to the value inside the `Some` and the result is returned.
- *
- * @example
- * import { some, none, match } from 'fp-ts/Option'
- * import { pipe } from 'fp-ts/function'
- *
- * assert.strictEqual(
- * pipe(
- * some(1),
- * match(() => 'a none', a => `a some containing ${a}`)
- * ),
- * 'a some containing 1'
- * )
- *
- * assert.strictEqual(
- * pipe(
- * none,
- * match(() => 'a none', a => `a some containing ${a}`)
- * ),
- * 'a none'
- * )
- *
- * @category pattern matching
- * @since 2.10.0
- */
- export var match = matchW;
- /**
- * Alias of [`match`](#match).
- *
- * @category pattern matching
- * @since 2.0.0
- */
- export var fold = match;
- /**
- * Less strict version of [`getOrElse`](#getorelse).
- *
- * The `W` suffix (short for **W**idening) means that the handler return type will be merged.
- *
- * @category error handling
- * @since 2.6.0
- */
- export var getOrElseW = function (onNone) {
- return function (ma) {
- return isNone(ma) ? onNone() : ma.value;
- };
- };
- /**
- * Extracts the value out of the structure, if it exists. Otherwise returns the given default value
- *
- * @example
- * import { some, none, getOrElse } from 'fp-ts/Option'
- * import { pipe } from 'fp-ts/function'
- *
- * assert.strictEqual(
- * pipe(
- * some(1),
- * getOrElse(() => 0)
- * ),
- * 1
- * )
- * assert.strictEqual(
- * pipe(
- * none,
- * getOrElse(() => 0)
- * ),
- * 0
- * )
- *
- * @category error handling
- * @since 2.0.0
- */
- export var getOrElse = getOrElseW;
- /**
- * @category mapping
- * @since 2.10.0
- */
- export var flap = /*#__PURE__*/ flap_(Functor);
- /**
- * Combine two effectful actions, keeping only the result of the first.
- *
- * @since 2.0.0
- */
- export var apFirst = /*#__PURE__*/ apFirst_(Apply);
- /**
- * Combine two effectful actions, keeping only the result of the second.
- *
- * @since 2.0.0
- */
- export var apSecond = /*#__PURE__*/ apSecond_(Apply);
- /**
- * @category sequencing
- * @since 2.0.0
- */
- export var flatten = compact;
- /**
- * Composes computations in sequence, using the return value of one computation to determine the next computation and
- * keeping only the result of the first.
- *
- * @category sequencing
- * @since 2.0.0
- */
- export var chainFirst =
- /*#__PURE__*/ chainFirst_(Chain);
- /**
- * @since 2.0.0
- */
- export var duplicate = /*#__PURE__*/ extend(identity);
- /**
- * @category lifting
- * @since 2.11.0
- */
- export var fromEitherK = /*#__PURE__*/ fromEitherK_(FromEither);
- /**
- * @category sequencing
- * @since 2.11.0
- */
- export var chainEitherK =
- /*#__PURE__*/ chainEitherK_(FromEither, Chain);
- /**
- * @category sequencing
- * @since 2.12.0
- */
- export var chainFirstEitherK =
- /*#__PURE__*/ chainFirstEitherK_(FromEither, Chain);
- /**
- * Constructs a new `Option` from a nullable type. If the value is `null` or `undefined`, returns `None`, otherwise
- * returns the value wrapped in a `Some`.
- *
- * @example
- * import { none, some, fromNullable } from 'fp-ts/Option'
- *
- * assert.deepStrictEqual(fromNullable(undefined), none)
- * assert.deepStrictEqual(fromNullable(null), none)
- * assert.deepStrictEqual(fromNullable(1), some(1))
- *
- * @category conversions
- * @since 2.0.0
- */
- export var fromNullable = function (a) { return (a == null ? none : some(a)); };
- /**
- * Transforms an exception into an `Option`. If `f` throws, returns `None`, otherwise returns the output wrapped in a
- * `Some`.
- *
- * See also [`tryCatchK`](#trycatchk).
- *
- * @example
- * import { none, some, tryCatch } from 'fp-ts/Option'
- *
- * assert.deepStrictEqual(
- * tryCatch(() => {
- * throw new Error()
- * }),
- * none
- * )
- * assert.deepStrictEqual(tryCatch(() => 1), some(1))
- *
- * @category interop
- * @since 2.0.0
- */
- export var tryCatch = function (f) {
- try {
- return some(f());
- }
- catch (e) {
- return none;
- }
- };
- /**
- * Converts a function that may throw to one returning a `Option`.
- *
- * @category interop
- * @since 2.10.0
- */
- export var tryCatchK = function (f) {
- return function () {
- var a = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- a[_i] = arguments[_i];
- }
- return tryCatch(function () { return f.apply(void 0, a); });
- };
- };
- /**
- * Returns a *smart constructor* from a function that returns a nullable value.
- *
- * @example
- * import { fromNullableK, none, some } from 'fp-ts/Option'
- *
- * const f = (s: string): number | undefined => {
- * const n = parseFloat(s)
- * return isNaN(n) ? undefined : n
- * }
- *
- * const g = fromNullableK(f)
- *
- * assert.deepStrictEqual(g('1'), some(1))
- * assert.deepStrictEqual(g('a'), none)
- *
- * @category lifting
- * @since 2.9.0
- */
- export var fromNullableK = function (f) { return flow(f, fromNullable); };
- /**
- * This is `chain` + `fromNullable`, useful when working with optional values.
- *
- * @example
- * import { some, none, fromNullable, chainNullableK } from 'fp-ts/Option'
- * import { pipe } from 'fp-ts/function'
- *
- * interface Employee {
- * readonly company?: {
- * readonly address?: {
- * readonly street?: {
- * readonly name?: string
- * }
- * }
- * }
- * }
- *
- * const employee1: Employee = { company: { address: { street: { name: 'high street' } } } }
- *
- * assert.deepStrictEqual(
- * pipe(
- * fromNullable(employee1.company),
- * chainNullableK(company => company.address),
- * chainNullableK(address => address.street),
- * chainNullableK(street => street.name)
- * ),
- * some('high street')
- * )
- *
- * const employee2: Employee = { company: { address: { street: {} } } }
- *
- * assert.deepStrictEqual(
- * pipe(
- * fromNullable(employee2.company),
- * chainNullableK(company => company.address),
- * chainNullableK(address => address.street),
- * chainNullableK(street => street.name)
- * ),
- * none
- * )
- *
- * @category sequencing
- * @since 2.9.0
- */
- export var chainNullableK = function (f) {
- return function (ma) {
- return isNone(ma) ? none : fromNullable(f(ma.value));
- };
- };
- /**
- * Extracts the value out of the structure, if it exists. Otherwise returns `null`.
- *
- * @example
- * import { some, none, toNullable } from 'fp-ts/Option'
- * import { pipe } from 'fp-ts/function'
- *
- * assert.strictEqual(
- * pipe(
- * some(1),
- * toNullable
- * ),
- * 1
- * )
- * assert.strictEqual(
- * pipe(
- * none,
- * toNullable
- * ),
- * null
- * )
- *
- * @category conversions
- * @since 2.0.0
- */
- export var toNullable = /*#__PURE__*/ match(constNull, identity);
- /**
- * Extracts the value out of the structure, if it exists. Otherwise returns `undefined`.
- *
- * @example
- * import { some, none, toUndefined } from 'fp-ts/Option'
- * import { pipe } from 'fp-ts/function'
- *
- * assert.strictEqual(
- * pipe(
- * some(1),
- * toUndefined
- * ),
- * 1
- * )
- * assert.strictEqual(
- * pipe(
- * none,
- * toUndefined
- * ),
- * undefined
- * )
- *
- * @category conversions
- * @since 2.0.0
- */
- export var toUndefined = /*#__PURE__*/ match(constUndefined, identity);
- export function elem(E) {
- return function (a, ma) {
- if (ma === undefined) {
- var elemE_1 = elem(E);
- return function (ma) { return elemE_1(a, ma); };
- }
- return isNone(ma) ? false : E.equals(a, ma.value);
- };
- }
- /**
- * Returns `true` if the predicate is satisfied by the wrapped value
- *
- * @example
- * import { some, none, exists } from 'fp-ts/Option'
- * import { pipe } from 'fp-ts/function'
- *
- * assert.strictEqual(
- * pipe(
- * some(1),
- * exists(n => n > 0)
- * ),
- * true
- * )
- * assert.strictEqual(
- * pipe(
- * some(1),
- * exists(n => n > 1)
- * ),
- * false
- * )
- * assert.strictEqual(
- * pipe(
- * none,
- * exists(n => n > 0)
- * ),
- * false
- * )
- *
- * @since 2.0.0
- */
- export var exists = function (predicate) {
- return function (ma) {
- return isNone(ma) ? false : predicate(ma.value);
- };
- };
- // -------------------------------------------------------------------------------------
- // do notation
- // -------------------------------------------------------------------------------------
- /**
- * @category do notation
- * @since 2.9.0
- */
- export var Do = /*#__PURE__*/ of(_.emptyRecord);
- /**
- * @category do notation
- * @since 2.8.0
- */
- export var bindTo = /*#__PURE__*/ bindTo_(Functor);
- var let_ = /*#__PURE__*/ let__(Functor);
- export {
- /**
- * @category do notation
- * @since 2.13.0
- */
- let_ as let };
- /**
- * @category do notation
- * @since 2.8.0
- */
- export var bind = /*#__PURE__*/ bind_(Chain);
- /**
- * @category do notation
- * @since 2.8.0
- */
- export var apS = /*#__PURE__*/ apS_(Apply);
- /**
- * @since 2.11.0
- */
- export var ApT = /*#__PURE__*/ of(_.emptyReadonlyArray);
- // -------------------------------------------------------------------------------------
- // array utils
- // -------------------------------------------------------------------------------------
- /**
- * Equivalent to `ReadonlyNonEmptyArray#traverseWithIndex(Applicative)`.
- *
- * @category traversing
- * @since 2.11.0
- */
- export var traverseReadonlyNonEmptyArrayWithIndex = function (f) {
- return function (as) {
- var o = f(0, _.head(as));
- if (isNone(o)) {
- return none;
- }
- var out = [o.value];
- for (var i = 1; i < as.length; i++) {
- var o_1 = f(i, as[i]);
- if (isNone(o_1)) {
- return none;
- }
- out.push(o_1.value);
- }
- return some(out);
- };
- };
- /**
- * Equivalent to `ReadonlyArray#traverseWithIndex(Applicative)`.
- *
- * @category traversing
- * @since 2.11.0
- */
- export var traverseReadonlyArrayWithIndex = function (f) {
- var g = traverseReadonlyNonEmptyArrayWithIndex(f);
- return function (as) { return (_.isNonEmpty(as) ? g(as) : ApT); };
- };
- /**
- * Equivalent to `ReadonlyArray#traverseWithIndex(Applicative)`.
- *
- * @category traversing
- * @since 2.9.0
- */
- export var traverseArrayWithIndex = traverseReadonlyArrayWithIndex;
- /**
- * Equivalent to `ReadonlyArray#traverse(Applicative)`.
- *
- * @category traversing
- * @since 2.9.0
- */
- export var traverseArray = function (f) {
- return traverseReadonlyArrayWithIndex(function (_, a) { return f(a); });
- };
- /**
- * Equivalent to `ReadonlyArray#sequence(Applicative)`.
- *
- * @category traversing
- * @since 2.9.0
- */
- export var sequenceArray =
- /*#__PURE__*/ traverseArray(identity);
- // -------------------------------------------------------------------------------------
- // deprecated
- // -------------------------------------------------------------------------------------
- /**
- * Use `Refinement` module instead.
- *
- * @category zone of death
- * @since 2.0.0
- * @deprecated
- */
- export function getRefinement(getOption) {
- return function (a) { return isSome(getOption(a)); };
- }
- /**
- * Use [`chainNullableK`](#chainnullablek) instead.
- *
- * @category zone of death
- * @since 2.0.0
- * @deprecated
- */
- export var mapNullable = chainNullableK;
- /**
- * This instance is deprecated, use small, specific instances instead.
- * For example if a function needs a `Functor` instance, pass `O.Functor` instead of `O.option`
- * (where `O` is from `import O from 'fp-ts/Option'`)
- *
- * @category zone of death
- * @since 2.0.0
- * @deprecated
- */
- export var option = {
- URI: URI,
- map: _map,
- of: of,
- ap: _ap,
- chain: _chain,
- reduce: _reduce,
- foldMap: _foldMap,
- reduceRight: _reduceRight,
- traverse: _traverse,
- sequence: sequence,
- zero: zero,
- alt: _alt,
- extend: _extend,
- compact: compact,
- separate: separate,
- filter: _filter,
- filterMap: _filterMap,
- partition: _partition,
- partitionMap: _partitionMap,
- wither: _wither,
- wilt: _wilt,
- throwError: throwError
- };
- /**
- * Use [`getApplySemigroup`](./Apply.ts.html#getapplysemigroup) instead.
- *
- * @category zone of death
- * @since 2.0.0
- * @deprecated
- */
- export var getApplySemigroup = /*#__PURE__*/ getApplySemigroup_(Apply);
- /**
- * Use [`getApplicativeMonoid`](./Applicative.ts.html#getapplicativemonoid) instead.
- *
- * @category zone of death
- * @since 2.0.0
- * @deprecated
- */
- export var getApplyMonoid = /*#__PURE__*/ getApplicativeMonoid(Applicative);
- /**
- * Use
- *
- * ```ts
- * import { first } from 'fp-ts/Semigroup'
- * import { getMonoid } from 'fp-ts/Option'
- *
- * getMonoid(first())
- * ```
- *
- * instead.
- *
- * Monoid returning the left-most non-`None` value
- *
- * | x | y | concat(x, y) |
- * | ------- | ------- | ------------ |
- * | none | none | none |
- * | some(a) | none | some(a) |
- * | none | some(b) | some(b) |
- * | some(a) | some(b) | some(a) |
- *
- * @example
- * import { getFirstMonoid, some, none } from 'fp-ts/Option'
- *
- * const M = getFirstMonoid<number>()
- * assert.deepStrictEqual(M.concat(none, none), none)
- * assert.deepStrictEqual(M.concat(some(1), none), some(1))
- * assert.deepStrictEqual(M.concat(none, some(2)), some(2))
- * assert.deepStrictEqual(M.concat(some(1), some(2)), some(1))
- *
- * @category zone of death
- * @since 2.0.0
- * @deprecated
- */
- export var getFirstMonoid = function () { return getMonoid(first()); };
- /**
- * Use
- *
- * ```ts
- * import { last } from 'fp-ts/Semigroup'
- * import { getMonoid } from 'fp-ts/Option'
- *
- * getMonoid(last())
- * ```
- *
- * instead.
- *
- * Monoid returning the right-most non-`None` value
- *
- * | x | y | concat(x, y) |
- * | ------- | ------- | ------------ |
- * | none | none | none |
- * | some(a) | none | some(a) |
- * | none | some(b) | some(b) |
- * | some(a) | some(b) | some(b) |
- *
- * @example
- * import { getLastMonoid, some, none } from 'fp-ts/Option'
- *
- * const M = getLastMonoid<number>()
- * assert.deepStrictEqual(M.concat(none, none), none)
- * assert.deepStrictEqual(M.concat(some(1), none), some(1))
- * assert.deepStrictEqual(M.concat(none, some(2)), some(2))
- * assert.deepStrictEqual(M.concat(some(1), some(2)), some(2))
- *
- * @category zone of death
- * @since 2.0.0
- * @deprecated
- */
- export var getLastMonoid = function () { return getMonoid(last()); };
|