params-equation.ts 4.87 KiB
import { ComputeNode } from "../compute-node";
import { MapIterator } from "../util/iterator";
import { ParamDefinition } from "./param-definition";
import { ParamDomainValue } from "./param-domain";
export interface IParamDefinitionIterator extends IterableIterator<ParamDefinition> {
/**
 * itérateur sur les paramètres d'une seule instance de ParamsEquation
export class ParamDefinitionIterator implements IParamDefinitionIterator {
    private _mapIterator: MapIterator<ParamDefinition>;
    constructor(_params: ParamsEquation) {
        this._mapIterator = new MapIterator(_params.map);
    public next(): IteratorResult<ParamDefinition> {
        return this._mapIterator.next();
    public [Symbol.iterator](): IterableIterator<ParamDefinition> {
        return this;
/**
 * itérateur sur les paramètres d'un tableau de de ParamsEquation
// tslint:disable-next-line:max-classes-per-file
export class ParamsEquationArrayIterator implements IParamDefinitionIterator {
    private get done(): IteratorResult<ParamDefinition> {
        return {
            done: true,
            value: undefined
    private _paramsEqs: ParamsEquation[];
    private _index: number = 0;
    private _currentMapIterator: MapIterator<ParamDefinition>;
    constructor(p: ParamsEquation[]) {
        this._paramsEqs = p;
    public next(): IteratorResult<ParamDefinition> {
        if (this._currentMapIterator === undefined) {
            this.nextIterator();
        let res = this.done;
        if (this._currentMapIterator) {
            res = this._currentMapIterator.next();
            if (res.done) {
                this.nextIterator();
                if (this._currentMapIterator) {
                    res = this._currentMapIterator.next();
        return res;
    public [Symbol.iterator](): IterableIterator<ParamDefinition> {
        return this;
7172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
} private nextIterator() { if (this._index < this._paramsEqs.length) { this._currentMapIterator = new MapIterator(this._paramsEqs[this._index++].map); } else { this._currentMapIterator = undefined; } } } /** * liste des paramètres d'une équation */ // tslint:disable-next-line:max-classes-per-file export abstract class ParamsEquation implements Iterable<ParamDefinition> { /** précision de calcul par défaut */ private static DEFAULT_COMPUTE_PREC = 0.0001; /** * Pointer to calculator using these parameters; usually defined in Nub constructor * when affecting ParamsEquation. Usually a Nub but might be an acSection */ public parent: ComputeNode; protected _paramMap: { [key: string]: ParamDefinition } = {}; /** Précision de calcul */ private _Pr: ParamDefinition; private _calculabilityDefined: boolean; public constructor(parent?: ComputeNode) { this.parent = parent; this._calculabilityDefined = false; this._Pr = new ParamDefinition(this, "Pr", ParamDomainValue.POS, ParamsEquation.DEFAULT_COMPUTE_PREC); this.addParamDefinition(this._Pr); } get Pr() { return this._Pr; } get nubUid() { if (! this.parent) { throw new Error("ParamsEquation.nubUid : equation has no parent Nub !"); } return this.parent.uid; } get calculabilityDefined(): boolean { return this._calculabilityDefined; } public DefineCalculability() { this._calculabilityDefined = true; } public hasParameter(name: string): boolean { for (const p of this) { if (p.symbol === name) { return true; } } return false; } public get map(): { [key: string]: ParamDefinition } { return this._paramMap;
141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
} public resetParametersCalculability() { for (const p of this) { p.calculability = undefined; } } public checkParametersCalculability() { const res = []; for (const p of this) { if (p.calculability === undefined) { res.push(p.symbol); } } if (res.length > 0) { throw new Error("Calculability of parameter(s) " + res.toString() + " has not been defined"); } } public [Symbol.iterator](): Iterator<ParamDefinition> { return this.iterator; } public get iterator(): IParamDefinitionIterator { return new ParamDefinitionIterator(this); } protected addParamDefinition(p: ParamDefinition, force: boolean = false) { if (force || !this.hasParameter(p.symbol)) { this._paramMap[p.symbol] = p; } } protected addParamDefinitions(ps: ParamsEquation) { for (const p of ps) { // Force update of the map index this.addParamDefinition(p, true); } } }