package org.andork.tracker.model;
import org.andork.collect.HashSetMultiMap;
import org.andork.collect.MultiMap;
import org.andork.tracker.Computation;
import org.andork.tracker.Dependency;
import org.andork.tracker.Tracker;
public class KeyedDependency<K> {
final Dependency allDependency = new Dependency();
final MultiMap<K, Computation> dependents = new HashSetMultiMap<>();
public void changed() {
allDependency.changed();
for (Computation comp : dependents.values()) {
comp.invalidate();
}
}
public void changed(K key) {
allDependency.changed();
for (Computation comp : dependents.get(key)) {
comp.invalidate();
}
}
public boolean depend() {
return allDependency.depend();
}
public boolean depend(K key) {
return depend(key, Tracker.currentComputation());
}
public boolean depend(K key, Computation comp) {
if (!Tracker.isActive()) {
return false;
}
if (this.dependents.put(key, comp)) {
comp.onInvalidate(() -> dependents.remove(key, comp));
return true;
}
return false;
}
public boolean hasDependents(K key) {
return !dependents.get(key).isEmpty();
}
}