register<T extends Object> method

Resolvable<T> register<T extends Object>(
  1. FutureOr<T> value, {
  2. TOnRegisterCallback<T>? onRegister,
  3. TOnUnregisterCallback<T>? onUnregister,
  4. Entity groupEntity = const DefaultEntity(),
  5. bool enableUntilExactlyK = false,
})
inherited

Registers a dependency with the container.

Implementation

Resolvable<T> register<T extends Object>(
  FutureOr<T> value, {
  TOnRegisterCallback<T>? onRegister,
  TOnUnregisterCallback<T>? onUnregister,
  Entity groupEntity = const DefaultEntity(),
  bool enableUntilExactlyK = false,
}) {
  assert(T != Object, 'T must be specified and cannot be Object.');
  final g = groupEntity.preferOverDefault(focusGroup);
  final metadata = DependencyMetadata(
    index: Some(_indexIncrementer++),
    groupEntity: g,
    onUnregister: onUnregister != null
        ? Some((e) => onUnregister(e.transf()))
        : const None(),
  );
  final a = Resolvable(
    () => consec(value, (e) => consec(onRegister?.call(e), (_) => e)),
  );
  final b = registerDependency<T>(
    dependency: Dependency(a, metadata: Some(metadata)),
    checkExisting: true,
  );
  UNSAFE:
  {
    if (b.isErr()) {
      return Sync.err(b.err().unwrap().transfErr<T>());
    }
    if (value is! ReservedSafeCompleter<T>) {
      // Used for until.
      // NOTE: CHANGED FROM T TO Object so that it attems to finish ANY ReservedSafeFinisher!
      _maybeFinish<Object>(value: value, g: g);

      // Used for untilT and untilK. Disabled by default to improve performance.
      if (enableUntilExactlyK) {
        (this as SupportsMixinK).maybeFinishK<T>(g: g);
      }
    }
    return get<T>(groupEntity: groupEntity).unwrap();
  }
}