All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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