1319 lines
34 KiB
JavaScript
1319 lines
34 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.fromFoldable = exports.fromTraversable = exports.Setter = exports.Fold = exports.Getter = exports.Index = exports.At = exports.Traversal = exports.Optional = exports.Prism = exports.Lens = exports.Iso = exports.traversal = exports.optional = exports.prism = exports.lens = exports.index = exports.iso = exports.at = void 0;
|
|
/**
|
|
* @since 1.0.0
|
|
*/
|
|
var A = require("fp-ts/lib/Array");
|
|
var Const_1 = require("fp-ts/lib/Const");
|
|
var function_1 = require("fp-ts/lib/function");
|
|
var Monoid_1 = require("fp-ts/lib/Monoid");
|
|
var Option_1 = require("fp-ts/lib/Option");
|
|
var pipeable_1 = require("fp-ts/lib/pipeable");
|
|
var at = require("./At");
|
|
exports.at = at;
|
|
var iso = require("./Iso");
|
|
exports.iso = iso;
|
|
var index = require("./Ix");
|
|
exports.index = index;
|
|
var lens = require("./Lens");
|
|
exports.lens = lens;
|
|
var optional = require("./Optional");
|
|
exports.optional = optional;
|
|
var prism = require("./Prism");
|
|
exports.prism = prism;
|
|
var traversal = require("./Traversal");
|
|
exports.traversal = traversal;
|
|
//
|
|
// compat
|
|
//
|
|
var fromIso = function (iso) { return new Iso(iso.get, iso.reverseGet); };
|
|
var fromLens = function (lens) { return new Lens(lens.get, lens.set); };
|
|
var fromPrism = function (prism) { return new Prism(prism.getOption, prism.reverseGet); };
|
|
var fromOptional = function (optional) {
|
|
return new Optional(optional.getOption, optional.set);
|
|
};
|
|
var fromTraversal = function (traversal) { return new Traversal(traversal.modifyF); };
|
|
var fromAt = function (at) { return new At(function (i) { return fromLens(at.at(i)); }); };
|
|
var fromIndex = function (ix) { return new Index(function (i) { return fromOptional(ix.index(i)); }); };
|
|
//
|
|
// old APIs
|
|
//
|
|
var update = function (o, k, a) {
|
|
var _a;
|
|
return a === o[k] ? o : Object.assign({}, o, (_a = {}, _a[k] = a, _a));
|
|
};
|
|
/**
|
|
* Laws:
|
|
* 1. `reverseGet(get(s)) = s`
|
|
* 2. `get(reversetGet(a)) = a`
|
|
*
|
|
* @category constructor
|
|
* @since 1.0.0
|
|
*/
|
|
var Iso = /** @class */ (function () {
|
|
function Iso(get, reverseGet) {
|
|
this.get = get;
|
|
this.reverseGet = reverseGet;
|
|
/**
|
|
* @since 1.0.0
|
|
*/
|
|
this._tag = 'Iso';
|
|
/**
|
|
* @since 1.0.0
|
|
*/
|
|
this.unwrap = this.get;
|
|
/**
|
|
* @since 1.0.0
|
|
*/
|
|
this.to = this.get;
|
|
/**
|
|
* @since 1.0.0
|
|
*/
|
|
this.wrap = this.reverseGet;
|
|
/**
|
|
* @since 1.0.0
|
|
*/
|
|
this.from = this.reverseGet;
|
|
}
|
|
/**
|
|
* reverse the `Iso`: the source becomes the target and the target becomes the source
|
|
* @since 1.0.0
|
|
*/
|
|
Iso.prototype.reverse = function () {
|
|
return fromIso(iso.reverse(this));
|
|
};
|
|
/**
|
|
* @since 1.0.0
|
|
*/
|
|
Iso.prototype.modify = function (f) {
|
|
return iso.modify(f)(this);
|
|
};
|
|
/**
|
|
* view an `Iso` as a `Lens`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Iso.prototype.asLens = function () {
|
|
return fromLens(iso.asLens(this));
|
|
};
|
|
/**
|
|
* view an `Iso` as a `Prism`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Iso.prototype.asPrism = function () {
|
|
return fromPrism(iso.asPrism(this));
|
|
};
|
|
/**
|
|
* view an `Iso` as a `Optional`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Iso.prototype.asOptional = function () {
|
|
return fromOptional(iso.asOptional(this));
|
|
};
|
|
/**
|
|
* view an `Iso` as a `Traversal`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Iso.prototype.asTraversal = function () {
|
|
return fromTraversal(iso.asTraversal(this));
|
|
};
|
|
/**
|
|
* view an `Iso` as a `Fold`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Iso.prototype.asFold = function () {
|
|
var _this = this;
|
|
return new Fold(function () { return function (f) { return function (s) { return f(_this.get(s)); }; }; });
|
|
};
|
|
/**
|
|
* view an `Iso` as a `Getter`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Iso.prototype.asGetter = function () {
|
|
var _this = this;
|
|
return new Getter(function (s) { return _this.get(s); });
|
|
};
|
|
/**
|
|
* view an `Iso` as a `Setter`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Iso.prototype.asSetter = function () {
|
|
var _this = this;
|
|
return new Setter(function (f) { return _this.modify(f); });
|
|
};
|
|
/**
|
|
* compose an `Iso` with an `Iso`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Iso.prototype.compose = function (ab) {
|
|
return fromIso(iso.compose(ab)(this));
|
|
};
|
|
/**
|
|
* Alias of `compose`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Iso.prototype.composeIso = function (ab) {
|
|
return this.compose(ab);
|
|
};
|
|
/**
|
|
* compose an `Iso` with a `Lens `
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Iso.prototype.composeLens = function (ab) {
|
|
return fromLens((0, pipeable_1.pipe)(this, iso.asLens, lens.compose(ab)));
|
|
};
|
|
/**
|
|
* compose an `Iso` with a `Prism`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Iso.prototype.composePrism = function (ab) {
|
|
return fromPrism((0, pipeable_1.pipe)(this, iso.asPrism, prism.compose(ab)));
|
|
};
|
|
/**
|
|
* compose an `Iso` with an `Optional`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Iso.prototype.composeOptional = function (ab) {
|
|
return fromOptional((0, pipeable_1.pipe)(this, iso.asOptional, optional.compose(ab)));
|
|
};
|
|
/**
|
|
* compose an `Iso` with a `Traversal`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Iso.prototype.composeTraversal = function (ab) {
|
|
return fromTraversal((0, pipeable_1.pipe)(this, iso.asTraversal, traversal.compose(ab)));
|
|
};
|
|
/**
|
|
* compose an `Iso` with a `Fold`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Iso.prototype.composeFold = function (ab) {
|
|
return this.asFold().compose(ab);
|
|
};
|
|
/**
|
|
* compose an `Iso` with a `Getter`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Iso.prototype.composeGetter = function (ab) {
|
|
return this.asGetter().compose(ab);
|
|
};
|
|
/**
|
|
* compose an `Iso` with a `Setter`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Iso.prototype.composeSetter = function (ab) {
|
|
return this.asSetter().compose(ab);
|
|
};
|
|
return Iso;
|
|
}());
|
|
exports.Iso = Iso;
|
|
/**
|
|
* Laws:
|
|
* 1. `get(set(a)(s)) = a`
|
|
* 2. `set(get(s))(s) = s`
|
|
* 3. `set(a)(set(a)(s)) = set(a)(s)`
|
|
*
|
|
* @category constructor
|
|
* @since 1.0.0
|
|
*/
|
|
var Lens = /** @class */ (function () {
|
|
function Lens(get, set) {
|
|
this.get = get;
|
|
this.set = set;
|
|
/**
|
|
* @since 1.0.0
|
|
*/
|
|
this._tag = 'Lens';
|
|
}
|
|
/**
|
|
* @example
|
|
* import { Lens } from 'monocle-ts'
|
|
*
|
|
* type Person = {
|
|
* name: string
|
|
* age: number
|
|
* address: {
|
|
* city: string
|
|
* }
|
|
* }
|
|
*
|
|
* const city = Lens.fromPath<Person>()(['address', 'city'])
|
|
*
|
|
* const person: Person = { name: 'Giulio', age: 43, address: { city: 'Milan' } }
|
|
*
|
|
* assert.strictEqual(city.get(person), 'Milan')
|
|
* assert.deepStrictEqual(city.set('London')(person), { name: 'Giulio', age: 43, address: { city: 'London' } })
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Lens.fromPath = function () {
|
|
var fromProp = Lens.fromProp();
|
|
return function (path) {
|
|
var lens = fromProp(path[0]);
|
|
return path.slice(1).reduce(function (acc, prop) { return acc.compose(fromProp(prop)); }, lens);
|
|
};
|
|
};
|
|
/**
|
|
* Returns a `Lens` from a type and a prop
|
|
*
|
|
* @example
|
|
* import { Lens } from 'monocle-ts'
|
|
*
|
|
* type Person = {
|
|
* name: string
|
|
* age: number
|
|
* }
|
|
*
|
|
* const age = Lens.fromProp<Person>()('age')
|
|
*
|
|
* const person: Person = { name: 'Giulio', age: 43 }
|
|
*
|
|
* assert.strictEqual(age.get(person), 43)
|
|
* assert.deepStrictEqual(age.set(44)(person), { name: 'Giulio', age: 44 })
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Lens.fromProp = function () {
|
|
return function (prop) { return fromLens((0, pipeable_1.pipe)(lens.id(), lens.prop(prop))); };
|
|
};
|
|
Lens.fromProps = function () {
|
|
return function (props) { return fromLens((0, pipeable_1.pipe)(lens.id(), lens.props.apply(lens, props))); };
|
|
};
|
|
/**
|
|
* Returns a `Lens` from a nullable (`A | null | undefined`) prop
|
|
*
|
|
* @example
|
|
* import { Lens } from 'monocle-ts'
|
|
*
|
|
* interface Outer {
|
|
* inner?: Inner
|
|
* }
|
|
*
|
|
* interface Inner {
|
|
* value: number
|
|
* foo: string
|
|
* }
|
|
*
|
|
* const inner = Lens.fromNullableProp<Outer>()('inner', { value: 0, foo: 'foo' })
|
|
* const value = Lens.fromProp<Inner>()('value')
|
|
* const lens = inner.compose(value)
|
|
*
|
|
* assert.deepStrictEqual(lens.set(1)({}), { inner: { value: 1, foo: 'foo' } })
|
|
* assert.strictEqual(lens.get({}), 0)
|
|
* assert.deepStrictEqual(lens.set(1)({ inner: { value: 1, foo: 'bar' } }), { inner: { value: 1, foo: 'bar' } })
|
|
* assert.strictEqual(lens.get({ inner: { value: 1, foo: 'bar' } }), 1)
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Lens.fromNullableProp = function () {
|
|
return function (k, defaultValue) {
|
|
return new Lens(function (s) {
|
|
var osk = (0, Option_1.fromNullable)(s[k]);
|
|
if ((0, Option_1.isNone)(osk)) {
|
|
return defaultValue;
|
|
}
|
|
else {
|
|
return osk.value;
|
|
}
|
|
}, function (a) { return function (s) { return update(s, k, a); }; });
|
|
};
|
|
};
|
|
/**
|
|
* @since 1.0.0
|
|
*/
|
|
Lens.prototype.modify = function (f) {
|
|
return lens.modify(f)(this);
|
|
};
|
|
/**
|
|
* view a `Lens` as a Optional
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Lens.prototype.asOptional = function () {
|
|
return fromOptional(lens.asOptional(this));
|
|
};
|
|
/**
|
|
* view a `Lens` as a `Traversal`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Lens.prototype.asTraversal = function () {
|
|
return fromTraversal(lens.asTraversal(this));
|
|
};
|
|
/**
|
|
* view a `Lens` as a `Setter`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Lens.prototype.asSetter = function () {
|
|
var _this = this;
|
|
return new Setter(function (f) { return _this.modify(f); });
|
|
};
|
|
/**
|
|
* view a `Lens` as a `Getter`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Lens.prototype.asGetter = function () {
|
|
var _this = this;
|
|
return new Getter(function (s) { return _this.get(s); });
|
|
};
|
|
/**
|
|
* view a `Lens` as a `Fold`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Lens.prototype.asFold = function () {
|
|
var _this = this;
|
|
return new Fold(function () { return function (f) { return function (s) { return f(_this.get(s)); }; }; });
|
|
};
|
|
/**
|
|
* compose a `Lens` with a `Lens`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Lens.prototype.compose = function (ab) {
|
|
return fromLens(lens.compose(ab)(this));
|
|
};
|
|
/**
|
|
* Alias of `compose`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Lens.prototype.composeLens = function (ab) {
|
|
return this.compose(ab);
|
|
};
|
|
/**
|
|
* compose a `Lens` with a `Getter`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Lens.prototype.composeGetter = function (ab) {
|
|
return this.asGetter().compose(ab);
|
|
};
|
|
/**
|
|
* compose a `Lens` with a `Fold`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Lens.prototype.composeFold = function (ab) {
|
|
return this.asFold().compose(ab);
|
|
};
|
|
/**
|
|
* compose a `Lens` with an `Optional`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Lens.prototype.composeOptional = function (ab) {
|
|
return fromOptional((0, pipeable_1.pipe)(this, lens.asOptional, optional.compose(ab)));
|
|
};
|
|
/**
|
|
* compose a `Lens` with an `Traversal`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Lens.prototype.composeTraversal = function (ab) {
|
|
return fromTraversal((0, pipeable_1.pipe)(this, lens.asTraversal, traversal.compose(ab)));
|
|
};
|
|
/**
|
|
* compose a `Lens` with an `Setter`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Lens.prototype.composeSetter = function (ab) {
|
|
return this.asSetter().compose(ab);
|
|
};
|
|
/**
|
|
* compose a `Lens` with an `Iso`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Lens.prototype.composeIso = function (ab) {
|
|
return fromLens((0, pipeable_1.pipe)(this, lens.compose((0, pipeable_1.pipe)(ab, iso.asLens))));
|
|
};
|
|
/**
|
|
* compose a `Lens` with a `Prism`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Lens.prototype.composePrism = function (ab) {
|
|
return fromOptional(lens.composePrism(ab)(this));
|
|
};
|
|
return Lens;
|
|
}());
|
|
exports.Lens = Lens;
|
|
/**
|
|
* Laws:
|
|
* 1. `pipe(getOption(s), fold(() => s, reverseGet)) = s`
|
|
* 2. `getOption(reverseGet(a)) = some(a)`
|
|
*
|
|
* @category constructor
|
|
* @since 1.0.0
|
|
*/
|
|
var Prism = /** @class */ (function () {
|
|
function Prism(getOption, reverseGet) {
|
|
this.getOption = getOption;
|
|
this.reverseGet = reverseGet;
|
|
/**
|
|
* @since 1.0.0
|
|
*/
|
|
this._tag = 'Prism';
|
|
}
|
|
Prism.fromPredicate = function (predicate) {
|
|
return fromPrism(prism.fromPredicate(predicate));
|
|
};
|
|
/**
|
|
* @since 1.0.0
|
|
*/
|
|
Prism.some = function () {
|
|
return somePrism;
|
|
};
|
|
/**
|
|
* @since 1.0.0
|
|
*/
|
|
Prism.prototype.modify = function (f) {
|
|
var _this = this;
|
|
return function (s) {
|
|
var os = _this.modifyOption(f)(s);
|
|
if ((0, Option_1.isNone)(os)) {
|
|
return s;
|
|
}
|
|
else {
|
|
return os.value;
|
|
}
|
|
};
|
|
};
|
|
/**
|
|
* @since 1.0.0
|
|
*/
|
|
Prism.prototype.modifyOption = function (f) {
|
|
var _this = this;
|
|
return function (s) {
|
|
return Option_1.option.map(_this.getOption(s), function (v) {
|
|
var n = f(v);
|
|
return n === v ? s : _this.reverseGet(n);
|
|
});
|
|
};
|
|
};
|
|
/**
|
|
* set the target of a `Prism` with a value
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Prism.prototype.set = function (a) {
|
|
return this.modify(function () { return a; });
|
|
};
|
|
/**
|
|
* view a `Prism` as a `Optional`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Prism.prototype.asOptional = function () {
|
|
return fromOptional(prism.asOptional(this));
|
|
};
|
|
/**
|
|
* view a `Prism` as a `Traversal`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Prism.prototype.asTraversal = function () {
|
|
return fromTraversal(prism.asTraversal(this));
|
|
};
|
|
/**
|
|
* view a `Prism` as a `Setter`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Prism.prototype.asSetter = function () {
|
|
var _this = this;
|
|
return new Setter(function (f) { return _this.modify(f); });
|
|
};
|
|
/**
|
|
* view a `Prism` as a `Fold`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Prism.prototype.asFold = function () {
|
|
var _this = this;
|
|
return new Fold(function (M) { return function (f) { return function (s) {
|
|
var oa = _this.getOption(s);
|
|
return (0, Option_1.isNone)(oa) ? M.empty : f(oa.value);
|
|
}; }; });
|
|
};
|
|
/**
|
|
* compose a `Prism` with a `Prism`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Prism.prototype.compose = function (ab) {
|
|
return fromPrism(prism.compose(ab)(this));
|
|
};
|
|
/**
|
|
* Alias of `compose`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Prism.prototype.composePrism = function (ab) {
|
|
return this.compose(ab);
|
|
};
|
|
/**
|
|
* compose a `Prism` with a `Optional`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Prism.prototype.composeOptional = function (ab) {
|
|
return fromOptional((0, pipeable_1.pipe)(this, prism.asOptional, optional.compose(ab)));
|
|
};
|
|
/**
|
|
* compose a `Prism` with a `Traversal`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Prism.prototype.composeTraversal = function (ab) {
|
|
return fromTraversal((0, pipeable_1.pipe)(this, prism.asTraversal, traversal.compose(ab)));
|
|
};
|
|
/**
|
|
* compose a `Prism` with a `Fold`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Prism.prototype.composeFold = function (ab) {
|
|
return this.asFold().compose(ab);
|
|
};
|
|
/**
|
|
* compose a `Prism` with a `Setter`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Prism.prototype.composeSetter = function (ab) {
|
|
return this.asSetter().compose(ab);
|
|
};
|
|
/**
|
|
* compose a `Prism` with a `Iso`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Prism.prototype.composeIso = function (ab) {
|
|
return fromPrism((0, pipeable_1.pipe)(this, prism.compose((0, pipeable_1.pipe)(ab, iso.asPrism))));
|
|
};
|
|
/**
|
|
* compose a `Prism` with a `Lens`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Prism.prototype.composeLens = function (ab) {
|
|
return fromOptional(prism.composeLens(ab)(this));
|
|
};
|
|
/**
|
|
* compose a `Prism` with a `Getter`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Prism.prototype.composeGetter = function (ab) {
|
|
return this.asFold().compose(ab.asFold());
|
|
};
|
|
return Prism;
|
|
}());
|
|
exports.Prism = Prism;
|
|
var somePrism =
|
|
/*#__PURE__*/
|
|
new Prism(function_1.identity, Option_1.some);
|
|
/**
|
|
* Laws:
|
|
* 1. `pipe(getOption(s), fold(() => s, a => set(a)(s))) = s`
|
|
* 2. `getOption(set(a)(s)) = pipe(getOption(s), map(_ => a))`
|
|
* 3. `set(a)(set(a)(s)) = set(a)(s)`
|
|
*
|
|
* @category constructor
|
|
* @since 1.0.0
|
|
*/
|
|
var Optional = /** @class */ (function () {
|
|
function Optional(getOption, set) {
|
|
this.getOption = getOption;
|
|
this.set = set;
|
|
/**
|
|
* @since 1.0.0
|
|
*/
|
|
this._tag = 'Optional';
|
|
}
|
|
/**
|
|
* Returns an `Optional` from a nullable (`A | null | undefined`) prop
|
|
*
|
|
* @example
|
|
* import { Optional } from 'monocle-ts'
|
|
*
|
|
* interface Phone {
|
|
* number: string
|
|
* }
|
|
* interface Employment {
|
|
* phone?: Phone
|
|
* }
|
|
* interface Info {
|
|
* employment?: Employment
|
|
* }
|
|
* interface Response {
|
|
* info?: Info
|
|
* }
|
|
*
|
|
* const numberFromResponse = Optional.fromPath<Response>()(['info', 'employment', 'phone', 'number'])
|
|
*
|
|
* const response1: Response = {
|
|
* info: {
|
|
* employment: {
|
|
* phone: {
|
|
* number: '555-1234'
|
|
* }
|
|
* }
|
|
* }
|
|
* }
|
|
* const response2: Response = {
|
|
* info: {
|
|
* employment: {}
|
|
* }
|
|
* }
|
|
*
|
|
* numberFromResponse.getOption(response1) // some('555-1234')
|
|
* numberFromResponse.getOption(response2) // none
|
|
*
|
|
* @since 2.1.0
|
|
*/
|
|
Optional.fromPath = function () {
|
|
var fromNullableProp = Optional.fromNullableProp();
|
|
return function (path) {
|
|
var optional = fromNullableProp(path[0]);
|
|
return path.slice(1).reduce(function (acc, prop) { return acc.compose(fromNullableProp(prop)); }, optional);
|
|
};
|
|
};
|
|
/**
|
|
* @example
|
|
* import { Optional } from 'monocle-ts'
|
|
*
|
|
* interface S {
|
|
* a: number | undefined | null
|
|
* }
|
|
*
|
|
* const optional = Optional.fromNullableProp<S>()('a')
|
|
*
|
|
* const s1: S = { a: undefined }
|
|
* const s2: S = { a: null }
|
|
* const s3: S = { a: 1 }
|
|
*
|
|
* assert.deepStrictEqual(optional.set(2)(s1), s1)
|
|
* assert.deepStrictEqual(optional.set(2)(s2), s2)
|
|
* assert.deepStrictEqual(optional.set(2)(s3), { a: 2 })
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Optional.fromNullableProp = function () {
|
|
return function (k) {
|
|
return new Optional(function (s) { return (0, Option_1.fromNullable)(s[k]); }, function (a) { return function (s) { return (s[k] == null ? s : update(s, k, a)); }; });
|
|
};
|
|
};
|
|
/**
|
|
* Returns an `Optional` from an option (`Option<A>`) prop
|
|
*
|
|
* @example
|
|
* import { Optional } from 'monocle-ts'
|
|
* import * as O from 'fp-ts/Option'
|
|
*
|
|
* interface S {
|
|
* a: O.Option<number>
|
|
* }
|
|
*
|
|
* const optional = Optional.fromOptionProp<S>()('a')
|
|
* const s1: S = { a: O.none }
|
|
* const s2: S = { a: O.some(1) }
|
|
* assert.deepStrictEqual(optional.set(2)(s1), s1)
|
|
* assert.deepStrictEqual(optional.set(2)(s2), { a: O.some(2) })
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Optional.fromOptionProp = function () {
|
|
var formProp = Lens.fromProp();
|
|
return function (prop) { return formProp(prop).composePrism(somePrism); };
|
|
};
|
|
/**
|
|
* @since 1.0.0
|
|
*/
|
|
Optional.prototype.modify = function (f) {
|
|
return optional.modify(f)(this);
|
|
};
|
|
/**
|
|
* @since 1.0.0
|
|
*/
|
|
Optional.prototype.modifyOption = function (f) {
|
|
return optional.modifyOption(f)(this);
|
|
};
|
|
/**
|
|
* view a `Optional` as a `Traversal`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Optional.prototype.asTraversal = function () {
|
|
return fromTraversal(optional.asTraversal(this));
|
|
};
|
|
/**
|
|
* view an `Optional` as a `Fold`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Optional.prototype.asFold = function () {
|
|
var _this = this;
|
|
return new Fold(function (M) { return function (f) { return function (s) {
|
|
var oa = _this.getOption(s);
|
|
return (0, Option_1.isNone)(oa) ? M.empty : f(oa.value);
|
|
}; }; });
|
|
};
|
|
/**
|
|
* view an `Optional` as a `Setter`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Optional.prototype.asSetter = function () {
|
|
var _this = this;
|
|
return new Setter(function (f) { return _this.modify(f); });
|
|
};
|
|
/**
|
|
* compose a `Optional` with a `Optional`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Optional.prototype.compose = function (ab) {
|
|
return fromOptional(optional.compose(ab)(this));
|
|
};
|
|
/**
|
|
* Alias of `compose`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Optional.prototype.composeOptional = function (ab) {
|
|
return this.compose(ab);
|
|
};
|
|
/**
|
|
* compose an `Optional` with a `Traversal`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Optional.prototype.composeTraversal = function (ab) {
|
|
return fromTraversal((0, pipeable_1.pipe)(this, optional.asTraversal, traversal.compose(ab)));
|
|
};
|
|
/**
|
|
* compose an `Optional` with a `Fold`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Optional.prototype.composeFold = function (ab) {
|
|
return this.asFold().compose(ab);
|
|
};
|
|
/**
|
|
* compose an `Optional` with a `Setter`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Optional.prototype.composeSetter = function (ab) {
|
|
return this.asSetter().compose(ab);
|
|
};
|
|
/**
|
|
* compose an `Optional` with a `Lens`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Optional.prototype.composeLens = function (ab) {
|
|
return fromOptional((0, pipeable_1.pipe)(this, optional.compose((0, pipeable_1.pipe)(ab, lens.asOptional))));
|
|
};
|
|
/**
|
|
* compose an `Optional` with a `Prism`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Optional.prototype.composePrism = function (ab) {
|
|
return fromOptional((0, pipeable_1.pipe)(this, optional.compose((0, pipeable_1.pipe)(ab, prism.asOptional))));
|
|
};
|
|
/**
|
|
* compose an `Optional` with a `Iso`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Optional.prototype.composeIso = function (ab) {
|
|
return fromOptional((0, pipeable_1.pipe)(this, optional.compose((0, pipeable_1.pipe)(ab, iso.asOptional))));
|
|
};
|
|
/**
|
|
* compose an `Optional` with a `Getter`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Optional.prototype.composeGetter = function (ab) {
|
|
return this.asFold().compose(ab.asFold());
|
|
};
|
|
return Optional;
|
|
}());
|
|
exports.Optional = Optional;
|
|
/**
|
|
* @category constructor
|
|
* @since 1.0.0
|
|
*/
|
|
var Traversal = /** @class */ (function () {
|
|
function Traversal(
|
|
// Van Laarhoven representation
|
|
modifyF) {
|
|
this.modifyF = modifyF;
|
|
/**
|
|
* @since 1.0.0
|
|
*/
|
|
this._tag = 'Traversal';
|
|
}
|
|
/**
|
|
* @since 1.0.0
|
|
*/
|
|
Traversal.prototype.modify = function (f) {
|
|
return traversal.modify(f)(this);
|
|
};
|
|
/**
|
|
* @since 1.0.0
|
|
*/
|
|
Traversal.prototype.set = function (a) {
|
|
return traversal.set(a)(this);
|
|
};
|
|
Traversal.prototype.filter = function (predicate) {
|
|
return fromTraversal(traversal.filter(predicate)(this));
|
|
};
|
|
/**
|
|
* view a `Traversal` as a `Fold`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Traversal.prototype.asFold = function () {
|
|
var _this = this;
|
|
return new Fold(function (M) { return function (f) {
|
|
return _this.modifyF((0, Const_1.getApplicative)(M))(function (a) { return (0, Const_1.make)(f(a)); });
|
|
}; });
|
|
};
|
|
/**
|
|
* view a `Traversal` as a `Setter`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Traversal.prototype.asSetter = function () {
|
|
var _this = this;
|
|
return new Setter(function (f) { return _this.modify(f); });
|
|
};
|
|
/**
|
|
* compose a `Traversal` with a `Traversal`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Traversal.prototype.compose = function (ab) {
|
|
return fromTraversal(traversal.compose(ab)(this));
|
|
};
|
|
/**
|
|
* Alias of `compose`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Traversal.prototype.composeTraversal = function (ab) {
|
|
return this.compose(ab);
|
|
};
|
|
/**
|
|
* compose a `Traversal` with a `Fold`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Traversal.prototype.composeFold = function (ab) {
|
|
return this.asFold().compose(ab);
|
|
};
|
|
/**
|
|
* compose a `Traversal` with a `Setter`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Traversal.prototype.composeSetter = function (ab) {
|
|
return this.asSetter().compose(ab);
|
|
};
|
|
/**
|
|
* compose a `Traversal` with a `Optional`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Traversal.prototype.composeOptional = function (ab) {
|
|
return this.compose(ab.asTraversal());
|
|
};
|
|
/**
|
|
* compose a `Traversal` with a `Lens`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Traversal.prototype.composeLens = function (ab) {
|
|
return fromTraversal((0, pipeable_1.pipe)(this, traversal.compose((0, pipeable_1.pipe)(ab, lens.asTraversal))));
|
|
};
|
|
/**
|
|
* compose a `Traversal` with a `Prism`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Traversal.prototype.composePrism = function (ab) {
|
|
return fromTraversal((0, pipeable_1.pipe)(this, traversal.compose((0, pipeable_1.pipe)(ab, prism.asTraversal))));
|
|
};
|
|
/**
|
|
* compose a `Traversal` with a `Iso`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Traversal.prototype.composeIso = function (ab) {
|
|
return fromTraversal((0, pipeable_1.pipe)(this, traversal.compose((0, pipeable_1.pipe)(ab, iso.asTraversal))));
|
|
};
|
|
/**
|
|
* compose a `Traversal` with a `Getter`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Traversal.prototype.composeGetter = function (ab) {
|
|
return this.asFold().compose(ab.asFold());
|
|
};
|
|
return Traversal;
|
|
}());
|
|
exports.Traversal = Traversal;
|
|
/**
|
|
* @category constructor
|
|
* @since 1.2.0
|
|
*/
|
|
var At = /** @class */ (function () {
|
|
function At(at) {
|
|
this.at = at;
|
|
/**
|
|
* @since 1.0.0
|
|
*/
|
|
this._tag = 'At';
|
|
}
|
|
/**
|
|
* lift an instance of `At` using an `Iso`
|
|
*
|
|
* @since 1.2.0
|
|
*/
|
|
At.prototype.fromIso = function (iso) {
|
|
return fromAt(at.fromIso(iso)(this));
|
|
};
|
|
return At;
|
|
}());
|
|
exports.At = At;
|
|
/**
|
|
* @category constructor
|
|
* @since 1.2.0
|
|
*/
|
|
var Index = /** @class */ (function () {
|
|
function Index(index) {
|
|
this.index = index;
|
|
/**
|
|
* @since 1.0.0
|
|
*/
|
|
this._tag = 'Index';
|
|
}
|
|
/**
|
|
* @since 1.2.0
|
|
*/
|
|
Index.fromAt = function (at) {
|
|
return fromIndex(index.fromAt(at));
|
|
};
|
|
/**
|
|
* lift an instance of `Index` using an `Iso`
|
|
*
|
|
* @since 1.2.0
|
|
*/
|
|
Index.prototype.fromIso = function (iso) {
|
|
return fromIndex(index.fromIso(iso)(this));
|
|
};
|
|
return Index;
|
|
}());
|
|
exports.Index = Index;
|
|
/**
|
|
* @category constructor
|
|
* @since 1.0.0
|
|
*/
|
|
var Getter = /** @class */ (function () {
|
|
function Getter(get) {
|
|
this.get = get;
|
|
/**
|
|
* @since 1.0.0
|
|
*/
|
|
this._tag = 'Getter';
|
|
}
|
|
/**
|
|
* view a `Getter` as a `Fold`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Getter.prototype.asFold = function () {
|
|
var _this = this;
|
|
return new Fold(function () { return function (f) { return function (s) { return f(_this.get(s)); }; }; });
|
|
};
|
|
/**
|
|
* compose a `Getter` with a `Getter`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Getter.prototype.compose = function (ab) {
|
|
var _this = this;
|
|
return new Getter(function (s) { return ab.get(_this.get(s)); });
|
|
};
|
|
/**
|
|
* Alias of `compose`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Getter.prototype.composeGetter = function (ab) {
|
|
return this.compose(ab);
|
|
};
|
|
/**
|
|
* compose a `Getter` with a `Fold`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Getter.prototype.composeFold = function (ab) {
|
|
return this.asFold().compose(ab);
|
|
};
|
|
/**
|
|
* compose a `Getter` with a `Lens`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Getter.prototype.composeLens = function (ab) {
|
|
return this.compose(ab.asGetter());
|
|
};
|
|
/**
|
|
* compose a `Getter` with a `Iso`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Getter.prototype.composeIso = function (ab) {
|
|
return this.compose(ab.asGetter());
|
|
};
|
|
/**
|
|
* compose a `Getter` with a `Optional`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Getter.prototype.composeTraversal = function (ab) {
|
|
return this.asFold().compose(ab.asFold());
|
|
};
|
|
/**
|
|
* compose a `Getter` with a `Optional`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Getter.prototype.composeOptional = function (ab) {
|
|
return this.asFold().compose(ab.asFold());
|
|
};
|
|
/**
|
|
* compose a `Getter` with a `Prism`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Getter.prototype.composePrism = function (ab) {
|
|
return this.asFold().compose(ab.asFold());
|
|
};
|
|
return Getter;
|
|
}());
|
|
exports.Getter = Getter;
|
|
/**
|
|
* @category constructor
|
|
* @since 1.0.0
|
|
*/
|
|
var Fold = /** @class */ (function () {
|
|
function Fold(foldMap) {
|
|
this.foldMap = foldMap;
|
|
/**
|
|
* @since 1.0.0
|
|
*/
|
|
this._tag = 'Fold';
|
|
this.getAll = foldMap(A.getMonoid())(A.of);
|
|
this.exist = foldMap(Monoid_1.monoidAny);
|
|
this.all = foldMap(Monoid_1.monoidAll);
|
|
this.foldMapFirst = foldMap((0, Option_1.getFirstMonoid)());
|
|
}
|
|
/**
|
|
* compose a `Fold` with a `Fold`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Fold.prototype.compose = function (ab) {
|
|
var _this = this;
|
|
return new Fold(function (M) { return function (f) { return _this.foldMap(M)(ab.foldMap(M)(f)); }; });
|
|
};
|
|
/**
|
|
* Alias of `compose`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Fold.prototype.composeFold = function (ab) {
|
|
return this.compose(ab);
|
|
};
|
|
/**
|
|
* compose a `Fold` with a `Getter`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Fold.prototype.composeGetter = function (ab) {
|
|
return this.compose(ab.asFold());
|
|
};
|
|
/**
|
|
* compose a `Fold` with a `Traversal`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Fold.prototype.composeTraversal = function (ab) {
|
|
return this.compose(ab.asFold());
|
|
};
|
|
/**
|
|
* compose a `Fold` with a `Optional`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Fold.prototype.composeOptional = function (ab) {
|
|
return this.compose(ab.asFold());
|
|
};
|
|
/**
|
|
* compose a `Fold` with a `Lens`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Fold.prototype.composeLens = function (ab) {
|
|
return this.compose(ab.asFold());
|
|
};
|
|
/**
|
|
* compose a `Fold` with a `Prism`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Fold.prototype.composePrism = function (ab) {
|
|
return this.compose(ab.asFold());
|
|
};
|
|
/**
|
|
* compose a `Fold` with a `Iso`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Fold.prototype.composeIso = function (ab) {
|
|
return this.compose(ab.asFold());
|
|
};
|
|
Fold.prototype.find = function (p) {
|
|
return this.foldMapFirst((0, Option_1.fromPredicate)(p));
|
|
};
|
|
/**
|
|
* get the first target of a `Fold`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Fold.prototype.headOption = function (s) {
|
|
return this.find(function () { return true; })(s);
|
|
};
|
|
return Fold;
|
|
}());
|
|
exports.Fold = Fold;
|
|
/**
|
|
* @category constructor
|
|
* @since 1.0.0
|
|
*/
|
|
var Setter = /** @class */ (function () {
|
|
function Setter(modify) {
|
|
this.modify = modify;
|
|
/**
|
|
* @since 1.0.0
|
|
*/
|
|
this._tag = 'Setter';
|
|
}
|
|
/**
|
|
* @since 1.0.0
|
|
*/
|
|
Setter.prototype.set = function (a) {
|
|
return this.modify((0, function_1.constant)(a));
|
|
};
|
|
/**
|
|
* compose a `Setter` with a `Setter`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Setter.prototype.compose = function (ab) {
|
|
var _this = this;
|
|
return new Setter(function (f) { return _this.modify(ab.modify(f)); });
|
|
};
|
|
/**
|
|
* Alias of `compose`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Setter.prototype.composeSetter = function (ab) {
|
|
return this.compose(ab);
|
|
};
|
|
/**
|
|
* compose a `Setter` with a `Traversal`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Setter.prototype.composeTraversal = function (ab) {
|
|
return this.compose(ab.asSetter());
|
|
};
|
|
/**
|
|
* compose a `Setter` with a `Optional`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Setter.prototype.composeOptional = function (ab) {
|
|
return this.compose(ab.asSetter());
|
|
};
|
|
/**
|
|
* compose a `Setter` with a `Lens`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Setter.prototype.composeLens = function (ab) {
|
|
return this.compose(ab.asSetter());
|
|
};
|
|
/**
|
|
* compose a `Setter` with a `Prism`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Setter.prototype.composePrism = function (ab) {
|
|
return this.compose(ab.asSetter());
|
|
};
|
|
/**
|
|
* compose a `Setter` with a `Iso`
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
Setter.prototype.composeIso = function (ab) {
|
|
return this.compose(ab.asSetter());
|
|
};
|
|
return Setter;
|
|
}());
|
|
exports.Setter = Setter;
|
|
function fromTraversable(T) {
|
|
var f = traversal.fromTraversable(T);
|
|
return function () { return fromTraversal(f()); };
|
|
}
|
|
exports.fromTraversable = fromTraversable;
|
|
function fromFoldable(F) {
|
|
return function () {
|
|
return new Fold(function (M) {
|
|
var foldMapFM = F.foldMap(M);
|
|
return function (f) { return function (s) { return foldMapFM(s, f); }; };
|
|
});
|
|
};
|
|
}
|
|
exports.fromFoldable = fromFoldable;
|