anchor.diff:  part of dart.async;
   
   /** The onValue and onError handlers return either a value or a future */
  -typedef dynamic/*T|Future<T>*/ _FutureOnValue<S, T>(S value);
  +typedef FutureOr<T> _FutureOnValue<S, T>(S value);
   /** Test used by [Future.catchError] to handle skip some errors. */
   typedef bool _FutureErrorTest(var error);
   /** Used by [WhenFuture]. */
  
positive.code:     return _onError != null;
    }
  
    dynamic/*T|Future<T>*/ handleValue(S sourceResult) {
      return _zone.runUnary<dynamic/*T|Future<T>*/, S>(
          _onValue, sourceResult);
    }
  
  
negative.code:     return _zone.runUnary<bool, dynamic>(_errorTest, asyncError.error);
    }
  
    FutureOr<T> handleError(AsyncError asyncError) {
      assert(handlesError && hasErrorCallback);
      if (errorCallback is ZoneBinaryCallback) {
        var typedErrorCallback = errorCallback as Object
            /*=ZoneBinaryCallback<FutureOr<T>, Object, StackTrace>*/;
        return _zone.runBinary(typedErrorCallback,
            asyncError.error,
            asyncError.stackTrace);
      } else {
        return _zone.runUnary<FutureOr<T>, dynamic>(
            errorCallback, asyncError.error);
      }
    }
  