// Copyright (c) 2016, 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';

class TypeSafeFuture<T> implements Future<T> {
  final Future _future;

  TypeSafeFuture(this._future);

  Stream<T> asStream() => _future.then((value) => value as T).asStream();

  Future<T> catchError(Function onError, {bool test(Object error)}) async =>
      new TypeSafeFuture<T>(_future.catchError(onError, test: test));

  Future/*<S>*/ then/*<S>*/(/*=S*/ onValue(T value), {Function onError}) =>
      _future.then((value) => onValue(value as T), onError: onError);

  Future<T> whenComplete(action()) =>
      new TypeSafeFuture<T>(_future.whenComplete(action));

  Future<T> timeout(Duration timeLimit, {onTimeout()}) =>
      new TypeSafeFuture<T>(_future.timeout(timeLimit, onTimeout: onTimeout));
}
