Async<T extends Object> constructor

Async<T extends Object>(
  1. @mustBeAnonymous @mustAwaitAllFutures Future<T> mustAwaitAllFutures(), {
  2. @noFutures TOnErrorCallback<T>? onError,
  3. @noFutures TVoidCallback? 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, {
  @noFutures TOnErrorCallback<T>? onError,
  @noFutures TVoidCallback? onFinalize,
}) {
  assert(!isSubtype<T, Future<Object>>(), '$T must never be a Future.');
  return Async.result(() async {
    try {
      return Ok<T>(await mustAwaitAllFutures());
    } on Err catch (err) {
      return err.transfErr<T>();
    } catch (error, stackTrace) {
      try {
        if (onError == null) {
          rethrow;
        }
        return onError(error, stackTrace);
      } catch (error, stackTrace) {
        return Err<T>(error, stackTrace: stackTrace);
      }
    } finally {
      onFinalize?.call();
    }
  }());
}