| "use strict"; | 
| var util = require("./util"); | 
| var schedule; | 
| var noAsyncScheduler = function() { | 
|     throw new Error("No async scheduler available\u000a\u000a    See http://goo.gl/MqrFmX\u000a"); | 
| }; | 
| var NativePromise = util.getNativePromise(); | 
| if (util.isNode && typeof MutationObserver === "undefined") { | 
|     var GlobalSetImmediate = global.setImmediate; | 
|     var ProcessNextTick = process.nextTick; | 
|     schedule = util.isRecentNode | 
|                 ? function(fn) { GlobalSetImmediate.call(global, fn); } | 
|                 : function(fn) { ProcessNextTick.call(process, fn); }; | 
| } else if (typeof NativePromise === "function" && | 
|            typeof NativePromise.resolve === "function") { | 
|     var nativePromise = NativePromise.resolve(); | 
|     schedule = function(fn) { | 
|         nativePromise.then(fn); | 
|     }; | 
| } else if ((typeof MutationObserver !== "undefined") && | 
|           !(typeof window !== "undefined" && | 
|             window.navigator && | 
|             (window.navigator.standalone || window.cordova)) && | 
|           ("classList" in document.documentElement)) { | 
|     schedule = (function() { | 
|         var div = document.createElement("div"); | 
|         var opts = {attributes: true}; | 
|         var toggleScheduled = false; | 
|         var div2 = document.createElement("div"); | 
|         var o2 = new MutationObserver(function() { | 
|             div.classList.toggle("foo"); | 
|             toggleScheduled = false; | 
|         }); | 
|         o2.observe(div2, opts); | 
|   | 
|         var scheduleToggle = function() { | 
|             if (toggleScheduled) return; | 
|             toggleScheduled = true; | 
|             div2.classList.toggle("foo"); | 
|         }; | 
|   | 
|         return function schedule(fn) { | 
|             var o = new MutationObserver(function() { | 
|                 o.disconnect(); | 
|                 fn(); | 
|             }); | 
|             o.observe(div, opts); | 
|             scheduleToggle(); | 
|         }; | 
|     })(); | 
| } else if (typeof setImmediate !== "undefined") { | 
|     schedule = function (fn) { | 
|         setImmediate(fn); | 
|     }; | 
| } else if (typeof setTimeout !== "undefined") { | 
|     schedule = function (fn) { | 
|         setTimeout(fn, 0); | 
|     }; | 
| } else { | 
|     schedule = noAsyncScheduler; | 
| } | 
| module.exports = schedule; |