mirror of
https://github.com/overleaf/overleaf.git
synced 2024-12-04 19:44:55 -05:00
42 lines
1.1 KiB
CoffeeScript
42 lines
1.1 KiB
CoffeeScript
# A synchronous processing queue. The queue calls process on the arguments,
|
|
# ensuring that process() is only executing once at a time.
|
|
#
|
|
# process(data, callback) _MUST_ eventually call its callback.
|
|
#
|
|
# Example:
|
|
#
|
|
# queue = require 'syncqueue'
|
|
#
|
|
# fn = queue (data, callback) ->
|
|
# asyncthing data, ->
|
|
# callback(321)
|
|
#
|
|
# fn(1)
|
|
# fn(2)
|
|
# fn(3, (result) -> console.log(result))
|
|
#
|
|
# ^--- async thing will only be running once at any time.
|
|
|
|
module.exports = (process) ->
|
|
throw new Error('process is not a function') unless typeof process == 'function'
|
|
queue = []
|
|
|
|
enqueue = (data, callback) ->
|
|
queue.push [data, callback]
|
|
flush()
|
|
|
|
enqueue.busy = false
|
|
|
|
flush = ->
|
|
return if enqueue.busy or queue.length == 0
|
|
|
|
enqueue.busy = true
|
|
[data, callback] = queue.shift()
|
|
process data, (result...) -> # TODO: Make this not use varargs - varargs are really slow.
|
|
enqueue.busy = false
|
|
# This is called after busy = false so a user can check if enqueue.busy is set in the callback.
|
|
callback.apply null, result if callback
|
|
flush()
|
|
|
|
enqueue
|
|
|