Skip to content

Instantly share code, notes, and snippets.

@sstephenson
Created August 21, 2010 19:33
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sstephenson/542748 to your computer and use it in GitHub Desktop.
Save sstephenson/542748 to your computer and use it in GitHub Desktop.
# A reference counter that invokes a callback when it reaches zero.
# Use it to implement after-finished callbacks in asynchronous code.
(exports ? this).Finalizer = class Finalizer
@from: (finalizerOrCallback) ->
if finalizerOrCallback instanceof Finalizer
finalizerOrCallback
else
new Finalizer(finalizerOrCallback ? ->)
constructor: (callback) ->
@callback = callback
@count = 0
@done = no
increment: ->
return if @done
@count += 1
decrement: ->
return if @done
if (@count -= 1) <= 0
@done = yes
@callback()
eachFileInDirectory = (directory, pattern, callback, afterCallback) ->
pattern ?= /.*/
finalizer = Finalizer.from(afterCallback)
finalizer.increment()
fs.readdir directory, (err, files) ->
for file in files
filename = path.join(directory, file)
finalizer.increment()
fs.stat filename, (err, stats) ->
if stats.isDirectory()
eachFileInDirectory(filename, pattern, callback, finalizer)
finalizer.decrement()
else if file.match(pattern)
callback(filename, finalizer)
finalizer.decrement()
finalizer.decrement()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment