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) {
List<String>? scrubbed;
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 ??= []).add(field);
} else {
final length = value is List ? value.length : 0;
if (!_scrub(value, ref)) continue;
touched.add(depKey(e.key, field));
(scrubbed ??= []).add(field);
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 != null) {
for (final field in scrubbed) {
_markChanged(e.key, field);
}
}
}
_emit(touched);
return touched;
}