package com.codepoetics.octarine.functional.tuples; import com.codepoetics.octarine.functional.lenses.Lens; import com.codepoetics.octarine.functional.paths.Path; import java.util.Optional; import java.util.function.BiFunction; import java.util.function.Function; public interface TupleLens<T, V> extends Lens<T, V>, Path<T, V> { static <T, V> TupleLens<T, V> of(int index, Function<? super T, ? extends V> getter, BiFunction<? super T, ? super V, ? extends T> setter) { return new TupleLens<T, V>() { @Override public V get(T instance) { return getter.apply(instance); } @Override public T set(T instance, V newValue) { return setter.apply(instance, newValue); } @Override public void describe(StringBuilder sb) { sb.append("[").append(index).append("]"); } }; } default Optional<V> apply(T t) { return Optional.of(get(t)); } }