nc-photos/app/lib/compute_queue.dart
2022-06-08 19:09:15 +08:00

40 lines
988 B
Dart

import 'dart:collection';
import 'package:flutter/foundation.dart';
typedef ComputeQueueCallback<U> = void Function(U result);
/// Compute the jobs in the queue one by one sequentially in isolate
class ComputeQueue<T, U> {
void addJob(T event, ComputeCallback<T, U> callback,
ComputeQueueCallback<U> onResult) {
_queue.addLast(_Job(event, callback, onResult));
if (_queue.length == 1) {
_startProcessing();
}
}
bool get isProcessing => _queue.isNotEmpty;
Future<void> _startProcessing() async {
while (_queue.isNotEmpty) {
final ev = _queue.first;
try {
final result = await compute(ev.callback, ev.message);
ev.onResult(result);
} finally {
_queue.removeFirst();
}
}
}
final _queue = Queue<_Job<T, U>>();
}
class _Job<T, U> {
const _Job(this.message, this.callback, this.onResult);
final T message;
final ComputeCallback<T, U> callback;
final ComputeQueueCallback<U> onResult;
}