until<TSuper extends Object, TSub extends TSuper> method

Resolvable<TSub> until<TSuper extends Object, TSub extends TSuper>({
  1. Entity groupEntity = const DefaultEntity(),
  2. bool traverse = true,
})
inherited

Waits until a dependency of type TSuper or its subtype TSub is registered. TSuper should typically be the most general type expected.

Implementation

Resolvable<TSub> until<TSuper extends Object, TSub extends TSuper>({
  Entity groupEntity = const DefaultEntity(),
  bool traverse = true,
}) {
  final typeEntity = TypeEntity(TSuper);
  final g = groupEntity.preferOverDefault(focusGroup);
  final test = get<TSuper>(groupEntity: g);
  UNSAFE:
  {
    if (test.isSome()) {
      return test.unwrap().transf();
    }
    ReservedSafeCompleter<TSuper>? completer;
    var temp = getSyncOrNone<ReservedSafeCompleter<TSuper>>(
      groupEntity: g,
      traverse: traverse,
    );
    if (temp.isSome()) {
      completer = temp.unwrap();
    } else {
      completer = ReservedSafeCompleter<TSuper>(typeEntity);
      register(completer, groupEntity: g).end();
    }
    return completer
        .resolvable()
        .map((_) {
          unregister<ReservedSafeCompleter<TSuper>>(groupEntity: g).end();
          return get<TSuper>(groupEntity: g).unwrap();
        })
        .flatten()
        .transf();
  }
}