Project import generated by Copybara.
GitOrigin-RevId: 63746295f1a5ab5a619056791995793d65529e62
diff --git a/node_modules/mdl-ext/src/utils/interval-function.js b/node_modules/mdl-ext/src/utils/interval-function.js
new file mode 100644
index 0000000..4c344e3
--- /dev/null
+++ b/node_modules/mdl-ext/src/utils/interval-function.js
@@ -0,0 +1,83 @@
+const MIN_INERVAL = 1000/60;
+
+/**
+ * Trigger a callback at a given interval
+ * @param interval defaults to 1000/60 ms
+ * @return {function()} reference to start, stop, immediate and started
+ */
+
+const intervalFunction = ( interval = MIN_INERVAL ) => {
+
+ let lapse = interval < MIN_INERVAL ? MIN_INERVAL : interval;
+ let cb = undefined;
+ let next = null;
+ let timeElapsed = 0;
+
+ const execute = () => {
+ const f = cb(timeElapsed);
+ if (!f) {
+ cancel();
+ }
+ };
+
+ const cancel = () => {
+ if(next) {
+ window.cancelAnimationFrame(next);
+ }
+ next = null;
+ timeElapsed = 0;
+ };
+
+ const start = () => {
+ let timeStart = Date.now();
+
+ const loop = now => {
+ if (next) {
+ next = window.requestAnimationFrame( () => loop( Date.now() ));
+
+ timeElapsed += now - timeStart;
+
+ if(timeElapsed >= lapse) {
+ execute();
+ if( (timeElapsed -= lapse) > lapse) {
+ // time elapsed - interval_ > interval_ , indicates inactivity
+ // Could be due to browser minimized, tab changed, screen saver started, computer sleep, and so on
+ timeElapsed = 0;
+ }
+ }
+ timeStart = now;
+ }
+ };
+
+ next = 1; // a truthy value for first loop
+ loop( timeStart );
+ };
+
+ return {
+ get started() {
+ return next != null;
+ },
+ get interval() {
+ return lapse;
+ },
+ set interval(value) {
+ lapse = value < MIN_INERVAL ? MIN_INERVAL : value;
+ },
+ start(callback) {
+ if(typeof callback !== 'function') {
+ throw new TypeError('callback parameter must be a function');
+ }
+ cb = callback;
+ start();
+ },
+ immediate() {
+ if(!cb) {
+ throw new ReferenceError('callback parameter is not defined. Call start before immediate.');
+ }
+ execute();
+ },
+ stop: () => cancel(),
+ };
+};
+
+export default intervalFunction;