evict method
Removes an entity and every reference to it (list elements are dropped, object fields become missing so they are re-fetched on next read).
Implementation
@override
Set<String> evict(String key) {
final touched = <String>{};
final removed = _entities.remove(key);
_depKeys.remove(key);
if (removed == null) return touched;
_markRemoved(key);
for (final e in removed.entries) {
final dep = depKey(key, e.key);
touched.add(dep);
_fetchedAt.remove(dep);
final value = e.value;
if (value is List<Object?>) _touchList(key, e.key, value, 0, touched);
}
_listDepKeys.remove(key);
final ref = Ref(key);
for (final e in _entities.entries) {
var scrubbed = false;
for (final field in e.value.keys.toList()) {
final value = e.value[field];
if (value == ref) {
e.value.remove(field);
touched.add(depKey(e.key, field));
scrubbed = true;
} else {
final length = value is List ? value.length : 0;
if (!_scrub(value, ref)) continue;
touched.add(depKey(e.key, field));
scrubbed = true;
if (length > 0) {
// Elements shifted or changed inside: all of them, to be safe.
final keys = _listDeps(e.key, field);
touched.add(keys.length);
for (var i = 0; i < length; i++) {
touched.add(keys.element(i));
}
}
}
}
if (scrubbed) _markChanged(e.key);
}
_emit(touched);
return touched;
}