Forked from HYCAR-Hydro / airGR
Source project has a limited visibility.
param-values.ts 6.42 KiB
import { Pair } from "../util/pair"
/**
 * mode de génération des valeurs
 */
export enum ParamValueMode {
    /**
     * valeur unique
     */
    SINGLE,
    /**
     * min, max, pas
    MINMAX,
    /**
     * liste de valeurs discrètes
    LISTE
/**
 * itérateur sur les (ou la) valeurs prises par le paramètre
export class ParamValueIterator implements IterableIterator<number> {
    /**
     * paramètre à itérer
    private _param: ParamValues;
    /**
     * true si les valeurs sont fournies de max à min (ParamValueMode.MINMAX)
    private _reverse: boolean;
    private _index: number;
    /**
     * cas de figure :
     * 0 : valeur fixée
     * 1 : min/max/pas
     * 2 : liste de valeurs
    private _config: number;
    constructor(prm: ParamValues, reverse: boolean = false) {
        this._param = prm;
        this.reset(reverse)
    public reset(reverse: boolean) {
        this._reverse = reverse;
        switch (this._param.valueMode) {
            case ParamValueMode.SINGLE:
                this._config = 0;
                this._index = 0;
                break;
            case ParamValueMode.MINMAX:
                this._config = 1;
                if (reverse)
                    this._index = this._param.max;
                else
                    this._index = this._param.min;
                break;
            case ParamValueMode.LISTE:
                this._config = 2;
7172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
this._index = 0; break; default: throw new Error(`mode de génération de valeurs ${ParamValueMode[this._param.valueMode]}`); } } public next(): IteratorResult<number> { switch (this._config) { // valeur fixée case 0: if (this._index == 0) return { done: false, value: this._param.singleValue }; else return { done: true, value: undefined }; // min/max case 1: const res = this._index; const end = this._reverse ? this._index < this._param.min : this._index > this._param.max; if (!end) { if (this._reverse) this._index -= this._param.step; else this._index += this._param.step; return { done: false, value: res }; } else { return { done: true, value: undefined }; } // liste case 2: const i = this._index; if (this._index < this._param.valueList.length) { const res = this._param.valueList[this._index++]; return { done: false, value: res }; } else { return { done: true, value: undefined }; } default: throw new Error(`ParamValueIterator.next() : erreur interne`); } } // public get current(): number { // if (this._config == 1) // return this._index; // throw new Error(`appel ParamValueIterator.current() invalide`) // }
141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
// interface IterableIterator public [Symbol.iterator](): IterableIterator<number> { return this; } } export class ParamValues { /** * mode de génération des valeurs : min/max, liste, ... */ private _valueMode: ParamValueMode = ParamValueMode.MINMAX; /** * valeur dans le cas ParamValueMode.SINGLE */ private _singleValue: number; /** * valeur min dans le cas ParamValueMode.MINMAX */ private _minValue: number = undefined; /** * valeur max dans le cas ParamValueMode.MINMAX */ private _maxValue: number = undefined; /** * pas de progression dans le cas ParamValueMode.MINMAX */ private _stepValue: number = undefined; /** * liste de valeurs dans le cas ParamValueMode.LISTE */ private _valueList: number[]; public setValues(o: number | any, max?: number, step?: number) { if (typeof (o) === "number") { if (max == undefined) { this._valueMode = ParamValueMode.SINGLE; this._singleValue = o as number; } else { this._valueMode = ParamValueMode.MINMAX; this._minValue = o as number; this._maxValue = max; this._stepValue = step; } } else if (Array.isArray(o)) this._valueList = o; else throw new Error(`ParamValues.setValues() : appel invalide`); } public get valueMode() { return this._valueMode; } public set valueMode(m: ParamValueMode) { this._valueMode = m; } public get singleValue() { return this._singleValue; } public set singleValue(v: number) { this._singleValue = v;
211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
} public get min() { return this._minValue; } public set min(v: number) { this._minValue = v; } public get max() { return this._maxValue; } public set max(v: number) { this._maxValue = v; } public get stepRefValue(): Pair { return new Pair(1e-9, this._maxValue - this._minValue); } public get step() { return this._stepValue; } public set step(v: number) { this._stepValue = v; } public get valueList() { return this._valueList; } public set valueList(l: number[]) { this._valueList = l; } public getValuesIterator(reverse: boolean = false): ParamValueIterator { return new ParamValueIterator(this, reverse); } /** * copie des membres */ public copyMembers(n: ParamValues) { n._valueMode = this.valueMode; n._minValue = this._minValue; n._maxValue = this._maxValue; n._stepValue = this._stepValue; if (this._valueList != undefined) n._valueList = this._valueList.slice(0); // copie } }