package org.andork.bind2; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Objects; public class ListBinder<T> extends Binder<List<T>> implements Binding { private final List<Link<T>> modifiableLinks; public final List<Link<T>> links; private final List<T> values; private final List<T> unmodifiableValues; public ListBinder(Collection<? extends Binder<? extends T>> inputs) { this(inputs.size()); int i = 0; for (Binder<? extends T> input : inputs) { links.get(i++).bind(input); } } public ListBinder(int length) { modifiableLinks = new ArrayList<>(length); links = Collections.unmodifiableList(modifiableLinks); values = new ArrayList<>(length); unmodifiableValues = Collections.unmodifiableList(values); for (int i = 0; i < length; i++) { modifiableLinks.add(new Link<>(this)); values.add(null); } } @Override public List<T> get() { return unmodifiableValues; } @Override public void update(boolean force) { boolean changed = false; for (int i = 0; i < links.size(); i++) { T oldValue = values.get(i); T newValue = links.get(i).get(); if (!Objects.equals(oldValue, newValue)) { changed = true; values.set(i, newValue); } } if (changed || force) { updateBindings(force); } } }