Async<T extends Object> constructor

Async<T extends Object>(
  1. @mustBeAnonymous @mustAwaitAllFutures Future<T> mustAwaitAllFutures(), {
  2. @noFuturesAllowed Err<T> onError(
    1. Object? error
    )?,
  3. @noFuturesAllowed void onFinalize()?,
})

Creates an Async by executing an asynchronous function mustAwaitAllFutures.

IMPORTANT:

Always all futures witin mustAwaitAllFutures to ensure errors are be caught and propagated.

Implementation

factory Async(
  @mustBeAnonymous
  @mustAwaitAllFutures
  Future<T> Function() mustAwaitAllFutures, {
  @noFuturesAllowed Err<T> Function(Object? error)? onError,
  @noFuturesAllowed void Function()? onFinalize,
}) {
  assert(!_isSubtype<T, Future<Object>>(), '$T must never be a Future.');
  return Async.unsafe(() async {
    try {
      return Ok<T>(await mustAwaitAllFutures());
    } on Err catch (e) {
      return e.transfErr<T>();
    } catch (error) {
      try {
        if (onError == null) {
          rethrow;
        }
        return onError(error);
      } catch (error) {
        return Err<T>(error);
      }
    } finally {
      onFinalize?.call();
    }
  }());
}