// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. import 'dart:async'; import 'package:expect/expect.dart'; import 'package:async_helper/async_helper.dart'; typedef Future Task(); class ForeignFuture implements Future { ForeignFuture(List tasks) { tasks.forEach(_addTask); } Future? _future; void _addTask(Task task) { _future = (_future == null) ? task() : _future!.then((_) => task()); } Future then(FutureOr onValue(Null _), {Function? onError}) { assert(_future != null); return _future!.then((_) { _future = null; return onValue(null); }, onError: (error, trace) { _future = null; if (onError != null) { onError(error, trace); } }); } Stream asStream() { return new Stream.fromFuture(this); } Future catchError(onError, {bool test(Object error)?}) { print('Unimplemented catchError'); return Future.value(); } Future timeout(Duration timeLimit, {onTimeout()?}) { print('Unimplemented timeout'); return Future.value(); } Future whenComplete(action()) { print('Unimplemented whenComplete'); return Future.value(); } } var r1; Future hello() async { r1 = 'hello'; throw new Exception('error'); } Future world() async { try { await new ForeignFuture([hello]); } catch (e) {} return 'world'; } void main() { asyncStart(); () async { var r2 = await world(); Expect.equals('hello', r1); Expect.equals('world', r2); asyncEnd(); }(); }