package io.gitlab.jfronny.modsmod.util; import org.jetbrains.annotations.NotNull; import java.util.*; import java.util.function.Consumer; public class IteratorCallbackList implements List { private final List containers; private final Consumer> reset; private final Runnable callback; boolean modified = false; public IteratorCallbackList(List base, Consumer> reset, Runnable callback) { containers = Collections.synchronizedList(base); this.reset = reset; this.callback = callback; } @Override public int size() { return containers.size(); } @Override public boolean isEmpty() { return containers.isEmpty(); } @Override public boolean contains(Object o) { return containers.contains(o); } @NotNull @Override public Iterator iterator() { if (!modified) { callback.run(); modified = true; } reset.accept(containers); return containers.iterator(); } @NotNull @Override public Object[] toArray() { return containers.toArray(); } @NotNull @Override public T[] toArray(@NotNull T[] ts) { return containers.toArray(ts); } @Override public boolean add(T modContainer) { return containers.add(modContainer); } @Override public boolean remove(Object o) { return containers.remove(o); } @Override public boolean containsAll(@NotNull Collection collection) { return containers.containsAll(collection); } @Override public boolean addAll(@NotNull Collection collection) { return containers.addAll(collection); } @Override public boolean addAll(int i, @NotNull Collection collection) { return containers.addAll(i, collection); } @Override public boolean removeAll(@NotNull Collection collection) { return containers.removeAll(collection); } @Override public boolean retainAll(@NotNull Collection collection) { return containers.retainAll(collection); } @Override public void clear() { containers.clear(); } @Override public T get(int i) { return containers.get(i); } @Override public T set(int i, T modContainer) { return containers.set(i, modContainer); } @Override public void add(int i, T modContainer) { containers.add(i, modContainer); } @Override public T remove(int i) { return containers.remove(i); } @Override public int indexOf(Object o) { return containers.indexOf(o); } @Override public int lastIndexOf(Object o) { return containers.lastIndexOf(o); } @NotNull @Override public ListIterator listIterator() { return containers.listIterator(); } @NotNull @Override public ListIterator listIterator(int i) { return containers.listIterator(i); } @NotNull @Override public List subList(int i, int i1) { return containers.subList(i, i1); } }