From c45cedbbac40ca5505e57e6bbdd78b025064f6c1 Mon Sep 17 00:00:00 2001
From: "mathias.chouet" <mathias.chouet@irstea.fr>
Date: Tue, 16 Apr 2019 10:36:10 +0200
Subject: [PATCH] Result nos haw a pointer to origin Nub

---
 spec/nubtest.ts                               |  2 +-
 spec/structure/structure_test.ts              |  2 +-
 src/cond_distri.ts                            |  2 +-
 src/lechaptcalmon.ts                          |  2 +-
 src/macrorugo/macrorugo.ts                    |  2 +-
 src/nub.ts                                    |  3 +-
 src/pab/pab_chute.ts                          |  2 +-
 src/pab/pab_dimension.ts                      |  2 +-
 src/pab/pab_nombre.ts                         |  2 +-
 src/pab/pab_puissance.ts                      |  2 +-
 src/regime_uniforme.ts                        |  4 +--
 src/remous.ts                                 | 28 +++++++++----------
 src/structure/parallel_structure.ts           |  2 +-
 src/structure/structure.ts                    | 12 ++++----
 src/structure/structure_cem88d.ts             |  2 +-
 src/structure/structure_cem88v.ts             |  2 +-
 src/structure/structure_cunge80.ts            |  2 +-
 src/structure/structure_kivi.ts               |  2 +-
 src/structure/structure_orifice_submerged.ts  |  2 +-
 .../structure_rectangular_orifice_free.ts     |  2 +-
 ...structure_rectangular_orifice_submerged.ts |  2 +-
 .../structure_triangular_trunc_weir_free.ts   |  2 +-
 .../structure_triangular_weir_free.ts         |  2 +-
 src/structure/structure_weir_free.ts          |  2 +-
 .../structure_weir_submerged_larinier.ts      |  2 +-
 src/util/result.ts                            | 20 +++++++++----
 26 files changed, 59 insertions(+), 50 deletions(-)

