types/observerlist.js

'use strict';

/**
 * @author schukai GmbH
 */

import {Monster} from '../namespace.js';
import {Base} from  './base.js';

/**
 * With the help of the ObserverList class, observer can be managed.
 *
 * you can call the method via the monster namespace `new Monster.Types.ObserverList()`.
 *
 * ```
 * <script type="module">
 * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.5.0/dist/modules/types/observerlist.js';
 * console.log(new Monster.Types.ObserverList()) 
 * console.log(new Monster.Types.ObserverList()) 
 * </script>
 * ```
 *
 * Alternatively, you can also integrate this function individually.
 *
 * ```
 * <script type="module">
 * import {ObserverList} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.5.0/dist/modules/types/observerlist.js';
 * console.log(ObserverList())
 * console.log(ObserverList())
 * </script>
 * ```
 *
 * @since 1.0.0
 * @copyright schukai GmbH
 * @memberOf Monster/Types
 */
class ObserverList extends Base {

    constructor() {
        super();
        this.observers = [];
    }

    attach(observer) {
        checkIsObserver(observer);
        this.observers.push(observer);
        return this;
    };

    detach(observer) {
        checkIsObserver(observer);
        var i = 0, l = this.observers.length;
        for (; i < l; i++) {
            if (this.observers[i] === observer) {
                this.observers.splice(i, 1);
            }
        }

        return this;
    };

    contains(observer) {
        checkIsObserver(observer);
        var i = 0, l = this.observers.length;
        for (; i < l; i++) {
            if (this.observers[i] === observer) {
                return true;
            }
        }
        return false;
    };

    notify(subject) {

        let pomises = []

        var i = 0, l = this.observers.length;
        for (; i < l; i++) {
            pomises.push(this.observers[i].update(subject));
        }

        return Promise.all(pomises);
    };

}

/**
 * 
 * @param {Monster.Types.Observer} observer
 * @returns {boolean}
 * @private
 */
function checkIsObserver(observer) {
    if (!(observer instanceof Monster.Types.Observer)) {
        throw new Error("argument must be instance of observer")
    }
    return true;
}

Monster.assignToNamespace('Monster.Types', ObserverList);
export {Monster, ObserverList}