Index: pkg/polymer/lib/job.dart |
diff --git a/pkg/polymer/lib/job.dart b/pkg/polymer/lib/job.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..677784a2de0be6613a4f196cb7eb61ad3f688fbd |
--- /dev/null |
+++ b/pkg/polymer/lib/job.dart |
@@ -0,0 +1,53 @@ |
+// 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. |
+ |
+library polymer.job; |
+ |
+import 'dart:async' show Timer; |
+ |
+/** |
+ * Invoke [callback] in [wait], unless the job is re-registered, |
+ * which resets the timer. For example: |
+ * |
+ * _myJob = runJob(_myJob, callback, const Duration(milliseconds: 100)); |
+ * |
+ * Returns a job handle which can be used to re-register a job. |
+ */ |
+// Dart note: renamed to runJob to avoid conflict with instance member "job". |
+Job runJob(Job job, void callback(), Duration wait) { |
+ if (job != null) { |
+ job.stop(); |
+ } else { |
+ job = new Job(); |
+ } |
+ job.go(callback, wait); |
+ return job; |
+} |
+ |
+// TODO(jmesserly): it isn't clear to me what is supposed to be public API here. |
+// Or what name we should use. "Job" is awfully generic. |
+// (The type itself is not exported in Polymer.) |
+class Job { |
+ Function _callback; |
+ Timer _timer; |
+ |
+ void go(void callback(), Duration wait) { |
+ this._callback = callback; |
+ _timer = new Timer(wait, complete); |
+ } |
+ |
+ void stop() { |
+ if (_timer != null) { |
+ _timer.cancel(); |
+ _timer = null; |
+ } |
+ } |
+ |
+ void complete() { |
+ if (_timer != null) { |
+ stop(); |
+ _callback(); |
+ } |
+ } |
+} |