using<T extends Disposable, R> function

Future<R> using<T extends Disposable, R>(
  1. T value,
  2. UsingBody<T, R> body
)

Implementation

Future<R> using<T extends Disposable, R>(T value, UsingBody<T, R> body) async {
  AsyncDisposable disp;
  if (value is SyncDisposable) {
    value.throwIfNotAvailable();
    disp = value.asAsync();
  } else if (value is AsyncDisposable) {
    value.throwIfNotAvailable();
    disp = value;
  } else {
    throw UnknownDisposableException(value);
  }

  try {
    return await body(value);
  } finally {
    await disp.dispose();
  }
}