// contrat.ts — le contrat d'un moteur (SPEC phase 1 §4.1). // // Quatre règles opposables au code : // ① `calculer` ne lit ni réseau, ni disque, ni horloge, ni DOM, ni variable // globale, ni aléa : mêmes entrées + mêmes données = même résultat. // ② les données entrent en paramètre, validées à la frontière par l'appelant // (`valider(table, json)`) ; // ③ aucun prix, aucun barème dans le paquet ; // ④ toute valeur par défaut appliquée est déclarée dans `avertissements`, // toute constante utilisée dans `sources`. /** * Collecteur de sources et d'avertissements d'un calcul. Une source est * enregistrée une fois par clé (la première valeur gagne) ; un avertissement * une fois par texte. Objet interne, sans I/O. */ export class Trace { sources = new Map(); avertissements = new Set(); source(cle, valeur, source, date) { if (!this.sources.has(cle)) this.sources.set(cle, { cle, valeur, source, date }); } avertit(texte) { this.avertissements.add(texte); } /** Verse dans ce collecteur les sources et avertissements d'un autre résultat. */ absorbe(autre) { for (const s of autre.sources) this.source(s.cle, s.valeur, s.source, s.date); for (const a of autre.avertissements) this.avertit(a); } resultat(sorties, version) { return { sorties, sources: [...this.sources.values()], avertissements: [...this.avertissements], version, }; } }