diff --git a/ivette/src/dome/misc/utils.ts b/ivette/src/dome/misc/utils.ts index 5b50773ecfb3b0ae659ef7c7a2a5d2b1425c1901..ef42f769067080dc22b7b72d0c3ac8577458bc41 100644 --- a/ivette/src/dome/misc/utils.ts +++ b/ivette/src/dome/misc/utils.ts @@ -109,4 +109,24 @@ export function styles( return (empty ? undefined : buffer); } + +export type Indexed = { key: unknown; } + +export function mergeArrays<A, B>( + a1: Array<A>, + a2: Array<B>, + match: (x1: A, x2: B) => boolean +): Array<A & Partial<B>> { + return a1.map(x1 => ({...x1, ...(a2.find(x2 => match(x1, x2)))})); +} + +export function mergeArraysByKey<A, B>( + a1: Array<A & Indexed>, + a2: Array<B & Indexed> +): Array<A & Partial<B>> { + return mergeArrays(a1, a2, (x1, x2) => x1.key === x2.key); +} + + + // -------------------------------------------------------------------------- diff --git a/ivette/src/frama-c/kernel/Properties.tsx b/ivette/src/frama-c/kernel/Properties.tsx index 3cbb14f26fb42e0cef7926e76ddcc372a10b378c..ade4f90ab6d1269c3841c4137f3be3c93d40f507 100644 --- a/ivette/src/frama-c/kernel/Properties.tsx +++ b/ivette/src/frama-c/kernel/Properties.tsx @@ -28,6 +28,7 @@ import _ from 'lodash'; import React, { useEffect } from 'react'; import * as Dome from 'dome'; import * as Json from 'dome/data/json'; +import * as Utils from 'dome/misc/utils'; import * as States from 'frama-c/states'; import * as Compare from 'dome/data/compare'; import * as Settings from 'dome/data/settings'; @@ -613,10 +614,7 @@ export default function RenderProperties(): JSX.Element { useEffect(() => { model.removeAllData(); - const data = kernelData.map(entry1 => ({ - ...entry1, - ...(evaData.find(entry2 => entry2.key === entry1.key)) - })); + const data = Utils.mergeArraysByKey(kernelData, evaData); model.updateData(data); model.reload(); }, [model, kernelData, evaData]);