export default new class { constructor() { this.listeners = new Map(); } addListener(label, callback, vm) { if (typeof callback === 'function') { this.listeners.has(label) || this.listeners.set(label, []); this.listeners.get(label).push({callback: callback, vm: vm}); return true; } return false; } removeListener(label, callback, vm) { let listeners = this.listeners.get(label), index; if (listeners && listeners.length) { index = listeners.reduce((i, listener, index) => { return (typeof listener.callback === 'function' && listener.callback === callback && listener.vm === vm) ? i = index : i; }, -1); if (index > -1) { listeners.splice(index, 1); this.listeners.set(label, listeners); return true; } } return false; } emit(label, ...args) { let ret = false; this.listeners.forEach((listeners, key) => { if (this.eq(label, key) && listeners && listeners.length) { listeners.forEach((listener) => { listener.callback.call(listener.vm, ...args, label); }); ret = true; } }); return ret; } eq(str1, str2) { let arr1 = str1.split('/'); let arr2 = str2.split('/'); if (!str1.includes('#') && !str2.includes('#') && arr1.length !== arr2.length) { return false; } if (arr2.length < arr1.length) { arr2 = str1.split('/'); arr1 = str2.split('/'); } let ret = true; arr1.forEach((val, i) => { if (val === '+' || val === '#' || (arr2[i] && arr2[i] === '+') || (arr2[i] && arr2[i] === '#') || (arr2[i] && arr2[i] === val)) { return; } ret = false; }) return ret; } }