51 lines
1.1 KiB
JavaScript
51 lines
1.1 KiB
JavaScript
|
'use strict';
|
||
|
|
||
|
Object.defineProperty(exports, "__esModule", {
|
||
|
value: true
|
||
|
});
|
||
|
var createChangeEmitter = exports.createChangeEmitter = function createChangeEmitter() {
|
||
|
var currentListeners = [];
|
||
|
var nextListeners = currentListeners;
|
||
|
|
||
|
function ensureCanMutateNextListeners() {
|
||
|
if (nextListeners === currentListeners) {
|
||
|
nextListeners = currentListeners.slice();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function listen(listener) {
|
||
|
if (typeof listener !== 'function') {
|
||
|
throw new Error('Expected listener to be a function.');
|
||
|
}
|
||
|
|
||
|
var isSubscribed = true;
|
||
|
|
||
|
ensureCanMutateNextListeners();
|
||
|
nextListeners.push(listener);
|
||
|
|
||
|
return function () {
|
||
|
if (!isSubscribed) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
isSubscribed = false;
|
||
|
|
||
|
ensureCanMutateNextListeners();
|
||
|
var index = nextListeners.indexOf(listener);
|
||
|
nextListeners.splice(index, 1);
|
||
|
};
|
||
|
}
|
||
|
|
||
|
function emit() {
|
||
|
currentListeners = nextListeners;
|
||
|
var listeners = currentListeners;
|
||
|
for (var i = 0; i < listeners.length; i++) {
|
||
|
listeners[i].apply(listeners, arguments);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return {
|
||
|
listen: listen,
|
||
|
emit: emit
|
||
|
};
|
||
|
};
|