diff --git a/packages/app/src/providers/h5grove/__snapshots__/h5grove-api.test.ts.snap b/packages/app/src/providers/h5grove/__snapshots__/h5grove-api.test.ts.snap index fe0a7958e..8c7ec5987 100644 --- a/packages/app/src/providers/h5grove/__snapshots__/h5grove-api.test.ts.snap +++ b/packages/app/src/providers/h5grove/__snapshots__/h5grove-api.test.ts.snap @@ -1720,8 +1720,8 @@ exports[`test file matches snapshot 1`] = ` }, "class": "Enumeration", "mapping": { - "A": 0, - "B": 1, + "0": "A", + "1": "B", }, }, "value": 1, @@ -1753,8 +1753,8 @@ exports[`test file matches snapshot 1`] = ` }, "class": "Enumeration", "mapping": { - "A": 256, - "B": 257, + "256": "A", + "257": "B", }, }, "value": 256, @@ -1789,9 +1789,9 @@ exports[`test file matches snapshot 1`] = ` }, "class": "Enumeration", "mapping": { - "A": 0, - "B": 1, - "C": 2, + "0": "A", + "1": "B", + "2": "C", }, }, "value": Uint8Array [ @@ -1838,9 +1838,9 @@ exports[`test file matches snapshot 1`] = ` }, "class": "Enumeration", "mapping": { - "A": 0, - "B": 1, - "C": 2, + "0": "A", + "1": "B", + "2": "C", }, }, "value": Uint8Array [ diff --git a/packages/app/src/providers/hsds/utils.ts b/packages/app/src/providers/hsds/utils.ts index 6379994df..cc1fce295 100644 --- a/packages/app/src/providers/hsds/utils.ts +++ b/packages/app/src/providers/hsds/utils.ts @@ -17,13 +17,11 @@ import type { } from '@h5web/shared/hdf5-models'; import { DTypeClass } from '@h5web/shared/hdf5-models'; import { - boolType, compoundType, cplxType, - enumType, + enumOrBoolType, floatType, intType, - isBoolEnumType, strType, uintType, unknownType, @@ -123,9 +121,7 @@ function convertHsdsCompoundType( function convertHsdsEnumType(hsdsType: HsdsEnumType): EnumType | BooleanType { const { base, mapping } = hsdsType; assertHsdsNumericType(base); - - const type = enumType(convertHsdsNumericType(base), mapping); - return isBoolEnumType(type) ? boolType() : type; // booleans stored as enums by h5py + return enumOrBoolType(convertHsdsNumericType(base), mapping); } export function convertHsdsType(hsdsType: HsdsType): DType { diff --git a/packages/h5wasm/src/__snapshots__/h5wasm-api.test.ts.snap b/packages/h5wasm/src/__snapshots__/h5wasm-api.test.ts.snap index c96a289e0..9939b822f 100644 --- a/packages/h5wasm/src/__snapshots__/h5wasm-api.test.ts.snap +++ b/packages/h5wasm/src/__snapshots__/h5wasm-api.test.ts.snap @@ -1966,8 +1966,8 @@ exports[`test file matches snapshot 1`] = ` }, "class": "Enumeration", "mapping": { - "A": 0, - "B": 1, + "0": "A", + "1": "B", }, }, "value": 1, @@ -1999,8 +1999,8 @@ exports[`test file matches snapshot 1`] = ` }, "class": "Enumeration", "mapping": { - "A": 256, - "B": 257, + "256": "A", + "257": "B", }, }, "value": 256, @@ -2035,9 +2035,9 @@ exports[`test file matches snapshot 1`] = ` }, "class": "Enumeration", "mapping": { - "A": 0, - "B": 1, - "C": 2, + "0": "A", + "1": "B", + "2": "C", }, }, "value": Uint8Array [ @@ -2084,9 +2084,9 @@ exports[`test file matches snapshot 1`] = ` }, "class": "Enumeration", "mapping": { - "A": 0, - "B": 1, - "C": 2, + "0": "A", + "1": "B", + "2": "C", }, }, "value": Uint8Array [ diff --git a/packages/shared/src/hdf5-models.ts b/packages/shared/src/hdf5-models.ts index 8c5b20b72..4e18a3c99 100644 --- a/packages/shared/src/hdf5-models.ts +++ b/packages/shared/src/hdf5-models.ts @@ -175,7 +175,7 @@ export interface ArrayType { export interface EnumType { class: DTypeClass.Enum; base: NumericType; // technically, only int/uint - mapping: Record; + mapping: Record; } export interface TimeType { diff --git a/packages/shared/src/hdf5-utils.ts b/packages/shared/src/hdf5-utils.ts index b62638485..d4dae41ae 100644 --- a/packages/shared/src/hdf5-utils.ts +++ b/packages/shared/src/hdf5-utils.ts @@ -143,29 +143,31 @@ export function arrayType( export function enumType( baseType: NumericType, - mapping: Record, + hdf5Mapping: Record, ): EnumType { - return { class: DTypeClass.Enum, base: baseType, mapping }; -} - -export function isBoolEnumType(type: EnumType): boolean { - const { mapping } = type; - return ( - Object.keys(mapping).length === 2 && - mapping.FALSE === 0 && - mapping.TRUE === 1 - ); + return { + class: DTypeClass.Enum, + base: baseType, + // Swap mapping to optimise retrieval of enum keys from numeric values + mapping: Object.fromEntries( + Object.entries(hdf5Mapping).map(([k, v]) => [v, k]), + ), + }; } export function enumOrBoolType( baseType: NumericType, - mapping: Record, + hdf5Mapping: Record, ): EnumType | BooleanType { - if (mapping.FALSE === 0 && mapping.TRUE === 1) { + if ( + Object.keys(hdf5Mapping).length === 2 && + hdf5Mapping.FALSE === 0 && + hdf5Mapping.TRUE === 1 + ) { return boolType(); } - return enumType(baseType, mapping); + return enumType(baseType, hdf5Mapping); } export function timeType(): TimeType { diff --git a/packages/shared/src/vis-utils.ts b/packages/shared/src/vis-utils.ts index 9cf509304..574be11b4 100644 --- a/packages/shared/src/vis-utils.ts +++ b/packages/shared/src/vis-utils.ts @@ -77,12 +77,9 @@ export function createComplexFormatter( } export function createEnumFormatter( - mapping: Record, + mapping: Record, ): ValueFormatter { - return (value) => { - const entry = Object.entries(mapping).find(([, v]) => value === v); - return entry?.[0] || value.toString(); - }; + return (value) => (value in mapping ? mapping[value] : value.toString()); } export function getValues(arr: AnyNumArray): NumArray {