diff --git a/spec/nubtest.ts b/spec/nubtest.ts
index 6a0f699a..2044b7db 100644
--- a/spec/nubtest.ts
+++ b/spec/nubtest.ts
@@ -40,7 +40,7 @@ export class NubTest extends Nub {
 
     public Equation(): Result {
         // C = A+B
-        return new Result(this.prms.A.v + this.prms.B.v);
+        return new Result(this.prms.A.v + this.prms.B.v, this);
     }
 
     protected setParametersCalculability() {
diff --git a/spec/structure/structure_test.ts b/spec/structure/structure_test.ts
index 33f2462c..d574a9fa 100644
--- a/spec/structure/structure_test.ts
+++ b/spec/structure/structure_test.ts
@@ -36,7 +36,7 @@ class StructureTest extends Structure {
         Structure.CheckEquation(sVarCalc);
         const data = this.getResultData();
 
-        return new Result(this.prms.Z1.v - this.prms.Z2.v - this.prms.ZDV.v, data);
+        return new Result(this.prms.Z1.v - this.prms.Z2.v - this.prms.ZDV.v, this, data);
     }
 
     /**
diff --git a/src/cond_distri.ts b/src/cond_distri.ts
index 1b97c1bd..0fd13ae6 100644
--- a/src/cond_distri.ts
+++ b/src/cond_distri.ts
@@ -98,7 +98,7 @@ export class ConduiteDistrib extends Nub {
                 throw new Error("ConduiteDistrib.Equation() : invalid parameter name " + sVarCalc);
         }
 
-        return new Result(v);
+        return new Result(v, this);
     }
 
     /**
diff --git a/src/lechaptcalmon.ts b/src/lechaptcalmon.ts
index a00363fc..fba3f127 100644
--- a/src/lechaptcalmon.ts
+++ b/src/lechaptcalmon.ts
@@ -121,7 +121,7 @@ export class LechaptCalmon extends Nub {
                 throw new Error("LechaptCalmon.Equation() : invalid variable name " + sVarCalc);
         }
 
-        return new Result(v);
+        return new Result(v, this);
     }
 
     /**
diff --git a/src/macrorugo/macrorugo.ts b/src/macrorugo/macrorugo.ts
index 97fa19e0..f2cdd025 100644
--- a/src/macrorugo/macrorugo.ts
+++ b/src/macrorugo/macrorugo.ts
@@ -120,7 +120,7 @@ export class MacroRugo extends Nub {
 
     public Equation(sVarCalc: string): Result {
         const Q = uniroot(this.resolveQ, this, 0, 1E7) * this.prms.B.v;
-        return new Result(Q);
+        return new Result(Q, this);
     }
 
     /**
diff --git a/src/nub.ts b/src/nub.ts
index b0be7702..26dbc8a8 100644
--- a/src/nub.ts
+++ b/src/nub.ts
@@ -326,7 +326,8 @@ export abstract class Nub extends ComputeNode implements IObservable {
             const nbValues = variatedValues.valuesIterator.count();
             progressStep = remainingProgress / nbValues;
 
-            const res = new Result();
+            const res = new Result(undefined, this);
+
             variatedValues.initValuesIterator(false);
             while (variatedValues.hasNext) {
                 variatedValues.next();
diff --git a/src/pab/pab_chute.ts b/src/pab/pab_chute.ts
index 37f8b21f..55275db5 100644
--- a/src/pab/pab_chute.ts
+++ b/src/pab/pab_chute.ts
@@ -75,7 +75,7 @@ export class PabChute extends Nub {
                 throw new Error("PabChute.Equation() : invalid variable name " + sVarCalc);
         }
 
-        return new Result(v);
+        return new Result(v, this);
     }
 
     /**
diff --git a/src/pab/pab_dimension.ts b/src/pab/pab_dimension.ts
index 355f806a..036aa498 100644
--- a/src/pab/pab_dimension.ts
+++ b/src/pab/pab_dimension.ts
@@ -86,7 +86,7 @@ export class PabDimension extends Nub {
                 throw new Error("PabDimension.Equation() : invalid variable name " + sVarCalc);
         }
 
-        return new Result(v);
+        return new Result(v, this);
     }
 
     /**
diff --git a/src/pab/pab_nombre.ts b/src/pab/pab_nombre.ts
index 1318dc1b..f843c767 100644
--- a/src/pab/pab_nombre.ts
+++ b/src/pab/pab_nombre.ts
@@ -77,7 +77,7 @@ export class PabNombre extends Nub {
                 throw new Error("PabNombre.Equation() : invalid variable name " + sVarCalc);
         }
 
-        const r = new Result(v);
+        const r = new Result(v, this);
         r.extraResults.DHR = DHR;
 
         return r;
diff --git a/src/pab/pab_puissance.ts b/src/pab/pab_puissance.ts
index e02dbc95..cc5c9afa 100644
--- a/src/pab/pab_puissance.ts
+++ b/src/pab/pab_puissance.ts
@@ -76,7 +76,7 @@ export class PabPuissance extends Nub {
                 throw new Error("PabPuissance.Equation() : invalid variable name " + sVarCalc);
         }
 
-        return new Result(v);
+        return new Result(v, this);
     }
 
     /**
diff --git a/src/regime_uniforme.ts b/src/regime_uniforme.ts
index d4d003a9..a2003e2e 100644
--- a/src/regime_uniforme.ts
+++ b/src/regime_uniforme.ts
@@ -42,7 +42,7 @@ export class RegimeUniforme extends Nub {
      */
     private Calc_Qn(): Result {
         if (this.Sn.prms.If.v <= 0) {
-            return new Result(0);
+            return new Result(0, this);
         }
 
         const rR: Result = this.Sn.Calc("R", this.Sn.prms.Y.v);
@@ -56,7 +56,7 @@ export class RegimeUniforme extends Nub {
         }
 
         const v = this.Sn.prms.Ks.v * Math.pow(rR.vCalc, 2 / 3) * rS.vCalc * Math.sqrt(this.Sn.prms.If.v);
-        return new Result(v);
+        return new Result(v, this);
     }
 
 }
diff --git a/src/remous.ts b/src/remous.ts
index 8221977d..2276f0f5 100644
--- a/src/remous.ts
+++ b/src/remous.ts
@@ -133,7 +133,7 @@ export class CourbeRemous extends Nub {
         // "tRes": { [key: number]: number }
         // }
         Result {
-        const res = new Result();
+        const res = new Result(undefined, this);
 
         // let Yc: number = this.Sn.Calc("Yc");
         const rYC = this.Sn.Calc("Yc");
@@ -511,7 +511,7 @@ export class CourbeRemous extends Nub {
             }
 
             const res: number = rHS.vCalc - rJ.vCalc / 2 * this.Dx;
-            return new Result(res);
+            return new Result(res, this);
         }
 
         throw new Error("CourbeRemous.Equation() : parameter " + sVarCalc + " not allowed");
@@ -621,7 +621,7 @@ export class CourbeRemous extends Nub {
         }
 
         const v = - (this.prmSect.If.v - rJ.vCalc) / (1 - Math.pow(rFR.vCalc, 2));
-        return new Result(v);
+        return new Result(v, this);
     }
 
     /**
@@ -631,7 +631,7 @@ export class CourbeRemous extends Nub {
      */
     private Calc_Y_EulerExplicite(Y: number): Result {
         if (!this.Sn.HautCritique.ok) {
-            return new Result(new Message(MessageCode.WARNING_REMOUS_ARRET_CRITIQUE));
+            return new Result(new Message(MessageCode.WARNING_REMOUS_ARRET_CRITIQUE), this);
         }
 
         // L'appel à Calc('J') avec Y en paramètre réinitialise toutes les données dépendantes de la ligne d'eau
@@ -644,7 +644,7 @@ export class CourbeRemous extends Nub {
         // let Y2 = Y + this.Dx * this.Calc_dYdX(Y);
         const Y2 = Y + this.Dx * rDXDY.vCalc;
 
-        return new Result(Y2);
+        return new Result(Y2, this);
     }
 
     /**
@@ -654,7 +654,7 @@ export class CourbeRemous extends Nub {
      */
     private Calc_Y_RK4(Y: number): Result {
         if (!this.Sn.HautCritique.ok) {
-            return new Result(new Message(MessageCode.WARNING_REMOUS_ARRET_CRITIQUE));
+            return new Result(new Message(MessageCode.WARNING_REMOUS_ARRET_CRITIQUE), this);
         }
 
         // L'appel à Calc('J') avec Y en paramètre réinitialise toutes les données dépendantes de la ligne d'eau
@@ -670,7 +670,7 @@ export class CourbeRemous extends Nub {
         const hc = this.Sn.HautCritique.vCalc;
 
         if (XOR(rDx > 0, !(Y + rDx / 2 * k1 < hc))) {
-            return new Result(new Message(MessageCode.WARNING_REMOUS_ARRET_CRITIQUE));
+            return new Result(new Message(MessageCode.WARNING_REMOUS_ARRET_CRITIQUE), this);
         }
 
         // let k2 = this.Calc_dYdX(Y + Dx / 2 * k1);
@@ -681,7 +681,7 @@ export class CourbeRemous extends Nub {
         const k2 = rDXDY2.vCalc;
 
         if (XOR(rDx > 0, !(Y + rDx / 2 * k2 < hc))) {
-            return new Result(new Message(MessageCode.WARNING_REMOUS_ARRET_CRITIQUE));
+            return new Result(new Message(MessageCode.WARNING_REMOUS_ARRET_CRITIQUE), this);
         }
 
         // let k3 = this.Calc_dYdX(Y + Dx / 2 * k2);
@@ -692,7 +692,7 @@ export class CourbeRemous extends Nub {
         const k3 = rDXDY3.vCalc;
 
         if (XOR(rDx > 0, !(Y + rDx / 2 * k3 < hc))) {
-            return new Result(new Message(MessageCode.WARNING_REMOUS_ARRET_CRITIQUE));
+            return new Result(new Message(MessageCode.WARNING_REMOUS_ARRET_CRITIQUE), this);
         }
 
         // let k4 = this.Calc_dYdX(Y + Dx * k3);
@@ -707,10 +707,10 @@ export class CourbeRemous extends Nub {
 
         // if ($this ->rDx > 0 xor !($Yout < $this ->oSect ->rHautCritique)) { return false; }
         if (XOR(rDx > 0, !(Yout < hc))) {
-            const res = new Result(new Message(MessageCode.WARNING_REMOUS_ARRET_CRITIQUE));
+            const res = new Result(new Message(MessageCode.WARNING_REMOUS_ARRET_CRITIQUE), this);
         }
 
-        return new Result(Yout);
+        return new Result(Yout, this);
     }
 
     /**
@@ -720,7 +720,7 @@ export class CourbeRemous extends Nub {
      */
     private Calc_Y_Trapez(Y: number): Result {
         if (!this.Sn.HautCritique.ok) {
-            return new Result(new Message(MessageCode.WARNING_REMOUS_ARRET_CRITIQUE));
+            return new Result(new Message(MessageCode.WARNING_REMOUS_ARRET_CRITIQUE), this);
         }
 
         const dicho = new Dichotomie(this, "Y", this._debugDicho, "Hs");
@@ -747,7 +747,7 @@ export class CourbeRemous extends Nub {
             return r;
         }
 
-        // return new Result(Y2);
+        // return new Result(Y2, this);
         return r;
     }
 
@@ -777,7 +777,7 @@ export class CourbeRemous extends Nub {
         }
 
         if (!res.ok || XOR(this.Dx > 0, !(res.vCalc < this.Sn.HautCritique.vCalc))) {
-            return new Result(new Message(MessageCode.WARNING_REMOUS_ARRET_CRITIQUE));
+            return new Result(new Message(MessageCode.WARNING_REMOUS_ARRET_CRITIQUE), this);
         }
 
         return res;
diff --git a/src/structure/parallel_structure.ts b/src/structure/parallel_structure.ts
index f2c3eedf..64295d2c 100644
--- a/src/structure/parallel_structure.ts
+++ b/src/structure/parallel_structure.ts
@@ -213,7 +213,7 @@ export class ParallelStructure extends Nub {
                 );
             }
         }
-        const calcRes: Result = new Result(0);
+        const calcRes: Result = new Result(0, this);
         let qTot: number = 0;
         for (let i = 0; i < this._structures.length; i++) {
             if (i !== iExcept) {
diff --git a/src/structure/structure.ts b/src/structure/structure.ts
index f811fbef..dd72feb8 100644
--- a/src/structure/structure.ts
+++ b/src/structure/structure.ts
@@ -184,21 +184,21 @@ export abstract class Structure extends Nub {
                             ENUM_StructureFlowRegime: StructureFlowRegime.NULL };
         if (sVarCalc === "Q") {
             if (this.prms.h1.v <= 0 || this.prms.Z1.v === this.prms.Z2.v || this.prms.W.v <= 0) {
-                return new Result(0, flagsNull);
+                return new Result(0, this, flagsNull);
             }
         } else if (this.prms.Q.v === 0) {
             // Débit nul <=> tirant d'eau amont = tirant d'eau aval ou tout autre paramètre nul
             switch (sVarCalc) {
                 case "Z1":
-                    return new Result(this.prms.Z2.v, flagsNull);
+                    return new Result(this.prms.Z2.v, this, flagsNull);
                 case "Z2":
-                    return new Result(this.prms.Z1.v, flagsNull);
+                    return new Result(this.prms.Z1.v, this, flagsNull);
                 default:
                     // Est-ce toujours vrai ? Nécessitera peut-être d'étendre la méthode
-                    return new Result(0, flagsNull);
+                    return new Result(0, this, flagsNull);
             }
         } else if (this.prms.W.v === 0 && sVarCalc === "Z1") {
-            return new Result(Infinity, flagsNull); // Si la vanne est fermée la cote amont est infinie
+            return new Result(Infinity, this, flagsNull); // Si la vanne est fermée la cote amont est infinie
         }
 
         // Gestion du cas d'écoulement impossible Z1 > Z2 et Q <= 0
@@ -216,7 +216,7 @@ export abstract class Structure extends Nub {
                     default:
                         rPrm = 0;
                 }
-                const res: Result = new Result(new Message(MessageCode.ERROR_STRUCTURE_Q_TROP_ELEVE), flagsNull);
+                const res: Result = new Result(new Message(MessageCode.ERROR_STRUCTURE_Q_TROP_ELEVE), this, flagsNull);
                 res.vCalc = rPrm;
 
                 // "Les cotes et le débit ne sont pas cohérents => fermeture de l'ouvrage
diff --git a/src/structure/structure_cem88d.ts b/src/structure/structure_cem88d.ts
index 23c3a824..94079c52 100644
--- a/src/structure/structure_cem88d.ts
+++ b/src/structure/structure_cem88d.ts
@@ -64,7 +64,7 @@ export class StructureWeirCem88d extends RectangularStructure {
             "StructureWeirCem88d.Equation(h1=" + this.prms.h1.v + ",h2="
             + this.prms.h2.v + ",W=" + this.prms.W.v + ") => Q=" + v);
 
-        return new Result(v, data);
+        return new Result(v, this, data);
     }
 }
 
diff --git a/src/structure/structure_cem88v.ts b/src/structure/structure_cem88v.ts
index a16139b1..886ee53d 100644
--- a/src/structure/structure_cem88v.ts
+++ b/src/structure/structure_cem88v.ts
@@ -66,7 +66,7 @@ export class StructureWeirCem88v extends RectangularStructure {
             "StructureWeirCem88v.Equation(h1=" + this.prms.h1.v
             + ",h2=" + this.prms.h2.v + ",W=" + this.prms.W.v + ") => Q=" + v);
 
-        return new Result(v, data);
+        return new Result(v, this, data);
     }
 
     /**
diff --git a/src/structure/structure_cunge80.ts b/src/structure/structure_cunge80.ts
index 90397455..7da97719 100644
--- a/src/structure/structure_cunge80.ts
+++ b/src/structure/structure_cunge80.ts
@@ -52,7 +52,7 @@ export class StructureCunge80 extends RectangularStructure {
                 }
         }
 
-        return new Result(v, data);
+        return new Result(v, this, data);
     }
 
     protected getFlowRegime() {
diff --git a/src/structure/structure_kivi.ts b/src/structure/structure_kivi.ts
index 797f184f..06de167a 100644
--- a/src/structure/structure_kivi.ts
+++ b/src/structure/structure_kivi.ts
@@ -22,7 +22,7 @@ export class StructureKivi extends Structure {
 
     public Equation(sVarCalc: string): Result {
         Structure.CheckEquation(sVarCalc);
-        const res: Result = new Result(0, this.getResultData());
+        const res: Result = new Result(0, this, this.getResultData());
 
         // p : pelle
         let p: number = this.prms.ZDV.v - this.prms.ZRAM.v;
diff --git a/src/structure/structure_orifice_submerged.ts b/src/structure/structure_orifice_submerged.ts
index 3350831d..67ec3d61 100644
--- a/src/structure/structure_orifice_submerged.ts
+++ b/src/structure/structure_orifice_submerged.ts
@@ -32,7 +32,7 @@ export class StructureOrificeSubmerged extends Structure {
 
         const v = this.prms.Cd.v * this.prms.S.v * Structure.R2G * Math.sqrt(this.prms.Z1.v - this.prms.Z2.v);
 
-        return new Result(v, data);
+        return new Result(v, this, data);
     }
 
     public calcA(): number {
diff --git a/src/structure/structure_rectangular_orifice_free.ts b/src/structure/structure_rectangular_orifice_free.ts
index 9bb18b97..5b89e0a2 100644
--- a/src/structure/structure_rectangular_orifice_free.ts
+++ b/src/structure/structure_rectangular_orifice_free.ts
@@ -26,7 +26,7 @@ export class StructureRectangularOrificeFree extends RectangularStructure {
         const v = this.prms.Cd.v * Math.min(this.prms.W.v, this.prms.h1.v) * this.prms.L.v
             * Structure.R2G * Math.sqrt(this.prms.h1.v);
 
-        return new Result(v, data);
+        return new Result(v, this, data);
     }
 
     protected getFlowRegime() {
diff --git a/src/structure/structure_rectangular_orifice_submerged.ts b/src/structure/structure_rectangular_orifice_submerged.ts
index fe775d2d..bb71b307 100644
--- a/src/structure/structure_rectangular_orifice_submerged.ts
+++ b/src/structure/structure_rectangular_orifice_submerged.ts
@@ -29,7 +29,7 @@ export class StructureRectangularOrificeSubmerged extends RectangularStructure {
         const v = this.prms.Cd.v * Math.min(this.prms.W.v, this.prms.h1.v) * this.prms.L.v
             * Structure.R2G * Math.sqrt(this.prms.h1.v - this.prms.h2.v);
 
-        return new Result(v, data);
+        return new Result(v, this, data);
     }
 
     protected getFlowRegime() {
diff --git a/src/structure/structure_triangular_trunc_weir_free.ts b/src/structure/structure_triangular_trunc_weir_free.ts
index c3a6a21f..85fc1704 100644
--- a/src/structure/structure_triangular_trunc_weir_free.ts
+++ b/src/structure/structure_triangular_trunc_weir_free.ts
@@ -36,7 +36,7 @@ export class StructureTriangularTruncWeirFree extends Structure {
             v = v * (Math.pow(this.prms.h1.v, 2.5) - Math.pow(this.prms.Z1.v - this.prms.ZT.v, 2.5));
         }
 
-        return new Result(v, data);
+        return new Result(v, this, data);
     }
 
     /**
diff --git a/src/structure/structure_triangular_weir_free.ts b/src/structure/structure_triangular_weir_free.ts
index beb63a2b..fe1b429b 100644
--- a/src/structure/structure_triangular_weir_free.ts
+++ b/src/structure/structure_triangular_weir_free.ts
@@ -32,7 +32,7 @@ export class StructureTriangularWeirFree extends Structure {
         const v = this.prms.Cd.v * this.getTanFromDegrees(this.prms.alpha2.v)
             * Math.pow(this.prms.h1.v, 2.5);
 
-        return new Result(v, data);
+        return new Result(v, this, data);
     }
 
     /**
diff --git a/src/structure/structure_weir_free.ts b/src/structure/structure_weir_free.ts
index 444dc372..4346adbb 100644
--- a/src/structure/structure_weir_free.ts
+++ b/src/structure/structure_weir_free.ts
@@ -19,7 +19,7 @@ export class StructureWeirFree extends RectangularStructure {
 
         const v = this.prms.Cd.v * this.prms.L.v * Structure.R2G * Math.pow(this.prms.h1.v, 1.5);
 
-        return new Result(v, data);
+        return new Result(v, this, data);
     }
 
     protected getFlowRegime() {
diff --git a/src/structure/structure_weir_submerged_larinier.ts b/src/structure/structure_weir_submerged_larinier.ts
index f3468ac4..afb6ec39 100644
--- a/src/structure/structure_weir_submerged_larinier.ts
+++ b/src/structure/structure_weir_submerged_larinier.ts
@@ -22,7 +22,7 @@ export class StructureWeirSubmergedLarinier extends RectangularStructure {
         const v = this.prms.Cd.v * this.prms.L.v * Structure.R2G
             * this.prms.h1.v * Math.sqrt(this.prms.h1.v - this.prms.h2.v);
 
-        return new Result(v, data);
+        return new Result(v, this, data);
     }
 
     protected getFlowRegime() {
diff --git a/src/util/result.ts b/src/util/result.ts
index e4054ee1..aeff1093 100644
--- a/src/util/result.ts
+++ b/src/util/result.ts
@@ -1,4 +1,5 @@
 import { JalhydObject } from "../jalhyd_object";
+import { Nub } from "../nub";
 import { ParamFamily } from "../param/param-definition";
 import {
     INamedIterableValues,
@@ -17,12 +18,15 @@ import { ResultElement } from "./resultelement";
 // tslint:disable-next-line:max-classes-per-file
 export class Result extends JalhydObject implements INamedIterableValues {
 
-    /** nom de la variable/paramètre calculé */
+    /** nom de la variable/paramètre calculé (= symbol) */
     public name: string;
 
     /** "parameters" family, for linked parameters */
     public family: ParamFamily;
 
+    /** Nub that produced this result */
+    private _sourceNub: Nub;
+
     /**
      * Messages (erreurs, infos, ...)
      */
@@ -35,7 +39,7 @@ export class Result extends JalhydObject implements INamedIterableValues {
      */
     private _iterator: INumberIterator;
 
-    constructor(v?: number | Message | ResultElement, d?: any) {
+    constructor(v?: number | Message | ResultElement, sourceNub?: Nub, extraResults?: any) {
         super();
         this._globalLog = new cLog();
         this._resultElements = [];
@@ -44,9 +48,9 @@ export class Result extends JalhydObject implements INamedIterableValues {
         } else if (v instanceof ResultElement) {
             this._resultElements.push(v);
         }
-
-        if (d !== undefined) {
-            this.resultElement.extraResults = d;
+        this._sourceNub = sourceNub;
+        if (extraResults !== undefined) { // for setter
+            this.resultElement.extraResults = extraResults;
         }
     }
 
@@ -93,6 +97,10 @@ export class Result extends JalhydObject implements INamedIterableValues {
         return this._resultElements.length > 0;
     }
 
+    public get sourceNub(): Nub {
+        return this._sourceNub;
+    }
+
     /**
      * @return le résultat de calcul du 1er ResultElement
      */
@@ -138,7 +146,7 @@ export class Result extends JalhydObject implements INamedIterableValues {
         if (i < 0 || i >= this._resultElements.length) {
             throw new Error("Result.extractResult index outside [0;" + (this._resultElements.length - 1) + "]");
         }
-        return new Result(this._resultElements[i]);
+        return new Result(this._resultElements[i], this._sourceNub);
     }
 
     /**
-- 
GitLab