mirror of
https://github.com/overleaf/overleaf.git
synced 2024-11-21 20:47:08 -05:00
46 lines
1.3 KiB
CoffeeScript
46 lines
1.3 KiB
CoffeeScript
# This is a simple port of microevent.js to Coffeescript. I've changed the
|
|
# function names to be consistent with node.js EventEmitter.
|
|
#
|
|
# microevent.js is copyright Jerome Etienne, and licensed under the MIT license:
|
|
# https://github.com/jeromeetienne/microevent.js
|
|
|
|
nextTick = if WEB? then (fn) -> setTimeout fn, 0 else process['nextTick']
|
|
|
|
class MicroEvent
|
|
on: (event, fct) ->
|
|
@_events ||= {}
|
|
@_events[event] ||= []
|
|
@_events[event].push(fct)
|
|
this
|
|
|
|
removeListener: (event, fct) ->
|
|
@_events ||= {}
|
|
listeners = (@_events[event] ||= [])
|
|
|
|
# Sadly, there's no IE8- support for indexOf.
|
|
i = 0
|
|
while i < listeners.length
|
|
listeners[i] = undefined if listeners[i] == fct
|
|
i++
|
|
|
|
nextTick => @_events[event] = (x for x in @_events[event] when x)
|
|
|
|
this
|
|
|
|
emit: (event, args...) ->
|
|
return this unless @_events?[event]
|
|
fn.apply this, args for fn in @_events[event] when fn
|
|
this
|
|
|
|
# mixin will delegate all MicroEvent.js function in the destination object
|
|
MicroEvent.mixin = (obj) ->
|
|
proto = obj.prototype || obj
|
|
|
|
# Damn closure compiler :/
|
|
proto.on = MicroEvent.prototype.on
|
|
proto.removeListener = MicroEvent.prototype.removeListener
|
|
proto.emit = MicroEvent.prototype.emit
|
|
obj
|
|
|
|
module.exports = MicroEvent unless WEB?
|
|
|