| Index: quiver/lib/src/async/metronome.dart
|
| diff --git a/quiver/lib/src/async/metronome.dart b/quiver/lib/src/async/metronome.dart
|
| deleted file mode 100644
|
| index 41dc6972f0ed98188e8adb8c85eeb804d69d4715..0000000000000000000000000000000000000000
|
| --- a/quiver/lib/src/async/metronome.dart
|
| +++ /dev/null
|
| @@ -1,106 +0,0 @@
|
| -// Copyright 2014 Google Inc. All Rights Reserved.
|
| -//
|
| -// Licensed under the Apache License, Version 2.0 (the "License");
|
| -// you may not use this file except in compliance with the License.
|
| -// You may obtain a copy of the License at
|
| -//
|
| -// http://www.apache.org/licenses/LICENSE-2.0
|
| -//
|
| -// Unless required by applicable law or agreed to in writing, software
|
| -// distributed under the License is distributed on an "AS IS" BASIS,
|
| -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
| -// See the License for the specific language governing permissions and
|
| -// limitations under the License.
|
| -
|
| -part of quiver.async;
|
| -
|
| -/**
|
| - * A stream of [DateTime] events at [interval]s centered on [anchor].
|
| - *
|
| - * This stream accounts for drift but only guarantees that events are
|
| - * delivered on or after the interval. If the system is busy for longer than
|
| - * two [interval]s, only one will be delivered.
|
| - *
|
| - * [anchor] defaults to [clock.now], which means the stream represents a
|
| - * self-correcting periodic timer. If anchor is the epoch, then the stream is
|
| - * synchronized to wall-clock time. It can be anchored anywhere in time, but
|
| - * this does not delay the first delivery.
|
| - *
|
| - * Examples:
|
| - *
|
| - * new Metronome.epoch(aMinute).listen((d) => print(d));
|
| - *
|
| - * Could print the following stream of events, anchored by epoch,
|
| - * till the stream is canceled:
|
| - * 2014-05-04 14:06:00.001
|
| - * 2014-05-04 14:07:00.000
|
| - * 2014-05-04 14:08:00.003
|
| - * ...
|
| - *
|
| - * Example anchored in the future (now = 2014-05-05 20:06:00.123)
|
| - * new IsochronousStream.periodic(aMillisecond * 100,
|
| - * anchorMs: DateTime.parse("2014-05-05 21:07:00"))
|
| - * .listen((d) => print(d));
|
| - *
|
| - * 2014-05-04 20:06:00.223
|
| - * 2014-05-04 20:06:00.324
|
| - * 2014-05-04 20:06:00.423
|
| - * ...
|
| - */
|
| -class Metronome extends Stream<DateTime> {
|
| - static final DateTime _EPOCH = new DateTime.fromMillisecondsSinceEpoch(0);
|
| -
|
| - final Clock clock;
|
| - final Duration interval;
|
| - final DateTime anchor;
|
| -
|
| - Timer _timer;
|
| - StreamController _controller;
|
| - final int _intervalMs;
|
| - final int _anchorMs;
|
| -
|
| - bool get isBroadcast => true;
|
| -
|
| - Metronome.epoch(Duration interval, {Clock clock: const Clock()})
|
| - : this._(interval, clock: clock, anchor: _EPOCH);
|
| -
|
| - Metronome.periodic(Duration interval,
|
| - {Clock clock: const Clock(), DateTime anchor})
|
| - : this._(interval, clock: clock, anchor: anchor);
|
| -
|
| - Metronome._(Duration interval, {Clock clock: const Clock(), DateTime anchor})
|
| - : this.clock = clock,
|
| - this.anchor = anchor,
|
| - this.interval = interval,
|
| - this._intervalMs = interval.inMilliseconds,
|
| - this._anchorMs = (anchor == null
|
| - ? clock.now()
|
| - : anchor).millisecondsSinceEpoch {
|
| - _controller = new StreamController<DateTime>.broadcast(
|
| - sync: true, onCancel: () {
|
| - _timer.cancel();
|
| - }, onListen: () {
|
| - _startTimer(clock.now());
|
| - });
|
| - }
|
| -
|
| - StreamSubscription<DateTime> listen(void onData(DateTime event),
|
| - {Function onError, void onDone(), bool cancelOnError}) =>
|
| - _controller.stream.listen(onData,
|
| - onError: onError, onDone: onDone, cancelOnError: cancelOnError);
|
| -
|
| - _startTimer(DateTime now) {
|
| - var delay =
|
| - _intervalMs - ((now.millisecondsSinceEpoch - _anchorMs) % _intervalMs);
|
| - _timer = new Timer(new Duration(milliseconds: delay), _tickDate);
|
| - }
|
| -
|
| - _tickDate() {
|
| - // Hey now, what's all this hinky clock.now() calls? Simple, if the workers
|
| - // on the receiving end of _controller.add() take a non-zero amount of time
|
| - // to do their thing (e.g. rendering a large scene with canvas), the next
|
| - // timer must be adjusted to account for the lapsed time.
|
| - _controller.add(clock.now());
|
| - _startTimer(clock.now());
|
| - }
|
| -}
|
|
|