UNPKG

@specs-feup/lara

Version:

A js port of the popular framework for building source-to-source compilers

86 lines (70 loc) 1.92 kB
import { arrayFromArgs } from "../core/LaraCore.js"; import DseValues from "./DseValues.js"; type T = any; /** * Iterates over the values of a set of DseValues. * * @param dseValues - The DseValues that will form the set. */ export default class DseValuesSet extends DseValues { dseValuesArray: DseValues[]; numElements: number; constructor(...dseValues: DseValues[]) { super(); if (dseValues.length === 0) { throw "DseValuesSet: needs at least one DseValues as argument"; } this.dseValuesArray = arrayFromArgs(dseValues) as DseValues[]; this.numElements = this.dseValuesArray[0].getNumElements(); for (let i = 0; i < this.dseValuesArray.length; i++) { const dseValues = this.dseValuesArray[i]; if (this.numElements !== dseValues.getNumElements()) { throw ( "Argument " + i + " has " + dseValues.getNumElements() + " elements but previous arguments have " + this.numElements + " elements" ); } } } getType(): string { return "DseValuesSet"; } /** * @returns the next element. */ next(): T[] { const values: T[] = []; for (const dseValues of this.dseValuesArray) { values.push(dseValues.next()); } return values; } /** * @returns true if it has another element to return. */ hasNext(): boolean { return this.dseValuesArray[0].hasNext(); } /** * Resets the iterator. */ reset(): void { for (const dseValues of this.dseValuesArray) { dseValues.reset(); } } getNumElements(): number { return this.numElements; } /** * @returns The number of values returned by a call to next(). A value of one means one value, a value greater than one means an array with that amount of values. */ getNumValuesPerElement(): number { return this.dseValuesArray.length; } }