import { EventObservableTypes, IEventObservable } from './interfaces/event-observable.interface';

export class EventObservable implements IEventObservable {
    private _stack: { [id: number]: Array<Function> };
    constructor() {
        this._stack = {};
    }

    private initStock(id: EventObservableTypes) {
        this._stack[id] = [];
    }

    add(id: EventObservableTypes, fu: Function) {
        if (!this._stack[id])
            this.initStock(id);
        this._stack[id].push(fu);
    }

    invoke(id: EventObservableTypes, discharge: boolean, params?: Array<any>) {
        if (!this._stack[id])
            this.initStock(id);
        if (params) this._stack[id].forEach((f) => f(...params));
        else this._stack[id].forEach((f) => f());
        if (discharge)
            this.initStock(id);
    }

    destroy() {
        this._stack = {};
    }
}
