--- /dev/null
+define(function () {
+
+ /**
+ * Debounce callback execution
+ */
+ function debounce(fn, threshold, isAsap){
+ var timeout, result;
+ function debounced(){
+ var args = arguments, context = this;
+ function delayed(){
+ if (! isAsap) {
+ result = fn.apply(context, args);
+ }
+ timeout = null;
+ }
+ if (timeout) {
+ clearTimeout(timeout);
+ } else if (isAsap) {
+ result = fn.apply(context, args);
+ }
+ timeout = setTimeout(delayed, threshold);
+ return result;
+ }
+ debounced.cancel = function(){
+ clearTimeout(timeout);
+ };
+ return debounced;
+ }
+
+ return debounce;
+
+});