84 lines
2.5 KiB
JavaScript
84 lines
2.5 KiB
JavaScript
import parameters from './load-parameters'
|
|
import deepAssign from 'deep-assign'
|
|
import R from 'ramda'
|
|
|
|
/* Fonctions utiles */
|
|
let
|
|
hasHistoryProp = R.pipe(JSON.stringify, R.contains('"historique":')),
|
|
itemHasHistoricProp = (item, prop) => R.has(prop)(item) && hasHistoryProp(item[prop]),
|
|
itemIsCalculable = item => false
|
|
|| itemHasHistoricProp(item, 'linear')
|
|
|| itemHasHistoricProp(item, 'marginalRateTaxScale')
|
|
|| item['+'] || item['-']
|
|
|| item['logique'] || item['logique numérique']
|
|
,
|
|
|
|
/*
|
|
L'attribut tags est une hash map,
|
|
ou une liste
|
|
- de clés, qui sont un moyen courant d'exprimer [clef]: oui
|
|
- de hash maps.
|
|
Cette fonction fusionne tout ceci dans un objet
|
|
|
|
*/
|
|
handleHybridTags = R.when(R.isArrayLike,
|
|
R.reduce((final, tag) =>
|
|
R.merge(final, R.is(Object, tag) ? tag : {[tag]: 'oui'})
|
|
, {})
|
|
),
|
|
|
|
tagsConflict = (tags1, tags2) =>
|
|
R.compose(
|
|
R.any(R.identity),
|
|
R.values,
|
|
R.mapObjIndexed((tagValue, tag) => tags2[tag] != undefined && tags2[tag] !== tagValue)
|
|
)(tags1)
|
|
|
|
let
|
|
groupedItemsByVariable = R.pipe(
|
|
// Desugar tags
|
|
R.map(p => R.merge(p, {tags: handleHybridTags(p.tags) || {}})),
|
|
R.groupBy(R.prop('variable'))
|
|
)(parameters),
|
|
mergedItemsByVariable =
|
|
R.mapObjIndexed((variableItems, name) => {
|
|
/* Les items sont des fragments de variables.
|
|
Les premiers fragments vont être fusionnés dans les suivants,
|
|
sauf s'ils provoquent l'écrasement d'un tag */
|
|
let mergedVariableItems = R.tail(variableItems) // Le premier ne peut être étendu
|
|
.reduce((mergedItems, item) =>
|
|
[ ...mergedItems,
|
|
mergedItems.reduce((final, higherLevelItem) => {
|
|
let oups = tagsConflict(higherLevelItem.tags, item.tags)
|
|
return oups ? item : deepAssign({}, item, higherLevelItem)
|
|
}, item)
|
|
], R.of(R.head(variableItems)))
|
|
|
|
return {
|
|
name,
|
|
// La variable de haut niveau, contenant la plupart du temps une description, etc.
|
|
first: R.head(variableItems),
|
|
// Tous les tags qui peuvent être trouvés dans les items de cette variable
|
|
tags: R.pipe(
|
|
R.pluck('tags'),
|
|
R.map(R.map(R.of)),
|
|
R.reduce(R.mergeWith(R.union), {})
|
|
)(variableItems),
|
|
// Gardons seulement les variables ayant une implémentation : capable de faire un calcul
|
|
calculable: R.filter(itemIsCalculable)(mergedVariableItems)
|
|
}}
|
|
)(groupedItemsByVariable),
|
|
mergedItems = R.values(mergedItemsByVariable),
|
|
calculableItems =
|
|
R.pipe(
|
|
R.values,
|
|
R.pluck('calculable'),
|
|
R.unnest
|
|
)(mergedItemsByVariable)
|
|
|
|
export {
|
|
groupedItemsByVariable,
|
|
calculableItems,
|
|
mergedItems
|
|
}
|