export class AggregateInput {
/**
* An AggregateInput is an input device that combines multiple other inputs together.
*
* @constructor
* @implements {Input}
*
* @param {Input[]} [sources] - The initial sources used for the aggregate.
*/
constructor(sources = []) {
this.inputs = [];
for (let source of sources) {
this.addSource(source);
}
}
/**
* Add a new input source inside the aggregate.
*
* @param {Input} input - The input to aggregate.
*/
addSource(input) {
if (this.inputs.includes(input))
return;
this.inputs.push(input);
}
/**
* Remove an input source from the aggregate.
*
* @param {Input} input - The input to remove.
*/
removeSource(input) {
let index = this.inputs.indexOf(input);
this.inputs.splice(index, 1);
}
/**
* Simultaneously poll each aggregated input.
*/
pollInputs() {
for (let input of this.inputs) {
input.pollInputs();
}
}
/**
* Returns true if any of the aggregated input should return true.
*
* @param {number} port - The input slot controller.
* @param {number} code - The input slot code.
*/
getState(port, code) {
for (let input of this.inputs)
if (input.getState(port, code))
return true;
return false;
}
}