Index: observatory_pub_packages/polymer/src/job.dart |
=================================================================== |
--- observatory_pub_packages/polymer/src/job.dart (revision 0) |
+++ observatory_pub_packages/polymer/src/job.dart (working copy) |
@@ -0,0 +1,50 @@ |
+// Copyright (c) 2013, 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. |
+ |
+part of polymer; |
+ |
+/// Like [Timer] but can be restarted, and if no duration is supplied uses |
+/// [window.requestAnimationFrame] instead of a 0-duration timer. |
+// TODO(jmesserly): need to find a better name here. Also this feels more like a |
+// system level API, but doesn't map exactly to any of our other primitives. |
+class PolymerJob { |
+ Function _callback; |
+ Timer _timer; |
+ int _id; // for requestAnimationFrame |
+ |
+ PolymerJob._(); |
+ |
+ bool get isScheduled => _timer != null || _id != null; |
+ |
+ /// Starts the job. If the job is already running, it will [stop] first. |
+ void start(void callback(), [Duration wait]) { |
+ stop(); |
+ _callback = callback; |
+ if (wait == null) { |
+ _id = window.requestAnimationFrame((_) => complete()); |
+ } else { |
+ _timer = new Timer(wait, complete); |
+ } |
+ } |
+ |
+ /// Stops the job. It can be restarted by calling [start] with a new callback. |
+ void stop() { |
+ if (_id != null) { |
+ window.cancelAnimationFrame(_id); |
+ _id = null; |
+ } |
+ if (_timer != null) { |
+ _timer.cancel(); |
+ _timer = null; |
+ } |
+ } |
+ |
+ /// Synchronously completes the job. |
+ void complete() { |
+ if (isScheduled) { |
+ stop(); |
+ _callback(); |
+ } |
+ } |
+} |