blob: 7d9d3f3c51012eb558369ea4e39ff4efe1b41b17 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
/**
* pubSub is a curried interface for listening to and emitting
* events.
*
* If we get a bus:
*
* var bus = pubSub();
*
* We can listen to event 'foo' like:
*
* bus('foo').on(myCallback)
*
* And emit event foo like:
*
* bus('foo').emit()
*
* or, with a parameter:
*
* bus('foo').emit('bar')
*
* All functions can be cached and don't need to be
* bound. Ie:
*
* var fooEmitter = bus('foo').emit
* fooEmitter('bar'); // emit an event
* fooEmitter('baz'); // emit another
*
* There's also an uncurried[1] shortcut for .emit and .on:
*
* bus.on('foo', callback)
* bus.emit('foo', 'bar')
*
* [1]: http://zvon.org/other/haskell/Outputprelude/uncurry_f.html
*/
function pubSub(){
var singles = {},
newListener = newSingle('newListener'),
removeListener = newSingle('removeListener');
function newSingle(eventName) {
return singles[eventName] = singleEventPubSub(
eventName,
newListener,
removeListener
);
}
/** pubSub instances are functions */
function pubSubInstance( eventName ){
return singles[eventName] || newSingle( eventName );
}
// add convenience EventEmitter-style uncurried form of 'emit' and 'on'
['emit', 'on', 'un'].forEach(function(methodName){
pubSubInstance[methodName] = varArgs(function(eventName, parameters){
apply( parameters, pubSubInstance( eventName )[methodName]);
});
});
return pubSubInstance;
}
|