Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2467)

Unified Diff: quiver/lib/src/async/metronome.dart

Issue 1400473008: Roll Observatory packages and add a roll script (Closed) Base URL: git@github.com:dart-lang/observatory_pub_packages.git@master
Patch Set: Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « quiver/lib/src/async/iteration.dart ('k') | quiver/lib/src/async/stream_router.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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());
- }
-}
« no previous file with comments | « quiver/lib/src/async/iteration.dart ('k') | quiver/lib/src/async/stream_router.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698