Future<T> enqueue(Future<T> Function() fun) async { final op = Reducer<T>(operation: fun); if (!_tryUnlock(op)) { _queue.add(op); } return op.completer.future; }