# src/emitter.js

    /**
     * Event emitter class
     */
    export class Emitter {
        constructor() {
            /**
             * Events object
             * @type {Object}
             */
            this.events = {};
        }

        /**
         * Subscribe to an event
         * @param  {Array}   evts Collection of event names
         * @param  {Function} fn  Function invoked when event is emitted
         */
        on(evts, fn) {
            evts.forEach((evt)=> {
                this.events[evt] = this.events[evt] || [];
                this.events[evt].push(fn);
            });
        }

        /**
         * Unsubscribe to an event
         * @param  {Array}   evts Collection of event names
         * @param  {Function} fn  Function invoked when event is emitted
         */
        off(evts, fn) {
            evts.forEach((evt)=> {
                if(evt in this.events) {
                    this.events[evt].splice(this.events[evt].indexOf(fn), 1);
                }
            });
        }

        /**
         * Emit an event
         * @param  {String} evt Event name followed by any other argument passed to
         * the invoked function
         */
        emit(evt /*, args...*/) {
            if(evt in this.events) {
                for(let i = 0; i < this.events[evt].length; i++) {
                    this.events[evt][i].apply(this, [].slice.call(arguments, 1));
                }
            }
        }
    }