/**
 * Реестр объектов, тикаемых движком от фиксированного шага: эффекты,
 * аниматоры, вспышки. Инстанс живёт в Engine (`engine.fx`) и тикается
 * между tween-ами и сценами; допускается и локальный инстанс в сцене.
 *
 * Владение отсутствует: запись с `destroyed === true` (Pixi-объекты
 * выставляют его при destroy) вычищается сама при очередном update.
 */

/** Всё, что движок может тикать; destroyed — признак самозачистки. */
export interface Updatable {
    update(dt: number): void;
    destroyed?: boolean;
}

export class Updatables {
    private list: Updatable[] = [];

    /** Добавить и вернуть тот же объект — удобно: `engine.fx.add(emitter)`. */
    add(u: Updatable): Updatable {
        if (!this.list.includes(u)) this.list.push(u);
        return u;
    }

    remove(u: Updatable): void {
        const i = this.list.indexOf(u);
        if (i !== -1) this.list.splice(i, 1);
    }

    clear(): void {
        this.list.length = 0;
    }

    /**
     * Тик в порядке добавления; разрушенные записи не тикаются (Pixi после
     * destroy обнуляет transform — касаться их нельзя) и вычищаются после прохода.
     */
    update(dt: number): void {
        for (const u of this.list) {
            if (!u.destroyed) u.update(dt);
        }
        if (this.list.some((u) => u.destroyed)) {
            this.list = this.list.filter((u) => !u.destroyed);
        }
    }

    get count(): number {
        return this.list.length;
    }
}