
one.xingyi.optics.IISO Maven / Gradle / Ivy
package one.xingyi.optics;
import one.xingyi.tuples.Tuple2;
import java.util.function.Function;
public interface IISO extends ILens {
static IISO of(Function get, Function reverseGet) {
return new Iso<>(get, reverseGet);
}
static IISO identity() {
return new Iso<>(t -> t, t -> t);
}
Child get(Main main);
Main reverseGet(Child child);
ILens chainIso(IISO t);
}
abstract class AbstractIso extends AbstractLens implements IISO {
@Override
public Main set(Main main, Child child) {
return reverseGet(child);
}
@Override
public ILens chainIso(IISO t) {
return new Iso<>(
main -> t.get(get(main)),
grandChild -> reverseGet(t.reverseGet(grandChild))
);
}
@Override
public ILens merge(ILens other, IISO, Merged> iso) {
return new Lens<>(main -> iso.get(Tuple2.of(get(main), other.get(main))),
(main, merged) -> {
Tuple2 tuple2 = iso.reverseGet(merged);
return set(other.set(main, tuple2.t2), tuple2.t1);
});
}
}
class Iso extends AbstractIso {
protected final Function get;
protected final Function reverseGet;
Iso(Function get, Function reverseGet) {
this.get = get;
this.reverseGet = reverseGet;
}
@Override
public Main reverseGet(Child child) {
return reverseGet.apply(child);
}
@Override
public Child get(Main main) {
return get.apply(main);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy