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 }