monocle-ts-esm
Version:
A porting of scala monocle library to TypeScript
1,302 lines (1,301 loc) • 30.1 kB
JavaScript
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
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
*/
const A = __importStar(require("fp-ts-esm/Array"));
const Const_1 = require("fp-ts-esm/Const");
const function_1 = require("fp-ts-esm/function");
const Monoid_1 = require("fp-ts-esm/Monoid");
const Option_1 = require("fp-ts-esm/Option");
const pipeable_1 = require("fp-ts-esm/pipeable");
const at = __importStar(require("./At.js"));
exports.at = at;
const iso = __importStar(require("./Iso.js"));
exports.iso = iso;
const index = __importStar(require("./Ix.js"));
exports.index = index;
const lens = __importStar(require("./Lens.js"));
exports.lens = lens;
const optional = __importStar(require("./Optional.js"));
exports.optional = optional;
const prism = __importStar(require("./Prism.js"));
exports.prism = prism;
const traversal = __importStar(require("./Traversal.js"));
exports.traversal = traversal;
//
// compat
//
const fromIso = (iso) => new Iso(iso.get, iso.reverseGet);
const fromLens = (lens) => new Lens(lens.get, lens.set);
const fromPrism = (prism) => new Prism(prism.getOption, prism.reverseGet);
const fromOptional = (optional) => new Optional(optional.getOption, optional.set);
const fromTraversal = (traversal) => new Traversal(traversal.modifyF);
const fromAt = (at) => new At((i) => fromLens(at.at(i)));
const fromIndex = (ix) => new Index((i) => fromOptional(ix.index(i)));
//
// old APIs
//
const update = (o, k, a) => {
return a === o[k] ? o : Object.assign({}, o, { [k]: a });
};
/**
* Laws:
* 1. `reverseGet(get(s)) = s`
* 2. `get(reversetGet(a)) = a`
*
* @category constructor
* @since 1.0.0
*/
class Iso {
constructor(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
*/
reverse() {
return fromIso(iso.reverse(this));
}
/**
* @since 1.0.0
*/
modify(f) {
return iso.modify(f)(this);
}
/**
* view an `Iso` as a `Lens`
*
* @since 1.0.0
*/
asLens() {
return fromLens(iso.asLens(this));
}
/**
* view an `Iso` as a `Prism`
*
* @since 1.0.0
*/
asPrism() {
return fromPrism(iso.asPrism(this));
}
/**
* view an `Iso` as a `Optional`
*
* @since 1.0.0
*/
asOptional() {
return fromOptional(iso.asOptional(this));
}
/**
* view an `Iso` as a `Traversal`
*
* @since 1.0.0
*/
asTraversal() {
return fromTraversal(iso.asTraversal(this));
}
/**
* view an `Iso` as a `Fold`
*
* @since 1.0.0
*/
asFold() {
return new Fold(() => (f) => (s) => f(this.get(s)));
}
/**
* view an `Iso` as a `Getter`
*
* @since 1.0.0
*/
asGetter() {
return new Getter((s) => this.get(s));
}
/**
* view an `Iso` as a `Setter`
*
* @since 1.0.0
*/
asSetter() {
return new Setter((f) => this.modify(f));
}
/**
* compose an `Iso` with an `Iso`
*
* @since 1.0.0
*/
compose(ab) {
return fromIso(iso.compose(ab)(this));
}
/**
* Alias of `compose`
*
* @since 1.0.0
*/
composeIso(ab) {
return this.compose(ab);
}
/**
* compose an `Iso` with a `Lens `
*
* @since 1.0.0
*/
composeLens(ab) {
return fromLens((0, pipeable_1.pipe)(this, iso.asLens, lens.compose(ab)));
}
/**
* compose an `Iso` with a `Prism`
*
* @since 1.0.0
*/
composePrism(ab) {
return fromPrism((0, pipeable_1.pipe)(this, iso.asPrism, prism.compose(ab)));
}
/**
* compose an `Iso` with an `Optional`
*
* @since 1.0.0
*/
composeOptional(ab) {
return fromOptional((0, pipeable_1.pipe)(this, iso.asOptional, optional.compose(ab)));
}
/**
* compose an `Iso` with a `Traversal`
*
* @since 1.0.0
*/
composeTraversal(ab) {
return fromTraversal((0, pipeable_1.pipe)(this, iso.asTraversal, traversal.compose(ab)));
}
/**
* compose an `Iso` with a `Fold`
*
* @since 1.0.0
*/
composeFold(ab) {
return this.asFold().compose(ab);
}
/**
* compose an `Iso` with a `Getter`
*
* @since 1.0.0
*/
composeGetter(ab) {
return this.asGetter().compose(ab);
}
/**
* compose an `Iso` with a `Setter`
*
* @since 1.0.0
*/
composeSetter(ab) {
return this.asSetter().compose(ab);
}
}
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
*/
class Lens {
constructor(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
*/
static fromPath() {
const fromProp = Lens.fromProp();
return (path) => {
const lens = fromProp(path[0]);
return path.slice(1).reduce((acc, prop) => 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
*/
static fromProp() {
return (prop) => fromLens((0, pipeable_1.pipe)(lens.id(), lens.prop(prop)));
}
static fromProps() {
return (props) => fromLens((0, pipeable_1.pipe)(lens.id(), lens.props(...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
*/
static fromNullableProp() {
return (k, defaultValue) => new Lens((s) => {
const osk = (0, Option_1.fromNullable)(s[k]);
if ((0, Option_1.isNone)(osk)) {
return defaultValue;
}
else {
return osk.value;
}
}, (a) => (s) => update(s, k, a));
}
/**
* @since 1.0.0
*/
modify(f) {
return lens.modify(f)(this);
}
/**
* view a `Lens` as a Optional
*
* @since 1.0.0
*/
asOptional() {
return fromOptional(lens.asOptional(this));
}
/**
* view a `Lens` as a `Traversal`
*
* @since 1.0.0
*/
asTraversal() {
return fromTraversal(lens.asTraversal(this));
}
/**
* view a `Lens` as a `Setter`
*
* @since 1.0.0
*/
asSetter() {
return new Setter((f) => this.modify(f));
}
/**
* view a `Lens` as a `Getter`
*
* @since 1.0.0
*/
asGetter() {
return new Getter((s) => this.get(s));
}
/**
* view a `Lens` as a `Fold`
*
* @since 1.0.0
*/
asFold() {
return new Fold(() => (f) => (s) => f(this.get(s)));
}
/**
* compose a `Lens` with a `Lens`
*
* @since 1.0.0
*/
compose(ab) {
return fromLens(lens.compose(ab)(this));
}
/**
* Alias of `compose`
*
* @since 1.0.0
*/
composeLens(ab) {
return this.compose(ab);
}
/**
* compose a `Lens` with a `Getter`
*
* @since 1.0.0
*/
composeGetter(ab) {
return this.asGetter().compose(ab);
}
/**
* compose a `Lens` with a `Fold`
*
* @since 1.0.0
*/
composeFold(ab) {
return this.asFold().compose(ab);
}
/**
* compose a `Lens` with an `Optional`
*
* @since 1.0.0
*/
composeOptional(ab) {
return fromOptional((0, pipeable_1.pipe)(this, lens.asOptional, optional.compose(ab)));
}
/**
* compose a `Lens` with an `Traversal`
*
* @since 1.0.0
*/
composeTraversal(ab) {
return fromTraversal((0, pipeable_1.pipe)(this, lens.asTraversal, traversal.compose(ab)));
}
/**
* compose a `Lens` with an `Setter`
*
* @since 1.0.0
*/
composeSetter(ab) {
return this.asSetter().compose(ab);
}
/**
* compose a `Lens` with an `Iso`
*
* @since 1.0.0
*/
composeIso(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
*/
composePrism(ab) {
return fromOptional(lens.composePrism(ab)(this));
}
}
exports.Lens = Lens;
/**
* Laws:
* 1. `pipe(getOption(s), fold(() => s, reverseGet)) = s`
* 2. `getOption(reverseGet(a)) = some(a)`
*
* @category constructor
* @since 1.0.0
*/
class Prism {
constructor(getOption, reverseGet) {
this.getOption = getOption;
this.reverseGet = reverseGet;
/**
* @since 1.0.0
*/
this._tag = 'Prism';
}
static fromPredicate(predicate) {
return fromPrism(prism.fromPredicate(predicate));
}
/**
* @since 1.0.0
*/
static some() {
return somePrism;
}
/**
* @since 1.0.0
*/
modify(f) {
return (s) => {
const os = this.modifyOption(f)(s);
if ((0, Option_1.isNone)(os)) {
return s;
}
else {
return os.value;
}
};
}
/**
* @since 1.0.0
*/
modifyOption(f) {
return (s) => Option_1.option.map(this.getOption(s), (v) => {
// @ts-expect-error
const n = f(v);
return n === v ? s : this.reverseGet(n);
});
}
/**
* set the target of a `Prism` with a value
*
* @since 1.0.0
*/
set(a) {
return this.modify(() => a);
}
/**
* view a `Prism` as a `Optional`
*
* @since 1.0.0
*/
asOptional() {
return fromOptional(prism.asOptional(this));
}
/**
* view a `Prism` as a `Traversal`
*
* @since 1.0.0
*/
asTraversal() {
return fromTraversal(prism.asTraversal(this));
}
/**
* view a `Prism` as a `Setter`
*
* @since 1.0.0
*/
asSetter() {
return new Setter((f) => this.modify(f));
}
/**
* view a `Prism` as a `Fold`
*
* @since 1.0.0
*/
asFold() {
return new Fold((M) => (f) => (s) => {
const 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
*/
compose(ab) {
return fromPrism(prism.compose(ab)(this));
}
/**
* Alias of `compose`
*
* @since 1.0.0
*/
composePrism(ab) {
return this.compose(ab);
}
/**
* compose a `Prism` with a `Optional`
*
* @since 1.0.0
*/
composeOptional(ab) {
return fromOptional((0, pipeable_1.pipe)(this, prism.asOptional, optional.compose(ab)));
}
/**
* compose a `Prism` with a `Traversal`
*
* @since 1.0.0
*/
composeTraversal(ab) {
return fromTraversal((0, pipeable_1.pipe)(this, prism.asTraversal, traversal.compose(ab)));
}
/**
* compose a `Prism` with a `Fold`
*
* @since 1.0.0
*/
composeFold(ab) {
return this.asFold().compose(ab);
}
/**
* compose a `Prism` with a `Setter`
*
* @since 1.0.0
*/
composeSetter(ab) {
return this.asSetter().compose(ab);
}
/**
* compose a `Prism` with a `Iso`
*
* @since 1.0.0
*/
composeIso(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
*/
composeLens(ab) {
return fromOptional(prism.composeLens(ab)(this));
}
/**
* compose a `Prism` with a `Getter`
*
* @since 1.0.0
*/
composeGetter(ab) {
return this.asFold().compose(ab.asFold());
}
}
exports.Prism = Prism;
const 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
*/
class Optional {
constructor(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
*/
static fromPath() {
const fromNullableProp = Optional.fromNullableProp();
return (path) => {
const optional = fromNullableProp(path[0]);
return path.slice(1).reduce((acc, prop) => 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
*/
static fromNullableProp() {
return (k) => new Optional((s) => (0, Option_1.fromNullable)(s[k]), (a) => (s) => (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
*/
static fromOptionProp() {
const formProp = Lens.fromProp();
return (prop) => formProp(prop).composePrism(somePrism);
}
/**
* @since 1.0.0
*/
modify(f) {
return optional.modify(f)(this);
}
/**
* @since 1.0.0
*/
modifyOption(f) {
return optional.modifyOption(f)(this);
}
/**
* view a `Optional` as a `Traversal`
*
* @since 1.0.0
*/
asTraversal() {
return fromTraversal(optional.asTraversal(this));
}
/**
* view an `Optional` as a `Fold`
*
* @since 1.0.0
*/
asFold() {
return new Fold((M) => (f) => (s) => {
const 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
*/
asSetter() {
return new Setter((f) => this.modify(f));
}
/**
* compose a `Optional` with a `Optional`
*
* @since 1.0.0
*/
compose(ab) {
return fromOptional(optional.compose(ab)(this));
}
/**
* Alias of `compose`
*
* @since 1.0.0
*/
composeOptional(ab) {
return this.compose(ab);
}
/**
* compose an `Optional` with a `Traversal`
*
* @since 1.0.0
*/
composeTraversal(ab) {
return fromTraversal((0, pipeable_1.pipe)(this, optional.asTraversal, traversal.compose(ab)));
}
/**
* compose an `Optional` with a `Fold`
*
* @since 1.0.0
*/
composeFold(ab) {
return this.asFold().compose(ab);
}
/**
* compose an `Optional` with a `Setter`
*
* @since 1.0.0
*/
composeSetter(ab) {
return this.asSetter().compose(ab);
}
/**
* compose an `Optional` with a `Lens`
*
* @since 1.0.0
*/
composeLens(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
*/
composePrism(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
*/
composeIso(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
*/
composeGetter(ab) {
return this.asFold().compose(ab.asFold());
}
}
exports.Optional = Optional;
/**
* @category constructor
* @since 1.0.0
*/
class Traversal {
constructor(
// Van Laarhoven representation
modifyF) {
this.modifyF = modifyF;
/**
* @since 1.0.0
*/
this._tag = 'Traversal';
}
/**
* @since 1.0.0
*/
modify(f) {
return traversal.modify(f)(this);
}
/**
* @since 1.0.0
*/
set(a) {
return traversal.set(a)(this);
}
filter(predicate) {
return fromTraversal(traversal.filter(predicate)(this));
}
/**
* view a `Traversal` as a `Fold`
*
* @since 1.0.0
*/
asFold() {
return new Fold((M) => (f) => this.modifyF((0, Const_1.getApplicative)(M))((a) => (0, Const_1.make)(f(a))));
}
/**
* view a `Traversal` as a `Setter`
*
* @since 1.0.0
*/
asSetter() {
return new Setter((f) => this.modify(f));
}
/**
* compose a `Traversal` with a `Traversal`
*
* @since 1.0.0
*/
compose(ab) {
return fromTraversal(traversal.compose(ab)(this));
}
/**
* Alias of `compose`
*
* @since 1.0.0
*/
composeTraversal(ab) {
return this.compose(ab);
}
/**
* compose a `Traversal` with a `Fold`
*
* @since 1.0.0
*/
composeFold(ab) {
return this.asFold().compose(ab);
}
/**
* compose a `Traversal` with a `Setter`
*
* @since 1.0.0
*/
composeSetter(ab) {
return this.asSetter().compose(ab);
}
/**
* compose a `Traversal` with a `Optional`
*
* @since 1.0.0
*/
composeOptional(ab) {
return this.compose(ab.asTraversal());
}
/**
* compose a `Traversal` with a `Lens`
*
* @since 1.0.0
*/
composeLens(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
*/
composePrism(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
*/
composeIso(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
*/
composeGetter(ab) {
return this.asFold().compose(ab.asFold());
}
}
exports.Traversal = Traversal;
/**
* @category constructor
* @since 1.2.0
*/
class At {
constructor(at) {
this.at = at;
/**
* @since 1.0.0
*/
this._tag = 'At';
}
/**
* lift an instance of `At` using an `Iso`
*
* @since 1.2.0
*/
fromIso(iso) {
return fromAt(at.fromIso(iso)(this));
}
}
exports.At = At;
/**
* @category constructor
* @since 1.2.0
*/
class Index {
constructor(index) {
this.index = index;
/**
* @since 1.0.0
*/
this._tag = 'Index';
}
/**
* @since 1.2.0
*/
static fromAt(at) {
return fromIndex(index.fromAt(at));
}
/**
* lift an instance of `Index` using an `Iso`
*
* @since 1.2.0
*/
fromIso(iso) {
return fromIndex(index.fromIso(iso)(this));
}
}
exports.Index = Index;
/**
* @category constructor
* @since 1.0.0
*/
class Getter {
constructor(get) {
this.get = get;
/**
* @since 1.0.0
*/
this._tag = 'Getter';
}
/**
* view a `Getter` as a `Fold`
*
* @since 1.0.0
*/
asFold() {
return new Fold(() => (f) => (s) => f(this.get(s)));
}
/**
* compose a `Getter` with a `Getter`
*
* @since 1.0.0
*/
compose(ab) {
return new Getter((s) => ab.get(this.get(s)));
}
/**
* Alias of `compose`
*
* @since 1.0.0
*/
composeGetter(ab) {
return this.compose(ab);
}
/**
* compose a `Getter` with a `Fold`
*
* @since 1.0.0
*/
composeFold(ab) {
return this.asFold().compose(ab);
}
/**
* compose a `Getter` with a `Lens`
*
* @since 1.0.0
*/
composeLens(ab) {
return this.compose(ab.asGetter());
}
/**
* compose a `Getter` with a `Iso`
*
* @since 1.0.0
*/
composeIso(ab) {
return this.compose(ab.asGetter());
}
/**
* compose a `Getter` with a `Optional`
*
* @since 1.0.0
*/
composeTraversal(ab) {
return this.asFold().compose(ab.asFold());
}
/**
* compose a `Getter` with a `Optional`
*
* @since 1.0.0
*/
composeOptional(ab) {
return this.asFold().compose(ab.asFold());
}
/**
* compose a `Getter` with a `Prism`
*
* @since 1.0.0
*/
composePrism(ab) {
return this.asFold().compose(ab.asFold());
}
}
exports.Getter = Getter;
/**
* @category constructor
* @since 1.0.0
*/
class Fold {
constructor(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
*/
compose(ab) {
return new Fold((M) => (f) => this.foldMap(M)(ab.foldMap(M)(f)));
}
/**
* Alias of `compose`
*
* @since 1.0.0
*/
composeFold(ab) {
return this.compose(ab);
}
/**
* compose a `Fold` with a `Getter`
*
* @since 1.0.0
*/
composeGetter(ab) {
return this.compose(ab.asFold());
}
/**
* compose a `Fold` with a `Traversal`
*
* @since 1.0.0
*/
composeTraversal(ab) {
return this.compose(ab.asFold());
}
/**
* compose a `Fold` with a `Optional`
*
* @since 1.0.0
*/
composeOptional(ab) {
return this.compose(ab.asFold());
}
/**
* compose a `Fold` with a `Lens`
*
* @since 1.0.0
*/
composeLens(ab) {
return this.compose(ab.asFold());
}
/**
* compose a `Fold` with a `Prism`
*
* @since 1.0.0
*/
composePrism(ab) {
return this.compose(ab.asFold());
}
/**
* compose a `Fold` with a `Iso`
*
* @since 1.0.0
*/
composeIso(ab) {
return this.compose(ab.asFold());
}
find(p) {
return this.foldMapFirst((0, Option_1.fromPredicate)(p));
}
/**
* get the first target of a `Fold`
*
* @since 1.0.0
*/
headOption(s) {
return this.find(() => true)(s);
}
}
exports.Fold = Fold;
/**
* @category constructor
* @since 1.0.0
*/
class Setter {
constructor(modify) {
this.modify = modify;
/**
* @since 1.0.0
*/
this._tag = 'Setter';
}
/**
* @since 1.0.0
*/
set(a) {
return this.modify((0, function_1.constant)(a));
}
/**
* compose a `Setter` with a `Setter`
*
* @since 1.0.0
*/
compose(ab) {
return new Setter((f) => this.modify(ab.modify(f)));
}
/**
* Alias of `compose`
*
* @since 1.0.0
*/
composeSetter(ab) {
return this.compose(ab);
}
/**
* compose a `Setter` with a `Traversal`
*
* @since 1.0.0
*/
composeTraversal(ab) {
return this.compose(ab.asSetter());
}
/**
* compose a `Setter` with a `Optional`
*
* @since 1.0.0
*/
composeOptional(ab) {
return this.compose(ab.asSetter());
}
/**
* compose a `Setter` with a `Lens`
*
* @since 1.0.0
*/
composeLens(ab) {
return this.compose(ab.asSetter());
}
/**
* compose a `Setter` with a `Prism`
*
* @since 1.0.0
*/
composePrism(ab) {
return this.compose(ab.asSetter());
}
/**
* compose a `Setter` with a `Iso`
*
* @since 1.0.0
*/
composeIso(ab) {
return this.compose(ab.asSetter());
}
}
exports.Setter = Setter;
function fromTraversable(T) {
const f = traversal.fromTraversable(T);
return () => fromTraversal(f());
}
exports.fromTraversable = fromTraversable;
function fromFoldable(F) {
return () => new Fold((M) => {
const foldMapFM = F.foldMap(M);
return (f) => (s) => foldMapFM(s, f);
});
}
exports.fromFoldable = fromFoldable;