evict method

  1. @override
Set<String> evict(
  1. String key
)
override

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;
}