Source: components/ActionGroupComponent.js

import { ActionQueue } from '../common/ActionQueue';
import { BaseComponent } from './BaseComponent';

const __ = {
	private: Symbol('private'),
}

/**
 * @class ActionGroupComponent
 * The action group component.
 * @memberof THING
 * @extends THING.BaseComponent
 */
class ActionGroupComponent extends BaseComponent {

	static mustCopyWithInstance = true;

	/**
	 * The component of action queue by groups.
	 */
	constructor() {
		super();

		this[__.private] = {};
		let _private = this[__.private];

		_private.groups = new Map();
	}

	// #region BaseComponent Overrides

	onRemove() {
		let _private = this[__.private];

		_private.groups.forEach(group => {
			group.clear();
		});

		_private.groups.clear();

		super.onRemove();
	}

	// #endregion

	/**
	 * Add group.
	 * @param {String} name The group name.
	 * @returns {THING.ActionQueue}
	 * @example
	 * let component = new THING.ActionGroupComponent();
	 * let ret = component.add('temp');
	 * // @expect(ret.name == 'temp')
	 */
	add(name) {
		let _private = this[__.private];

		let group = _private.groups.get(name);
		if (group) {
			return group;
		}

		group = new ActionQueue({ name });

		_private.groups.set(name, group);

		return group;
	}

	/**
	 * Remove group.
	 * @param {String} name The group name.
	 * @example
	 * let component = new THING.ActionGroupComponent();
	 * let ret = component.add('temp');
	 * component.remove('temp');
	 * // @expect(component.groups.size == 0)
	 */
	remove(name) {
		let _private = this[__.private];

		let group = _private.groups;
		if (!group) {
			return;
		}

		group.clear();

		_private.groups.delete(name);
	}

	/**
	 * Get group.
	 * @param {String} name The group name.
	 * @returns {Object}
	 * @example
	 * let component = new THING.ActionGroupComponent();
	 * component.add('temp');
	 * let ret = component.get('temp');
	 * // @expect(ret.name == 'temp')
	 */
	get(name) {
		let _private = this[__.private];

		let group = _private.groups.get(name);
		if (!group) {
			return null;
		}

		return group;
	}

	/**
	 * Stop group.
	 * @param {String} name The group name.
	 * @param {Object} options The options.
	 */
	stop(name) {
		let _private = this[__.private];

		let group = _private.groups.get(name);
		if (!group) {
			return;
		}

		return group.stop();
	}

	/**
	 * Run group.
	 * @param {String} name The group name.
	 * @param {Object} options The options.
	 * @returns {Promise<any>}
	 */
	run(name, options) {
		let _private = this[__.private];

		let group = _private.groups.get(name);
		if (!group) {
			return null;
		}

		return group.run(options);
	}

	/**
	 * Get the groups.
	 * @type {*}
	 * @example
	 * let component = new THING.ActionGroupComponent();
	 * component.add('temp');
	 * let ret = component.groups.get('temp');
	 * // @expect(ret.name == 'temp')
	 */
	get groups() {
		let _private = this[__.private];

		return _private.groups;
	}

}

export { ActionGroupComponent }