diff options
| author | Ben Culkin <scorpress@gmail.com> | 2022-10-08 14:47:21 -0400 |
|---|---|---|
| committer | Ben Culkin <scorpress@gmail.com> | 2022-10-08 14:47:21 -0400 |
| commit | 0f958b08b3446a866418aa485bb60c208d952033 (patch) | |
| tree | 2a54b64036bacb2f1fbc60d17511eb904b15fe7d /src/main/java/bjc/optics/Lens.java | |
| parent | 08885862bee89602d7edc55144ea9b6af780bfa4 (diff) | |
Add a whole bunch of Optics
This adds a whole bunch of types/functions related to optics. With this
batch, I've mainly gone for the concrete representation types, instead
of var Laarhoven or profunctor representations.
The concrete ones require less infrastructure, though they are not as
easy to compose
There's also a number of misc. things in here
Diffstat (limited to 'src/main/java/bjc/optics/Lens.java')
| -rw-r--r-- | src/main/java/bjc/optics/Lens.java | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/src/main/java/bjc/optics/Lens.java b/src/main/java/bjc/optics/Lens.java new file mode 100644 index 0000000..be10eef --- /dev/null +++ b/src/main/java/bjc/optics/Lens.java @@ -0,0 +1,68 @@ +/* + * esodata - data structures and other things, of varying utility + * Copyright 2022, Ben Culkin + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ +package bjc.optics; + +import java.util.function.Function; +import java.util.function.UnaryOperator; + +import bjc.typeclasses.BiContainer; + +/** + * A type-invariant var Laarhoven lens. + * + * @author bjcul + * + * @param <Whole> The item this lens can focus on + * @param <Part> The field this lens focuses on + */ +public interface Lens<Whole, Part> extends LensX<Whole, Whole, Part, Part>, BiContainer<Whole, Part, Lens<Whole, Part>> { + /** + * Modify a given whole using an operation + * + * @param source The whole to modify. + * @param mod The operation to use for modifying a part + * + * @return A modified whole + */ + default Whole modify(Whole source, UnaryOperator<Part> mod) { + return set(source, mod.apply(get(source))); + } + + /** + * Create a function which sets the part of a given whole. + * + * @param part The part to set + * + * @return A function that sets the given part on a whole. + */ + default Function<Whole, Whole> setting(Part part) { + return (whole) -> set(whole, part); + } + + /** + * Lift a function that modifies parts to one that modifies wholes. + * + * @param f The function which operates on parts + * + * @return A corresponding function which applies the given modification to a part. + */ + default Function<Whole, Whole> lift(UnaryOperator<Part> f) { + // modify will be more efficient for some lenses + return (whole) -> modify(whole, f); + } +} |
