process<T extends JSAny, R> method

Future<R?> process<T extends JSAny, R>(
  1. ({bool next, R? result}) processor(
    1. T? result
    )
)

Implementation

Future<R?> process<T extends JSAny, R>(
  ({bool next, R? result}) Function(T? result) processor,
) {
  final completer = Completer<R?>();

  onsuccess = (Event event) {
    var request = event.target as IDBRequest;
    var cursor = request.result as T?;

    var (next: next, result: r) = processor(cursor);

    if (!next) {
      completer.completeSafe(r);
    } else {
      // Not `cursor`: a cast from the generic `T?` isn't platform-consistent.
      final result = request.result;
      if (result.isA<IDBCursor>()) {
        (result as IDBCursor).continue_();
      }
    }
  }.toJS;

  onerror = (Event event) {
    var request = event.target as IDBRequest;
    var error = request.error;

    if (error != null) {
      completer.completeErrorSafe(error);
    } else {
      completer.completeErrorSafe("`IDBRequest` error!");
    }
  }.toJS;

  return completer.future;
}