// 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/async_helper.dart';
import 'package:expect/expect.dart';

typedef Future<Null> Task();

class ForeignFuture implements Future<Null> {
  ForeignFuture(List<Task> tasks) {
    tasks.forEach(_addTask);
  }

  Future<Null>? _future;

  void _addTask(Task task) {
    _future = (_future == null) ? task() : _future!.then((_) => task());
  }

  Future<S> then<S>(FutureOr<S> 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<Null> asStream() {
    return new Stream.fromFuture(this);
  }

  Future<Null> catchError(onError, {bool test(Object error)?}) {
    print('Unimplemented catchError');
    return Future.value();
  }

  Future<Null> timeout(Duration timeLimit, {onTimeout()?}) {
    print('Unimplemented timeout');
    return Future.value();
  }

  Future<Null> whenComplete(action()) {
    print('Unimplemented whenComplete');
    return Future.value();
  }
}

var r1;

Future<Null> hello() async {
  r1 = 'hello';
  throw new Exception('error');
}

Future<String> 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();
  }();
}
