UNPKG

monocle-ts-esm

Version:

A porting of scala monocle library to TypeScript

1,302 lines (1,301 loc) 30.1 kB
"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;