types/observerlist.js

'use strict';

/**
 * @author schukai GmbH
 */

import {Monster} from '../namespace.js';
import {Base} from './base.js';
import {Observer} from "./observer.js";
import {validateInstance} from "./validate.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.6.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.6.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 = [];
    }

    /**
     *
     * @param {Observer} observer
     * @return {ObserverList}
     * @throws {TypeError} value is not an instance of Observer
     */
    attach(observer) {
        validateInstance(observer, Observer)

        this.observers.push(observer);
        return this;
    };

    /**
     *
     * @param {Observer} observer
     * @return {ObserverList}
     * @throws {TypeError} value is not an instance of Observer
     */
    detach(observer) {
        validateInstance(observer, Observer)

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

        return this;
    };

    /**
     *
     * @param {Observer} observer
     * @return {boolean}
     * @throws {TypeError} value is not an instance of Observer
     */
    contains(observer) {
        validateInstance(observer, Observer)
        var i = 0, l = this.observers.length;
        for (; i < l; i++) {
            if (this.observers[i] === observer) {
                return true;
            }
        }
        return false;
    };

    /**
     *
     * @param subject
     * @return {Promise}
     */
    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);
    };

}

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