(defn debounce | |
([c ms] (debounce (chan) c ms)) | |
([c' c ms] | |
(go | |
(loop [start nil loc (<! c)] | |
(if (nil? start) | |
(do | |
(>! c' loc) | |
(recur (js/Date.) nil)) | |
(let [loc (<! c)] | |
(if (>= (- (js/Date.) start) ms) | |
(recur nil loc) | |
(recur (js/Date.) loc)))))) | |
c')) |
// http://stackoverflow.com/questions/13320015/how-to-write-a-debounce-service-in-angularjs | |
app.factory('debounce', function($timeout, $q) { | |
return function(func, wait, immediate) { | |
var timeout; | |
var deferred = $q.defer(); | |
return function() { | |
var context = this, args = arguments; | |
var later = function() { | |
timeout = null; | |
if(!immediate) { | |
deferred.resolve(func.apply(context, args)); | |
deferred = $q.defer(); | |
} | |
}; | |
var callNow = immediate && !timeout; | |
if ( timeout ) { | |
$timeout.cancel(timeout); | |
} | |
timeout = $timeout(later, wait); | |
if (callNow) { | |
deferred.resolve(func.apply(context,args)); | |
deferred = $q.defer(); | |
} | |
return deferred.promise; | |
}; | |
}; | |
}); |
This comment has been minimized.
This comment has been minimized.
I don't see how that works either. Clojure says, "the recur expression must match the arity of the recursion point exactly". |
This comment has been minimized.
This comment has been minimized.
Looks like a typo. Line #8 should look exactly like line #12 |
This comment has been minimized.
This comment has been minimized.
@overthink @dball @ghoseb, thanks for the review, yes that's a typo. |
This comment has been minimized.
This comment has been minimized.
something to consider: pass c' in as an argument, or provide a different arity that gives you your desired default. In the JCSP docs and in my own tests, you often build sets of channels then want to wire them together, having all constructs take channels as arguments allows you to write stuff up after the channels have already been created. |
This comment has been minimized.
This comment has been minimized.
@halgari thanks for the review excellent points |
This comment has been minimized.
This comment has been minimized.
I found given implementation of debounce incorrect. The point of debounce is that it gets fired exactly once after all frequent calls end. This implementation doesn't put into channel when all calls end. So I wrote bit different debounce which I think is correct Simple version:
Version with
|
This comment has been minimized.
This comment has been minimized.
See also https://gist.github.com/scttnlsn/9744501 for a version of debounce that outputs the final input after a flurry of inputs. |
This comment has been minimized.
Does that first recur
(recur (js/Date.))
have the correct arity for the enclosingloop
? I'm confused by that part.