diff --git a/emitter.js b/emitter.js index c17c92f..e1e21b7 100644 --- a/emitter.js +++ b/emitter.js @@ -4,41 +4,90 @@ * Сделано задание на звездочку * Реализованы методы several и through */ -getEmitter.isStar = true; +getEmitter.isStar = false; module.exports = getEmitter; + +function getAllEvents(event) { + var splitted = event.split('.'); + var events = [splitted[0]]; + for (var i = 1; i < splitted.length; i++) { + events.push([events[i - 1], splitted[i]].join('.')); + } + + return events; +} + /** * Возвращает новый emitter * @returns {Object} */ function getEmitter() { return { + _events: [], /** * Подписаться на событие * @param {String} event * @param {Object} context * @param {Function} handler + * @returns {Object} */ on: function (event, context, handler) { - console.info(event, context, handler); + if (!this._events.hasOwnProperty(event)) { + this._events[event] = []; + } + this._events[event].push({ + context: context, + handler: handler.bind(context) + }); + + return this; }, /** * Отписаться от события * @param {String} event * @param {Object} context + * @returns {Object} */ off: function (event, context) { - console.info(event, context); + var eventsToOff = Object.keys(this._events).filter( + function (key) { + return key === event || + (key.length > event.length && + key.substr(0, event.length + 1) === event + '.'); + } + ); + for (var i = 0; i < eventsToOff.length; i++) { + this._events[eventsToOff[i]] = this._events[eventsToOff[i]].filter( + function (item) { + return item.context !== context; + } + ); + } + + return this; }, /** * Уведомить о событии * @param {String} event + * @returns {Object} */ emit: function (event) { - console.info(event); + var events = getAllEvents(event).reverse(); + for (var i = 0; i < events.length; i++) { + var currEvent = events[i]; + if (!this._events[currEvent]) { + continue; + } + this._events[currEvent].forEach(function (item) { + item.handler(); + }); + } + + return this; }, /**