anchor.diff:    }):super(onDone: onDone) {
       double startTime = 0.0;
       double targetTime = 0.0;
  -    bool done = false;
       _stream = super.onTick.map((timeStamp) {
         if (startTime == 0.0) {
           startTime = timeStamp;
           targetTime = startTime + duration;
         }
  +      return math.min((timeStamp - startTime) / duration, 1.0);
  +    })
  +    .takeWhile(_checkForCompletion)
  +    .map((t) =>  begin + (end - begin) * curve.transform(t));
  +  }
   
  -      // Clamp the final frame to target time so we terminate the series with
  -      // 1.0 exactly.
  -      if ((timeStamp - targetTime).abs() <= _kFrameTime) {
  -        return 1.0;
  -      }
  -
  -      return (timeStamp - startTime) / duration;
  -    })
  -    .takeWhile((t) => t <= 1.0)
  -    .map((t) =>  begin + (end - begin) * curve.transform(t));
  +  bool _checkForCompletion(double t) {
  +    if (_done)
  +      return false;
  +    _done = t >= 1;
  +    return true;
     }
   }
   
  
positive.code:   }
  }
  
  const double _kFrameTime = 1000 / 60;
  
  class AnimationGenerator extends FrameGenerator {
  
    Stream<double> get onTick => _stream;
  
negative.code:   final double end;
    final Curve curve;
    Stream<double> _stream;
    bool _done = false;
  
    AnimationGenerator(this.duration, {
      this.begin: 0.0,
  