unregister<T extends Object> method

Resolvable<Option<T>> unregister<T extends Object>({
  1. Entity groupEntity = const DefaultEntity(),
  2. bool traverse = true,
  3. bool removeAll = true,
  4. bool triggerOnUnregisterCallbacks = true,
})
inherited

Unregisters a dependency.

Implementation

Resolvable<Option<T>> unregister<T extends Object>({
  Entity groupEntity = const DefaultEntity(),
  bool traverse = true,
  bool removeAll = true,
  bool triggerOnUnregisterCallbacks = true,
}) {
  assert(T != Object, 'T must be specified and cannot be Object.');
  final g = groupEntity.preferOverDefault(focusGroup);
  for (final di in [this as DI, ...parents]) {
    final dependencyOption = di.removeDependency<T>(groupEntity: g);
    if (dependencyOption.isNone()) {
      continue;
    }
    UNSAFE:
    if (triggerOnUnregisterCallbacks) {
      final dependency = dependencyOption.unwrap();
      final metadataOption = dependency.metadata;
      if (metadataOption.isSome()) {
        final metadata = metadataOption.unwrap();
        final onUnregisterOption = metadata.onUnregister;
        if (onUnregisterOption.isSome()) {
          final onUnregister = onUnregisterOption.unwrap();
          return dependency.value.map((e) {
            return Resolvable(() {
              return consec(
                onUnregister(Ok(e)),
                (_) => Some(e).transf<T>().unwrap(),
              );
            });
          }).flatten();
        }
      }
    }
    if (!removeAll) {
      break;
    }
  }
  return Sync.okValue(None<T>());
}