url-safe-bitpacking 0.1.15 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/README.md +6 -6
  2. package/dist/enums/dataTypes.d.ts +4 -9
  3. package/dist/factory/arrayFactory.d.ts +2 -0
  4. package/dist/factory/enumArrayFactory.d.ts +2 -2
  5. package/dist/factory/enumFactory.d.ts +2 -1
  6. package/dist/factory/enumOptionsFactory.d.ts +2 -0
  7. package/dist/factory/factory.d.ts +13 -7
  8. package/dist/factory/optionalFactory.d.ts +2 -0
  9. package/dist/factory/utils.d.ts +19 -0
  10. package/dist/index.d.ts +6 -5
  11. package/dist/index.js +465 -352
  12. package/dist/parsers/arrayParser.d.ts +4 -0
  13. package/dist/parsers/enumOptionsFactory.d.ts +4 -0
  14. package/dist/parsers/optionalParser.d.ts +4 -0
  15. package/dist/parsers/parsers.d.ts +16 -12
  16. package/dist/stateHandling/index.d.ts +1 -0
  17. package/dist/stateHandling/stateData.d.ts +3 -0
  18. package/dist/stateHandling/stateDataObject.d.ts +15 -0
  19. package/dist/typeFactory/stateDataTyping.d.ts +1 -9
  20. package/dist/types/arrayData.d.ts +10 -0
  21. package/dist/types/booleanData.d.ts +1 -2
  22. package/dist/types/dataEntry.d.ts +12 -5
  23. package/dist/types/enumArrayData.d.ts +3 -3
  24. package/dist/types/enumData.d.ts +4 -2
  25. package/dist/types/enumOptionsData.d.ts +8 -0
  26. package/dist/types/floatData.d.ts +1 -2
  27. package/dist/types/index.d.ts +7 -5
  28. package/dist/types/intData.d.ts +1 -2
  29. package/dist/types/optionalData.d.ts +7 -0
  30. package/dist/types/stateDataEntry.d.ts +16 -0
  31. package/dist/types/versionData.d.ts +1 -2
  32. package/dist/update/arrayUpdate.d.ts +2 -0
  33. package/dist/update/enumOptionsUpdate.d.ts +2 -0
  34. package/dist/update/nestedDataMatching.d.ts +2 -0
  35. package/dist/update/optionalUpdate.d.ts +2 -0
  36. package/dist/update/updateValues.d.ts +8 -1
  37. package/package.json +1 -1
  38. package/dist/objectmap/index.d.ts +0 -4
  39. package/dist/objectmap/stateDataModel.d.ts +0 -33
  40. package/dist/objectmap/stateValueHelperMethods.d.ts +0 -13
  41. package/dist/objectmap/userMethods.d.ts +0 -12
  42. package/dist/types/arrayDefinitions.d.ts +0 -58
  43. package/dist/types/semanticMapping.d.ts +0 -6
  44. package/dist/types/stateValueModel.d.ts +0 -33
package/dist/index.js CHANGED
@@ -1,18 +1,12 @@
1
1
  // src/enums/dataTypes.ts
2
- var DataType;
3
- ((DataType2) => {
4
- DataType2[DataType2["VERSION"] = 0] = "VERSION";
5
- DataType2[DataType2["BOOLEAN"] = 1] = "BOOLEAN";
6
- DataType2[DataType2["ENUM"] = 2] = "ENUM";
7
- DataType2[DataType2["INT"] = 3] = "INT";
8
- DataType2[DataType2["FLOAT"] = 4] = "FLOAT";
9
- DataType2[DataType2["ENUM_ARRAY"] = 5] = "ENUM_ARRAY";
10
- })(DataType ||= {});
2
+ var DataTypeValues = ["VERSION", "BOOLEAN", "ENUM", "INT", "FLOAT", "ENUM_ARRAY"];
3
+ var ComplexDataValues = ["OPTIONAL", "ENUM_OPTIONS", "ARRAY"];
11
4
  // src/types/floatData.ts
12
5
  var SignificandMaxBits = 20;
13
-
14
- // src/types/arrayDefinitions.ts
15
- var PREFIX_SEPERATOR_DELIMETER = "_";
6
+ // src/types/enumData.ts
7
+ var EnumMaxBits = 8;
8
+ // src/types/intData.ts
9
+ var IntegerMaxBits = 12;
16
10
  // src/types/dataEntry.ts
17
11
  var PROTECTED_ATTRIBUTE_NAMES = [
18
12
  "type",
@@ -26,14 +20,12 @@ var PROTECTED_ATTRIBUTE_NAMES = [
26
20
  "precision",
27
21
  "significand",
28
22
  "minCount",
29
- "maxCount"
23
+ "maxCount",
24
+ "state",
25
+ "stateBits",
26
+ "descriptor",
27
+ "mapping"
30
28
  ];
31
- // src/types/enumData.ts
32
- var EnumMaxBits = 8;
33
- // src/types/intData.ts
34
- var IntegerMaxBits = 12;
35
- // src/types/versionData.ts
36
- var VersionRange = [4, 6, 8, 10];
37
29
  // src/factory/helperMethod.ts
38
30
  var getBitsForIntegerNumber = (number, maxBits) => {
39
31
  const bitCount = Math.ceil(Math.log2(number));
@@ -41,14 +33,7 @@ var getBitsForIntegerNumber = (number, maxBits) => {
41
33
  throw new Error(`Cannot get ${maxBits} bits for a number with ${bitCount} bits`);
42
34
  return bitCount;
43
35
  };
44
- var getMinimumBitsForInteger = (v) => Math.ceil(Math.log2(v));
45
- var getVersionValueRangeValueForNumber = (v) => {
46
- const minBits = getMinimumBitsForInteger(v);
47
- const versionBits = VersionRange.find((x) => x >= minBits);
48
- if (versionBits === undefined)
49
- throw new Error(`Cannot find version range for ${v}, max amount of versions allowed is ${2 ** VersionRange[VersionRange.length - 1]}`);
50
- return versionBits;
51
- };
36
+ var getMinimumBitsForInteger = (v) => Math.ceil(Math.log2(v + 1));
52
37
 
53
38
  // src/factory/floatFactory.ts
54
39
  var create = (value, min = 0, max = 1, precision = 2, name = "", index = -1) => {
@@ -59,7 +44,7 @@ var create = (value, min = 0, max = 1, precision = 2, name = "", index = -1) =>
59
44
  const significand = Math.max(1, getBitsForIntegerNumber(delta, SignificandMaxBits));
60
45
  return {
61
46
  value,
62
- type: 4 /* FLOAT */,
47
+ type: "FLOAT",
63
48
  min: roundedMin / precisionMultiplier,
64
49
  max: roundedMax / precisionMultiplier,
65
50
  precision,
@@ -78,45 +63,66 @@ var create2 = (value, min = 0, max = 10, name = "", index = -1) => {
78
63
  if (Math.abs(max - min) > 2 ** IntegerMaxBits - 1)
79
64
  throw new Error("max - min must be less than 1024");
80
65
  const bits = getBitsForIntegerNumber(max - min + 1, IntegerMaxBits);
81
- return { value, type: 3 /* INT */, min, max, bits, name, index };
66
+ return { value, type: "INT", min, max, bits, name, index };
82
67
  };
83
68
 
84
69
  // src/factory/booleanFactory.ts
85
- var create3 = (value, name = "", index = -1) => ({ value, type: 1 /* BOOLEAN */, name, index });
70
+ var create3 = (value, name = "", index = -1) => ({
71
+ value,
72
+ type: "BOOLEAN",
73
+ name,
74
+ index
75
+ });
86
76
 
87
77
  // src/factory/versionFactory.ts
88
78
  var create4 = (value, bits = 8, name = "", index = -1) => ({
89
79
  value,
90
- type: 0 /* VERSION */,
80
+ type: "VERSION",
91
81
  bits,
92
82
  name,
93
83
  index
94
84
  });
95
85
 
86
+ // src/factory/utils.ts
87
+ var getEnumMaxAndMappingFromOptions = (options) => {
88
+ if (typeof options === "string")
89
+ return { max: options.length - 1, mapping: options.split("") };
90
+ if (typeof options === "number")
91
+ return { max: options, mapping: Array.from({ length: options + 1 }, (_, i) => i) };
92
+ return { max: options.length - 1, mapping: options };
93
+ };
94
+ var getOptionsFromMaxAndMapping = (v) => {
95
+ if (v.mapping.every((option) => typeof option === "string" && option.length === 1))
96
+ return v.mapping.join("");
97
+ if (Array.from({ length: v.max + 1 }, (_, i) => i).every((option, i) => option === v.mapping[i]))
98
+ return v.max;
99
+ return v.mapping;
100
+ };
101
+
96
102
  // src/factory/enumFactory.ts
97
- var create5 = (value, max = 10, name = "", index = -1) => {
103
+ var create5 = (value, options, name = "", index = -1) => {
104
+ const { max, mapping } = getEnumMaxAndMappingFromOptions(options);
98
105
  if (!Number.isInteger(max))
99
- throw new Error("min and max must be integers");
106
+ throw new Error(`max must be integers, you have given ${max}`);
100
107
  if (max < 1)
101
108
  throw new Error("max must be at least one");
102
109
  if (max > 2 ** EnumMaxBits - 1)
103
110
  throw new Error("max - min must be less than 256");
104
111
  const bits = getBitsForIntegerNumber(max + 1, EnumMaxBits);
105
- return { value, type: 2 /* ENUM */, max, bits, name, index };
112
+ return { value, type: "ENUM", max, bits, name, index, mapping };
106
113
  };
107
114
 
108
115
  // src/factory/enumArrayFactory.ts
109
- var create6 = (value, min = 0, max = 10, minCount = 1, maxCount = 10, name = "", index = -1) => {
110
- if (!Number.isInteger(min) || !Number.isInteger(max))
111
- throw new Error("min and max must be integers");
116
+ var create6 = (value, options, minCount = 1, maxCount = 10, name = "", index = -1) => {
117
+ const { max, mapping } = getEnumMaxAndMappingFromOptions(options);
118
+ if (!Number.isInteger(max))
119
+ throw new Error(`max must be integers, you have given ${max}`);
112
120
  if (!Number.isInteger(minCount) || !Number.isInteger(maxCount))
113
121
  throw new Error("minCount and maxCount must be integers");
114
- min = Math.min(min, max);
115
- max = Math.max(min, max);
116
- if (max - min < 1)
117
- throw new Error("range length must be at least one");
118
- if (Math.abs(max - min) > 2 ** IntegerMaxBits - 1)
119
- throw new Error("range length must be less than 1024");
122
+ if (max < 1)
123
+ throw new Error("must have at least two options");
124
+ if (max > 2 ** IntegerMaxBits - 1)
125
+ throw new Error(`maximum allowed options is 1024, you have given ${max + 1} options`);
120
126
  minCount = Math.min(minCount, maxCount);
121
127
  maxCount = Math.max(minCount, maxCount);
122
128
  if (minCount < 1)
@@ -128,22 +134,98 @@ var create6 = (value, min = 0, max = 10, minCount = 1, maxCount = 10, name = "",
128
134
  value.forEach((v, i) => {
129
135
  if (!Number.isInteger(v))
130
136
  throw new Error(`all entries must be integers, index ${i} (${v}) is not`);
131
- if (v < min || v > max)
132
- throw new Error(`all entries must be within the range ${min} - ${max}, index ${i} (${v}) is not`);
137
+ if (v > max)
138
+ throw new Error(`all entries must be within the range ${0} - ${max}, index ${i} (${v}) is not`);
133
139
  });
134
140
  if (value.length < minCount || value.length > maxCount)
135
141
  throw new Error(`value length must be between minCount and maxCount, ${value.length} is not between ${minCount} and ${maxCount}`);
136
- return { type: 5 /* ENUM_ARRAY */, minCount, maxCount, value, min, max, name, index };
142
+ return {
143
+ type: "ENUM_ARRAY",
144
+ minCount,
145
+ maxCount,
146
+ value: JSON.parse(JSON.stringify(value)),
147
+ max,
148
+ name,
149
+ index,
150
+ mapping
151
+ };
152
+ };
153
+
154
+ // src/factory/optionalFactory.ts
155
+ var create7 = (descriptor, defaultState = false, name = "", index = -1) => {
156
+ if (descriptor[0] === null && descriptor[1] === null)
157
+ throw new Error("descriptor must have at least one non-null value");
158
+ if (descriptor[0] !== null && descriptor[1] !== null)
159
+ throw new Error("descriptor must have only one non-null value");
160
+ return {
161
+ type: "OPTIONAL",
162
+ state: defaultState,
163
+ descriptor,
164
+ value: JSON.parse(JSON.stringify(defaultState ? descriptor[1] : descriptor[0])),
165
+ name,
166
+ index
167
+ };
168
+ };
169
+
170
+ // src/factory/enumOptionsFactory.ts
171
+ var maxEnumOptions = 64;
172
+ var maxEnumOptionsBits = getMinimumBitsForInteger(maxEnumOptions);
173
+ var create8 = (descriptor, defaultState = 0, name = "", index = -1) => {
174
+ if (descriptor.length < 2)
175
+ throw new Error("descriptor must have at least two entries");
176
+ if (descriptor.length - 1 < defaultState)
177
+ throw new Error("defaultState must be less than the length of the descriptor");
178
+ return {
179
+ value: JSON.parse(JSON.stringify(descriptor[defaultState])),
180
+ descriptor,
181
+ name,
182
+ index,
183
+ type: "ENUM_OPTIONS",
184
+ stateBits: getBitsForIntegerNumber(descriptor.length, maxEnumOptionsBits),
185
+ state: defaultState
186
+ };
187
+ };
188
+
189
+ // src/factory/arrayFactory.ts
190
+ var maxArrayCount = 64;
191
+ var create9 = (descriptor, defaultState = 0, minCount = 0, maxCount = 10, name = "", index = -1) => {
192
+ if (!Number.isInteger(minCount) || !Number.isInteger(maxCount))
193
+ throw new Error("minCount and maxCount must be integers");
194
+ if (minCount < 0)
195
+ throw new Error("minCount must be at least 0");
196
+ if (maxCount < 0)
197
+ throw new Error("maxCount must be at least 0");
198
+ if (maxCount - minCount < 0)
199
+ throw new Error("maxCount must be greater than or equal to minCount");
200
+ if (maxCount - minCount > maxArrayCount)
201
+ throw new Error(`maxCount (${maxCount}) - minCount (${minCount}) = ${maxCount - minCount} must be less than or equal to maxArrayCount (${maxArrayCount})`);
202
+ if (defaultState < minCount || defaultState > maxCount)
203
+ throw new Error(`defaultState must be between minCount (${minCount}) and maxCount (${maxCount}), given defaultState is ${defaultState}`);
204
+ const stateBits = getMinimumBitsForInteger(maxCount - minCount);
205
+ return {
206
+ value: [...Array(defaultState)].map(() => JSON.parse(JSON.stringify(descriptor))),
207
+ descriptor,
208
+ type: "ARRAY",
209
+ minCount,
210
+ maxCount,
211
+ stateBits,
212
+ state: defaultState,
213
+ name,
214
+ index
215
+ };
137
216
  };
138
217
 
139
218
  // src/factory/factory.ts
140
- var DataEntryFactory = {
141
- createFloat: create,
142
- createInt: create2,
143
- createEnum: create5,
144
- createBoolean: create3,
145
- createVersion: create4,
146
- createEnumArray: create6
219
+ var DescriptorFactory = {
220
+ FLOAT: create,
221
+ INT: create2,
222
+ ENUM: create5,
223
+ BOOLEAN: create3,
224
+ VERSION: create4,
225
+ ENUM_ARRAY: create6,
226
+ OPTIONAL: create7,
227
+ ENUM_OPTIONS: create8,
228
+ ARRAY: create9
147
229
  };
148
230
  // src/parsers/intParser.ts
149
231
  var getBitsCount = (intData2) => intData2.bits;
@@ -225,81 +307,129 @@ var rawParser5 = (stateString) => rawValueParser3(stateString);
225
307
  var rawStringifier5 = (value) => value ? "1" : "0";
226
308
 
227
309
  // src/parsers/enumArrayParser.ts
228
- var getCountBitsCount = (enumArrayData) => getBitsForIntegerNumber(enumArrayData.maxCount - enumArrayData.minCount + 1, IntegerMaxBits);
310
+ var getCountBitsCount = (enumArrayData2) => getBitsForIntegerNumber(enumArrayData2.maxCount - enumArrayData2.minCount + 1, IntegerMaxBits);
229
311
  var getNumberBitsCountForBase = (count, base) => getBitsForEnumArrayCountOfBase(count, base);
230
- var getEnumArrayBase = (enumArrayData) => enumArrayData.max - enumArrayData.min + 1;
231
- var getCount = (enumArrayData, bitString) => {
232
- const countBits = getCountBitsCount(enumArrayData);
312
+ var getEnumArrayBase = (enumArrayData2) => enumArrayData2.max + 1;
313
+ var getCount = (enumArrayData2, bitString) => {
314
+ const countBits = getCountBitsCount(enumArrayData2);
233
315
  if (countBits === 0)
234
- return enumArrayData.minCount;
235
- return rawValueParser(bitString.slice(0, countBits), countBits) + enumArrayData.minCount;
316
+ return enumArrayData2.minCount;
317
+ return rawValueParser(bitString.slice(0, countBits), countBits) + enumArrayData2.minCount;
236
318
  };
237
- var getBitsCount6 = (enumArrayData, bitString) => {
238
- const countBits = getCountBitsCount(enumArrayData);
239
- const count = getCount(enumArrayData, bitString);
240
- const valuesBitCount = getNumberBitsCountForBase(count, getEnumArrayBase(enumArrayData));
319
+ var getBitsCount6 = (enumArrayData2, bitString) => {
320
+ const countBits = getCountBitsCount(enumArrayData2);
321
+ const count = getCount(enumArrayData2, bitString);
322
+ const valuesBitCount = getNumberBitsCountForBase(count, getEnumArrayBase(enumArrayData2));
241
323
  return countBits + valuesBitCount;
242
324
  };
243
- var rawParser6 = (bitString, enumArrayData) => {
244
- const countBits = getCountBitsCount(enumArrayData);
245
- const count = getCount(enumArrayData, bitString);
246
- const base = getEnumArrayBase(enumArrayData);
325
+ var rawParser6 = (bitString, enumArrayData2) => {
326
+ const countBits = getCountBitsCount(enumArrayData2);
327
+ const count = getCount(enumArrayData2, bitString);
328
+ const base = getEnumArrayBase(enumArrayData2);
247
329
  const valuesBitCount = getNumberBitsCountForBase(count, base);
248
- const value = convertBitStringToArbitraryBase(bitString.slice(countBits, countBits + valuesBitCount), base, count);
249
- return value.map((v) => v + enumArrayData.min);
330
+ return convertBitStringToArbitraryBase(bitString.slice(countBits, countBits + valuesBitCount), base, count);
250
331
  };
251
- var rawStringifier6 = (value, enumArrayData) => {
252
- const countBits = getCountBitsCount(enumArrayData);
332
+ var rawStringifier6 = (value, enumArrayData2) => {
333
+ const countBits = getCountBitsCount(enumArrayData2);
253
334
  const count = value.length;
254
- const base = getEnumArrayBase(enumArrayData);
255
- const countBitstring = countBits ? rawIntStringifier(count - enumArrayData.minCount, countBits) : "";
256
- const enumArrayBitstring = convertArbitraryBaseToBitString(value.map((v) => v - enumArrayData.min), base);
335
+ const base = getEnumArrayBase(enumArrayData2);
336
+ const countBitstring = countBits ? rawIntStringifier(count - enumArrayData2.minCount, countBits) : "";
337
+ const enumArrayBitstring = convertArbitraryBaseToBitString(value, base);
257
338
  return countBitstring + enumArrayBitstring;
258
339
  };
259
340
 
341
+ // src/parsers/arrayParser.ts
342
+ var getCount2 = (arrayData2, bitString) => {
343
+ if (arrayData2.stateBits === 0)
344
+ return arrayData2.minCount;
345
+ return rawValueParser(bitString.slice(0, arrayData2.stateBits), arrayData2.stateBits) + arrayData2.minCount;
346
+ };
347
+ var rawParser7 = (bitString, arrayData2) => {
348
+ const state = getCount2(arrayData2, bitString);
349
+ bitString = bitString.slice(arrayData2.stateBits);
350
+ const value = [];
351
+ for (let i = 0;i < state; i++) {
352
+ const [nestedData, remainingBitstring] = nestedDataBitstringParser(bitString, arrayData2.descriptor);
353
+ value.push(nestedData);
354
+ bitString = remainingBitstring;
355
+ }
356
+ return [{ ...arrayData2, value, state }, bitString];
357
+ };
358
+ var rawStateStringifier = (arrayData2) => arrayData2.stateBits ? rawIntStringifier(arrayData2.value.length - arrayData2.minCount, arrayData2.stateBits) : "";
359
+ var rawStringifier7 = (arrayData2) => {
360
+ return rawStateStringifier(arrayData2) + arrayData2.value.map(nestedDataStringifier).join("");
361
+ };
362
+
363
+ // src/parsers/optionalParser.ts
364
+ var getState = (bitString) => Number(bitString.slice(0, 1));
365
+ var rawParser8 = (bitString, optionalData2) => {
366
+ const descriptorIndex = getState(bitString);
367
+ bitString = bitString.slice(1);
368
+ const [value, remainingBitstring] = optionalData2.descriptor[descriptorIndex] ? nestedDataBitstringParser(bitString, optionalData2.descriptor[descriptorIndex]) : [null, bitString];
369
+ const state = Boolean(descriptorIndex);
370
+ return [{ ...optionalData2, value, state }, remainingBitstring];
371
+ };
372
+ var rawStateStringifier2 = (optionalData2) => optionalData2.state ? "1" : "0";
373
+ var rawStringifier8 = (optionalData2) => optionalData2.value === null ? rawStateStringifier2(optionalData2) : rawStateStringifier2(optionalData2) + nestedDataStringifier(optionalData2.value);
374
+
375
+ // src/parsers/enumOptionsFactory.ts
376
+ var getStateIndex = (enumOptionsData2, bitString) => {
377
+ if (enumOptionsData2.stateBits === 0)
378
+ return 0;
379
+ return rawValueParser(bitString.slice(0, enumOptionsData2.stateBits), enumOptionsData2.stateBits);
380
+ };
381
+ var rawParser9 = (bitString, enumOptionsData2) => {
382
+ const state = getStateIndex(enumOptionsData2, bitString);
383
+ bitString = bitString.slice(enumOptionsData2.stateBits);
384
+ const [value, remainingBitstring] = nestedDataBitstringParser(bitString, enumOptionsData2.descriptor[state]);
385
+ return [{ ...enumOptionsData2, value, state }, remainingBitstring];
386
+ };
387
+ var rawStateStringifier3 = (enumOptionsData2) => rawIntStringifier(enumOptionsData2.state, enumOptionsData2.stateBits);
388
+ var rawStringifier9 = (enumOptionsData2) => rawStateStringifier3(enumOptionsData2) + nestedDataStringifier(enumOptionsData2.value);
389
+
260
390
  // src/parsers/parsers.ts
261
391
  var valueBitsParser = (bitString, mapData) => {
262
392
  switch (mapData.type) {
263
- case 1 /* BOOLEAN */:
393
+ case "BOOLEAN":
264
394
  return rawParser5(bitString);
265
- case 3 /* INT */:
395
+ case "INT":
266
396
  return rawParser(bitString, mapData);
267
- case 2 /* ENUM */:
397
+ case "ENUM":
268
398
  return rawParser3(bitString, mapData);
269
- case 4 /* FLOAT */:
399
+ case "FLOAT":
270
400
  return rawParser2(bitString, mapData);
271
- case 0 /* VERSION */:
401
+ case "VERSION":
272
402
  return rawParser4(bitString, mapData);
273
- case 5 /* ENUM_ARRAY */:
403
+ case "ENUM_ARRAY":
274
404
  return rawParser6(bitString, mapData);
275
405
  }
276
406
  };
277
407
  var dataBitsParser = (rawString, mapData) => {
278
408
  switch (mapData.type) {
279
- case 1 /* BOOLEAN */:
409
+ case "BOOLEAN":
280
410
  return { ...mapData, value: valueBitsParser(rawString, mapData) };
281
- case 2 /* ENUM */:
282
- case 3 /* INT */:
283
- case 4 /* FLOAT */:
284
- case 0 /* VERSION */:
411
+ case "ENUM":
412
+ case "INT":
413
+ case "FLOAT":
414
+ case "VERSION":
285
415
  return { ...mapData, value: valueBitsParser(rawString, mapData) };
286
- case 5 /* ENUM_ARRAY */:
416
+ case "ENUM_ARRAY":
287
417
  return { ...mapData, value: valueBitsParser(rawString, mapData) };
288
418
  }
289
419
  };
290
420
  var getBitsCount7 = (mapData, bitString) => {
291
421
  switch (mapData.type) {
292
- case 1 /* BOOLEAN */:
422
+ case "BOOLEAN":
293
423
  return getBitsCount5();
294
- case 3 /* INT */:
424
+ case "INT":
295
425
  return getBitsCount(mapData);
296
- case 4 /* FLOAT */:
426
+ case "FLOAT":
297
427
  return getBitsCount2(mapData);
298
- case 0 /* VERSION */:
428
+ case "VERSION":
299
429
  return getBitsCount4(mapData);
300
- case 2 /* ENUM */:
430
+ case "ENUM":
301
431
  return getBitsCount3(mapData);
302
- case 5 /* ENUM_ARRAY */:
432
+ case "ENUM_ARRAY":
303
433
  return getBitsCount6(mapData, bitString);
304
434
  }
305
435
  };
@@ -307,22 +437,61 @@ var dataEntryBitstringParser = (bitstring, dataEntry2) => [
307
437
  dataBitsParser(bitstring.slice(0, getBitsCount7(dataEntry2, bitstring)), dataEntry2),
308
438
  bitstring.slice(getBitsCount7(dataEntry2, bitstring))
309
439
  ];
440
+ var nestedDataBitstringParser = (bitstring, descriptor) => {
441
+ const resultingNestedData = descriptor.map((data) => {
442
+ const [resultingData, remainingBitstring] = ComplexDataValues.includes(data.type) ? complexDataEntryBitstringParser(bitstring, data) : dataEntryBitstringParser(bitstring, data);
443
+ bitstring = remainingBitstring;
444
+ return resultingData;
445
+ });
446
+ return [resultingNestedData, bitstring];
447
+ };
448
+ var complexDataEntryBitstringParser = (bitstring, complexDataEntry) => {
449
+ switch (complexDataEntry.type) {
450
+ case "ARRAY":
451
+ return rawParser7(bitstring, complexDataEntry);
452
+ case "OPTIONAL":
453
+ return rawParser8(bitstring, complexDataEntry);
454
+ case "ENUM_OPTIONS":
455
+ return rawParser9(bitstring, complexDataEntry);
456
+ }
457
+ };
310
458
  var dataBitsStringifier = (data) => {
311
459
  switch (data.type) {
312
- case 1 /* BOOLEAN */:
460
+ case "BOOLEAN":
313
461
  return rawStringifier5(data.value);
314
- case 3 /* INT */:
462
+ case "INT":
315
463
  return rawStringifier(data.value, data);
316
- case 4 /* FLOAT */:
464
+ case "FLOAT":
317
465
  return rawStringifier2(data.value, data);
318
- case 0 /* VERSION */:
466
+ case "VERSION":
319
467
  return rawStringifier4(data.value, data);
320
- case 2 /* ENUM */:
468
+ case "ENUM":
321
469
  return rawStringifier3(data.value, data);
322
- case 5 /* ENUM_ARRAY */:
470
+ case "ENUM_ARRAY":
323
471
  return rawStringifier6(data.value, data);
324
472
  }
325
473
  };
474
+ var complexDataStringifier = (complexDataEntry) => {
475
+ switch (complexDataEntry.type) {
476
+ case "ARRAY":
477
+ return rawStringifier7(complexDataEntry);
478
+ case "OPTIONAL":
479
+ return rawStringifier8(complexDataEntry);
480
+ case "ENUM_OPTIONS":
481
+ return rawStringifier9(complexDataEntry);
482
+ }
483
+ };
484
+ var complexDataStateStringifier = (complexDataEntry) => {
485
+ switch (complexDataEntry.type) {
486
+ case "ARRAY":
487
+ return rawStateStringifier(complexDataEntry);
488
+ case "OPTIONAL":
489
+ return rawStateStringifier2(complexDataEntry);
490
+ case "ENUM_OPTIONS":
491
+ return rawStateStringifier3(complexDataEntry);
492
+ }
493
+ };
494
+ var nestedDataStringifier = (nestedData) => nestedData.map((d) => ComplexDataValues.includes(d.type) ? complexDataStringifier(d) : dataBitsStringifier(d)).join("");
326
495
  var dataEntryCorrecting = (dataEntry2) => dataBitsParser(dataBitsStringifier(dataEntry2), dataEntry2);
327
496
  var base64url = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
328
497
  var getBitsForEnumArrayCountOfBase = (count, base) => Math.ceil(Math.log2(base) * count);
@@ -359,34 +528,22 @@ var parseBase64ToBits = (base64) => {
359
528
  const chunks = numbers.map((n) => n.toString(2).padStart(6, "0"));
360
529
  return chunks.join("");
361
530
  };
362
- var dataArrayStringifier = (dataEntryArray) => {
363
- return dataEntryArray.map(dataBitsStringifier).join("");
364
- };
365
531
  // src/update/floatUpdate.ts
366
532
  var updateValue = (original, update) => {
367
- const value = Math.max(Math.min(update.value, original.max), original.min);
368
- return {
369
- ...original,
370
- value
371
- };
533
+ original.value = Math.max(Math.min(update.value, original.max), original.min);
534
+ return original;
372
535
  };
373
536
 
374
537
  // src/update/intUpdate.ts
375
538
  var updateValue2 = (original, update) => {
376
- const value = Math.max(Math.min(update.value, original.max), original.min);
377
- return {
378
- ...original,
379
- value
380
- };
539
+ original.value = Math.max(Math.min(update.value, original.max), original.min);
540
+ return original;
381
541
  };
382
542
 
383
543
  // src/update/enumUpdate.ts
384
544
  var updateValue3 = (original, update) => {
385
- const value = Math.min(original.max, update.value);
386
- return {
387
- ...original,
388
- value
389
- };
545
+ original.value = Math.min(original.max, update.value);
546
+ return original;
390
547
  };
391
548
 
392
549
  // src/update/versionUpdate.ts
@@ -399,18 +556,55 @@ var updateValue4 = (original, update) => {
399
556
  };
400
557
 
401
558
  // src/update/booleanUpdate.ts
402
- var updateValue5 = (original, update) => ({
403
- ...original,
404
- value: update.value
405
- });
559
+ var updateValue5 = (original, update) => {
560
+ original.value = update.value;
561
+ return original;
562
+ };
406
563
 
407
564
  // src/update/enumArrayUpdate.ts
408
565
  var updateValue6 = (original, update) => {
409
- const value = update.value.map((v) => Math.max(Math.min(original.max, v), original.min));
410
- return {
411
- ...original,
412
- value
413
- };
566
+ const count = Math.max(Math.min(update.value.length, original.maxCount), original.minCount);
567
+ original.value = [...new Array(count)].map((_, i) => Math.min(update.value[i] ?? 0, original.max));
568
+ return original;
569
+ };
570
+
571
+ // src/update/nestedDataMatching.ts
572
+ var updateNestedData = (original, descriptor) => {
573
+ const descriptorClone = JSON.parse(JSON.stringify(descriptor));
574
+ if (!original)
575
+ return descriptorClone;
576
+ return descriptorClone.map((d, i) => original[i]?.type === d.type && original[i]?.name === d.name ? DataTypeValues.includes(original[i].type) ? updateValue7(d, original[i]) : updateComplexValue(d, original[i]) : d);
577
+ };
578
+
579
+ // src/update/optionalUpdate.ts
580
+ var updateComplexValue2 = (original, update) => {
581
+ if (update.descriptor[Number(original.state)] !== null && original.value !== null) {
582
+ original.state = update.state;
583
+ original.value.length = 0;
584
+ original.value.push(...updateNestedData(update.value, original.descriptor[Number(update.state)]));
585
+ }
586
+ return original;
587
+ };
588
+
589
+ // src/update/enumOptionsUpdate.ts
590
+ var updateComplexValue3 = (original, update) => {
591
+ if (update.state <= original.descriptor.length - 1) {
592
+ original.value.length = 0;
593
+ original.value.push(...updateNestedData(update.value, original.descriptor[update.state]));
594
+ original.state = update.state;
595
+ }
596
+ return original;
597
+ };
598
+
599
+ // src/update/arrayUpdate.ts
600
+ var updateComplexValue4 = (original, update) => {
601
+ if (update.state >= original.minCount && update.state <= original.maxCount) {
602
+ original.state = update.state;
603
+ original.value.length = 0;
604
+ for (let i = 0;i < original.state; i++)
605
+ original.value.push(updateNestedData(update.value[i], original.descriptor));
606
+ }
607
+ return original;
414
608
  };
415
609
 
416
610
  // src/update/updateValues.ts
@@ -418,281 +612,200 @@ var updateValue7 = (original, update) => {
418
612
  if (original.type !== update.type)
419
613
  throw new Error("Types do not match");
420
614
  switch (original.type) {
421
- case 4 /* FLOAT */:
615
+ case "FLOAT":
422
616
  return updateValue(original, update);
423
- case 3 /* INT */:
617
+ case "INT":
424
618
  return updateValue2(original, update);
425
- case 2 /* ENUM */:
619
+ case "ENUM":
426
620
  return updateValue3(original, update);
427
- case 1 /* BOOLEAN */:
621
+ case "BOOLEAN":
428
622
  return updateValue5(original, update);
429
- case 0 /* VERSION */:
623
+ case "VERSION":
430
624
  return updateValue4(original, update);
431
- case 5 /* ENUM_ARRAY */:
625
+ case "ENUM_ARRAY":
432
626
  return updateValue6(original, update);
433
627
  }
434
628
  };
435
- // src/objectmap/stateValueHelperMethods.ts
436
- var flattenDerivativeStateDataType = (stateValue) => [
437
- stateValue.s,
438
- ...Array.isArray(stateValue.v) ? stateValue.v.map(getDataEntryArray).flat() : getDataEntryArray(stateValue.v)
439
- ];
440
- var internalGetDataEntryArray = (stateValue) => Object.values(stateValue).map((content) => {
441
- if (content.type !== undefined)
442
- return content;
443
- else if (content.s !== undefined && content.v !== undefined) {
444
- return flattenDerivativeStateDataType(content);
445
- } else
446
- return internalGetDataEntryArray(content);
447
- }).flat();
448
- var getStateValueHelperMethod = (stateValue) => {
449
- if (stateValue.type !== undefined)
450
- return stateValue.value;
451
- else if (stateValue.s !== undefined && stateValue.v !== undefined)
452
- return {
453
- s: stateValue.s.value,
454
- v: Array.isArray(stateValue.v) ? stateValue.v.map(getStateValue) : getStateValue(stateValue.v)
455
- };
456
- else
457
- return getStateValue(stateValue);
458
- };
459
- var getStateValue = (stateValue) => Object.fromEntries(Object.entries(stateValue).map(([key, value]) => [key, getStateValueHelperMethod(value)]));
460
- var getDataEntryArray = (stateValue) => internalGetDataEntryArray(stateValue).sort((a, b) => a.index - b.index);
461
- var getBase64String = (stateValue) => parseBitsToBase64(dataArrayStringifier(getDataEntryArray(stateValue)));
462
- var isSingleLevelContentType = (data) => singleLevelContentTypeIsDataEntry(data[0]) || singleLevelContentTypeIsNestedContentDataType(data[0]) && !doubleLevelContentTypeIsArrayDefinitionType(data);
463
- var isDoubleLevelContentType = (data) => !isSingleLevelContentType(data);
464
- var singleLevelContentTypeIsDataEntry = (data) => !Array.isArray(data) && typeof data === "object";
465
- var singleLevelContentTypeIsNestedContentDataType = (data) => Array.isArray(data) && typeof data[0] === "string";
466
- var doubleLevelContentTypeIsEnumEntryDataType = (data) => isDoubleLevelContentType(data) && typeof data[0] === "number";
467
- var doubleLevelContentTypeIsOptionalEntryDataType = (data) => isDoubleLevelContentType(data) && typeof data[0] === "boolean";
468
- var doubleLevelContentTypeIsArrayDefinitionType = (data) => Array.isArray(data[0]) && data[0].length === 2 && typeof data[0][0] === "number" && typeof data[0][1] === "number";
469
- var isDataEntry = (v) => typeof v === "object" && !Array.isArray(v) && v?.type !== undefined && v?.value !== undefined;
629
+ var updateComplexValue = (original, update) => {
630
+ if (original.type !== update.type)
631
+ throw new Error("Types do not match");
632
+ switch (original.type) {
633
+ case "OPTIONAL":
634
+ return updateComplexValue2(original, update);
635
+ case "ENUM_OPTIONS":
636
+ return updateComplexValue3(original, update);
637
+ case "ARRAY":
638
+ return updateComplexValue4(original, update);
639
+ }
640
+ };
641
+ // src/stateHandling/stateData.ts
642
+ var getStateData = (state) => {
643
+ const object = {};
644
+ state.forEach((item) => {
645
+ switch (item.type) {
646
+ case "BOOLEAN":
647
+ object[item.name] = item.value;
648
+ break;
649
+ case "INT":
650
+ object[item.name] = item.value;
651
+ break;
652
+ case "ENUM":
653
+ object[item.name] = item.mapping[item.value];
654
+ break;
655
+ case "FLOAT":
656
+ object[item.name] = item.value;
657
+ break;
658
+ case "VERSION":
659
+ object[item.name] = item.value;
660
+ break;
661
+ case "ENUM_ARRAY":
662
+ object[item.name] = item.value.map((v) => item.mapping[v]);
663
+ break;
664
+ case "OPTIONAL":
665
+ object[item.name] = item.value === null ? null : getStateData(item.value);
666
+ break;
667
+ case "ENUM_OPTIONS":
668
+ object[item.name] = {
669
+ ...getStateData(item.value),
670
+ state: item.state
671
+ };
672
+ break;
673
+ case "ARRAY":
674
+ object[item.name] = item.value.map(getStateData);
675
+ break;
676
+ }
677
+ });
678
+ return object;
679
+ };
470
680
 
471
- // src/objectmap/stateDataModel.ts
472
- var currentDataEntryIndex = 0;
473
- var findExistingDataEntry = (dataEntry2, dataEntryArray) => dataEntryArray.find((d) => (d.internalName ?? d.name) === (dataEntry2.internalName ?? dataEntry2.name));
474
- var readDataEntry = (dataEntry2, bitString) => {
475
- const [d, slicedBitstring] = dataEntryBitstringParser(bitString, dataEntry2);
476
- currentDataEntryIndex++;
477
- return [slicedBitstring, [d.name, { ...d, index: currentDataEntryIndex }]];
478
- };
479
- var updateDataEntry = (dataEntry2, existingData) => {
480
- const existingDataEntry = findExistingDataEntry(dataEntry2, existingData);
481
- currentDataEntryIndex++;
482
- return [
483
- existingData,
484
- [
485
- dataEntry2.name,
486
- { ...existingDataEntry ? updateValue7(dataEntry2, existingDataEntry) : dataEntry2, index: currentDataEntryIndex }
487
- ]
488
- ];
489
- };
490
- var internalGetDataEntry = (dataEntry2, prefix, additionalData) => {
491
- const internalName = `${prefix}${PREFIX_SEPERATOR_DELIMETER}${dataEntry2.name}`;
492
- const localDataEntry = { ...dataEntry2, internalName };
493
- if (additionalData) {
494
- if (typeof additionalData === "string")
495
- return readDataEntry(localDataEntry, additionalData);
496
- else
497
- return updateDataEntry(localDataEntry, additionalData);
681
+ // src/stateHandling/stateDataObject.ts
682
+ var getBitstringForStateDataEntry = (stateDataEntry2) => {
683
+ switch (stateDataEntry2.type) {
684
+ case "BOOLEAN":
685
+ case "INT":
686
+ case "ENUM":
687
+ case "FLOAT":
688
+ case "VERSION":
689
+ case "ENUM_ARRAY":
690
+ return stateDataEntry2.bitstring = stateDataEntry2.bitstring ?? dataBitsStringifier(stateDataEntry2);
691
+ case "OPTIONAL":
692
+ return stateDataEntry2.value === null ? complexDataStateStringifier(stateDataEntry2) : complexDataStateStringifier(stateDataEntry2) + getBitstringForStateNestedData(stateDataEntry2.value);
693
+ case "ENUM_OPTIONS":
694
+ return complexDataStateStringifier(stateDataEntry2) + getBitstringForStateNestedData(stateDataEntry2.value);
695
+ case "ARRAY":
696
+ return complexDataStateStringifier(stateDataEntry2) + stateDataEntry2.value.map((vs) => getBitstringForStateNestedData(vs)).join("");
697
+ }
698
+ };
699
+ var getBitstringForStateNestedData = (nestedData) => nestedData.map(getBitstringForStateDataEntry).join("");
700
+ var setComplexDataEntryValuesAsStateDataEntry = (currenEntry, updateCallback) => {
701
+ switch (currenEntry.type) {
702
+ case "OPTIONAL":
703
+ currenEntry.value = currenEntry.value === null ? null : currenEntry.value.map((v) => getStateDataEntry(v, updateCallback));
704
+ break;
705
+ case "ARRAY":
706
+ currenEntry.value = currenEntry.value.map((vs) => vs.map((v) => getStateDataEntry(v, updateCallback)));
707
+ break;
708
+ case "ENUM_OPTIONS":
709
+ currenEntry.value = currenEntry.value.map((v) => getStateDataEntry(v, updateCallback));
710
+ break;
498
711
  }
499
- currentDataEntryIndex++;
500
- return [undefined, [localDataEntry.name, { ...localDataEntry, index: currentDataEntryIndex }]];
501
- };
502
- var getStateFromOptionalEntryDataType = (oedt, prefix, attributeName) => (additionalData) => {
503
- const [updatedLocalAdditionalData, [__, s]] = internalGetDataEntry(DataEntryFactory.createBoolean(oedt[0], attributeName), prefix, additionalData);
504
- const [localAdditionalData, [_, v]] = getStateDateFromSingleLevelContentTypeArray(oedt[Number(s.value) + 1], s.internalName, attributeName)(updatedLocalAdditionalData);
505
- return [
506
- localAdditionalData,
507
- [
508
- attributeName,
509
- {
510
- s,
511
- v
512
- }
513
- ]
514
- ];
515
- };
516
- var getStateFromEnumEntryDataType = (eedt, prefix, attributeName) => (additionalData) => {
517
- if (Math.round(eedt[0]) !== eedt[0])
518
- `given default (${eedt[0]}) value isn't an integer, rounding it`;
519
- if (eedt.length - 2 < Math.round(eedt[0]))
520
- throw new Error(`given default value (${eedt[0]}) was larger than the amount of options available, using the largest value (${eedt.length - 2}) instead`);
521
- if (eedt[0] < 0)
522
- throw new Error(`given default value (${eedt[0]}) was negative, using first index (0) instead`);
523
- const [updatedLocalAdditionalData, [__, s]] = internalGetDataEntry(DataEntryFactory.createEnum(Math.max(Math.min(eedt.length - 2, Math.round(eedt[0])), 0), eedt.length - 1, attributeName), prefix, additionalData);
524
- const [nestedAdditionalData, [_, v]] = getStateDateFromSingleLevelContentTypeArray(eedt[1 + s.value], s.internalName, attributeName)(updatedLocalAdditionalData);
525
- return [
526
- nestedAdditionalData,
527
- [
528
- attributeName,
529
- {
530
- s,
531
- v
532
- }
533
- ]
534
- ];
535
- };
536
- var getStateFromArrayEntryDataType = (aedt, prefix, attributeName) => (additionalData) => {
537
- const [min, max] = [aedt[0][0], aedt[0][1]].sort((a, b) => a - b);
538
- const [updatedAdditionalData, [__, s]] = internalGetDataEntry(DataEntryFactory.createInt(min, min, max, attributeName), prefix, additionalData);
539
- const v = [];
540
- let localAdditionalData = updatedAdditionalData;
541
- for (let i = 0;i < s.value; i++) {
542
- const [updateAdditionalData, [_, localStateData]] = getStateDateFromSingleLevelContentTypeArray(aedt[1], `${s.internalName}${PREFIX_SEPERATOR_DELIMETER}${i}`, attributeName)(localAdditionalData);
543
- localAdditionalData = updateAdditionalData;
544
- v.push(localStateData);
712
+ const newBitString = getBitstringForStateDataEntry(currenEntry);
713
+ currenEntry.bitstring = newBitString;
714
+ };
715
+ var updateStateDataEntry = (currenEntry, newEntry, updateCallback) => {
716
+ if (currenEntry.type !== newEntry.type || currenEntry.name !== newEntry.name)
717
+ throw new Error(`Types (${currenEntry.type} & ${newEntry.type}) or names (${currenEntry.name} & ${newEntry.name}) do not match`);
718
+ if (ComplexDataValues.includes(currenEntry.type)) {
719
+ if (currenEntry.state !== newEntry.state) {
720
+ const currentBitString = currenEntry.bitstring;
721
+ const updatedCurrentEntry = updateComplexValue(currenEntry, newEntry);
722
+ setComplexDataEntryValuesAsStateDataEntry(updatedCurrentEntry, updateCallback);
723
+ if (currentBitString !== updatedCurrentEntry.bitstring)
724
+ updateCallback();
725
+ }
726
+ } else {
727
+ const currentBitString = currenEntry.bitstring;
728
+ const updatedCurrentEntry = updateValue7(currenEntry, newEntry);
729
+ updatedCurrentEntry.bitstring = dataBitsStringifier(updatedCurrentEntry);
730
+ if (currentBitString !== updatedCurrentEntry.bitstring)
731
+ updateCallback();
545
732
  }
546
- return [
547
- localAdditionalData,
548
- [
549
- attributeName,
550
- {
551
- s,
552
- v
553
- }
554
- ]
555
- ];
556
- };
557
- var getStateDataFromDoubleLevelContentType = (dct, prefix, attributeName) => {
558
- if (doubleLevelContentTypeIsEnumEntryDataType(dct))
559
- return getStateFromEnumEntryDataType(dct, prefix, attributeName);
560
- else if (doubleLevelContentTypeIsOptionalEntryDataType(dct))
561
- return getStateFromOptionalEntryDataType(dct, prefix, attributeName);
562
- else if (doubleLevelContentTypeIsArrayDefinitionType(dct))
563
- return getStateFromArrayEntryDataType(dct, prefix, attributeName);
564
- throw new Error("this is an invalid output value, wonder why?");
565
- };
566
- var getStateDateFromSingleLevelContentTypeArray = (slcta, prefix, attributeName) => (additionalData) => {
567
- const outputDataObject = {};
568
- let intermediateAdditionalData = additionalData;
569
- slcta.forEach((slct) => {
570
- const [localAdditionalData, [localAttributeName, nestedData]] = getStateDataFromSingleLevelContentType(slct, prefix)(intermediateAdditionalData);
571
- intermediateAdditionalData = localAdditionalData;
572
- outputDataObject[localAttributeName] = nestedData;
573
- });
574
- return [intermediateAdditionalData, [attributeName, outputDataObject]];
575
- };
576
- var getStateDataFromNestedContentType = (nct, prefix, attributeName) => {
577
- if (isDoubleLevelContentType(nct))
578
- return getStateDataFromDoubleLevelContentType(nct, `${prefix}${PREFIX_SEPERATOR_DELIMETER}${attributeName}`, attributeName);
579
- return getStateDateFromSingleLevelContentTypeArray(nct, prefix, attributeName);
580
- };
581
- var getStateDataFromSingleLevelContentType = (slct, prefix) => {
582
- if (singleLevelContentTypeIsDataEntry(slct))
583
- return (additionalData) => internalGetDataEntry(slct, prefix, additionalData);
584
- else if (singleLevelContentTypeIsNestedContentDataType(slct))
585
- return getStateDataFromNestedContentType(slct[1], `${prefix}_${slct[0]}`, slct[0]);
586
- throw new Error("this is an invalid output value, wonder why?");
587
- };
588
- var getGenerationMethodForSingleLevelContentTypeArray = (slct) => {
589
- currentDataEntryIndex = -1;
590
- return (additionalData) => getStateDateFromSingleLevelContentTypeArray(slct, "", "")(additionalData)[1][1];
591
- };
592
- // src/objectmap/userMethods.ts
593
- var getParsedAdditionalData = (additionalData) => {
594
- if (typeof additionalData === "string")
595
- return parseBase64ToBits(additionalData);
596
- if (additionalData && !Array.isArray(additionalData))
597
- return getDataEntryArray(additionalData);
598
- return additionalData;
599
- };
600
- var getVersionindex = (additionalData, versionMask, defaultIndex) => {
601
- if (typeof additionalData === "string")
602
- return readDataEntry(versionMask, additionalData)[1][1].value;
603
- if (!additionalData)
604
- return defaultIndex || 0;
605
- return additionalData.find((d) => d.name === "version")?.value ?? defaultIndex ?? 0;
606
- };
607
- var getParserMethodForVersionDefinition = (vadt, versionBits, defaultVersion) => (state) => {
608
- const additionalData = getParsedAdditionalData(state);
609
- const versionIndex = getVersionindex(additionalData, DataEntryFactory.createVersion(0, versionBits, "version"), defaultVersion);
610
- const versionDefinition = vadt[versionIndex];
611
- const versionEntry = DataEntryFactory.createVersion(versionIndex, versionBits, "version");
612
- return getGenerationMethodForSingleLevelContentTypeArray([versionEntry, ...versionDefinition])(additionalData);
613
- };
614
- var getUpdaterMethodForVersionDefinition = (parser) => (state, entryToUpdate) => parser([...Array.isArray(entryToUpdate) ? entryToUpdate : [entryToUpdate], ...getDataEntryArray(state)]);
615
- var getStringifyMethodForVersionDefinition = (parser) => (data) => getBase64String(parser(data));
616
- var createParserObject = (versionContent, maximumExpectedVersions, defaultVersion, enumSemanticsMapping, attributeSemanticsMapping, exposedVersions) => {
617
- const versionBitCount = getVersionValueRangeValueForNumber(maximumExpectedVersions);
618
- const localDefaultVersion = Math.max(0, Math.min(versionContent.length - 1, defaultVersion ?? 0));
619
- if (versionContent.length > maximumExpectedVersions)
620
- throw new Error(`Cannot have more than ${maximumExpectedVersions} versions`);
621
- if (localDefaultVersion !== (defaultVersion ?? 0))
622
- throw new Error(`Default version must be between 0 and ${versionContent.length - 1}.`);
623
- const parser = getParserMethodForVersionDefinition(versionContent, versionBitCount, localDefaultVersion);
624
- const updater = getUpdaterMethodForVersionDefinition(parser);
625
- const stringify = getStringifyMethodForVersionDefinition(parser);
626
- return {
627
- versionBitCount,
628
- exposedVersions,
629
- parser,
630
- updater,
631
- stringify,
632
- enumSemanticsMapping,
633
- attributeSemanticsMapping
733
+ return currenEntry;
734
+ };
735
+ var getStateDataEntry = (entry, updateCallback) => {
736
+ entry.bitstring = getBitstringForStateDataEntry(entry);
737
+ entry.updateValue = (newEntry) => updateStateDataEntry(entry, newEntry, updateCallback);
738
+ return entry;
739
+ };
740
+ var createStateDataObject = (initialState, updateCallback) => {
741
+ const stateObject = {};
742
+ const wrappedUpdateCallback = () => {
743
+ stateObject.bitstring = getBitstringForStateNestedData(stateObject.state);
744
+ stateObject.base64 = parseBitsToBase64(stateObject.bitstring);
745
+ stateObject.data = getStateData(stateObject.state);
746
+ updateCallback(stateObject);
634
747
  };
748
+ stateObject.state = initialState.map((item) => getStateDataEntry(item, wrappedUpdateCallback));
749
+ wrappedUpdateCallback();
750
+ return stateObject;
635
751
  };
752
+ var getInitialStateFromBase64 = (base64, descriptor) => nestedDataBitstringParser(parseBase64ToBits(base64), descriptor)[0];
636
753
  // src/utils/interpolateData.ts
637
754
  var interpolateEntryAt = (dataEntry2, t) => {
638
755
  const localT = Math.max(Math.min(1, t), 0);
639
756
  const cosT = Math.cos(localT * 2 * Math.PI) * 0.5 + 0.5;
640
757
  switch (dataEntry2.type) {
641
- case 1 /* BOOLEAN */:
758
+ case "BOOLEAN":
642
759
  return { ...dataEntry2, value: Boolean(Math.round(localT)) };
643
- case 0 /* VERSION */:
760
+ case "VERSION":
644
761
  return { ...dataEntry2, value: Math.floor(localT * (dataEntry2.bits ** 2 - 0.001)) };
645
- case 2 /* ENUM */:
762
+ case "ENUM":
646
763
  return { ...dataEntry2, value: Math.floor(localT * (dataEntry2.max + 0.999)) };
647
- case 3 /* INT */:
764
+ case "INT":
648
765
  return { ...dataEntry2, value: dataEntry2.min + Math.floor(cosT * (dataEntry2.max - dataEntry2.min + 0.999)) };
649
- case 4 /* FLOAT */:
766
+ case "FLOAT":
650
767
  const v = dataEntry2.min + cosT * (dataEntry2.max - dataEntry2.min);
651
768
  return dataEntryCorrecting({ ...dataEntry2, value: Math.min(dataEntry2.max, Math.max(v, dataEntry2.min)) });
652
- case 5 /* ENUM_ARRAY */:
769
+ case "ENUM_ARRAY":
653
770
  return { ...dataEntry2, value: dataEntry2.value.map((v2) => Math.floor(localT * (v2 + 0.999))) };
654
771
  }
655
772
  };
656
773
  // src/utils/relativeValue.ts
657
774
  var getRelativeValue = (dataEntry2) => {
658
775
  switch (dataEntry2.type) {
659
- case 1 /* BOOLEAN */:
776
+ case "BOOLEAN":
660
777
  return Number(dataEntry2.value);
661
- case 3 /* INT */:
662
- case 4 /* FLOAT */:
778
+ case "INT":
779
+ case "FLOAT":
663
780
  return (dataEntry2.value - dataEntry2.min) / (dataEntry2.max - dataEntry2.min);
664
- case 0 /* VERSION */:
781
+ case "VERSION":
665
782
  return dataEntry2.value / (2 ** dataEntry2.bits - 1);
666
- case 2 /* ENUM */:
783
+ case "ENUM":
667
784
  return dataEntry2.value / dataEntry2.max;
668
- case 5 /* ENUM_ARRAY */:
785
+ case "ENUM_ARRAY":
669
786
  return dataEntry2.value.reduce((acc, v) => acc + v, 0) / dataEntry2.value.length;
670
787
  }
671
788
  };
672
789
  export {
673
790
  valueBitsParser,
674
791
  parseBase64ToBits,
675
- isSingleLevelContentType,
676
- isDoubleLevelContentType,
677
- isDataEntry,
678
792
  interpolateEntryAt,
679
- getStateValue,
680
793
  getRelativeValue,
681
- getDataEntryArray,
794
+ getOptionsFromMaxAndMapping,
795
+ getInitialStateFromBase64,
796
+ getEnumMaxAndMappingFromOptions,
682
797
  getBitsCount7 as getBitsCount,
683
- getBase64String,
684
- doubleLevelContentTypeIsOptionalEntryDataType,
685
- doubleLevelContentTypeIsEnumEntryDataType,
686
- doubleLevelContentTypeIsArrayDefinitionType,
687
798
  dataEntryCorrecting,
688
799
  dataEntryBitstringParser,
689
800
  dataBitsStringifier,
690
801
  dataBitsParser,
691
- createParserObject,
802
+ createStateDataObject,
803
+ complexDataStringifier,
804
+ complexDataStateStringifier,
692
805
  SignificandMaxBits,
693
806
  PROTECTED_ATTRIBUTE_NAMES,
694
- PREFIX_SEPERATOR_DELIMETER,
695
807
  IntegerMaxBits,
696
- DataType,
697
- DataEntryFactory
808
+ DescriptorFactory,
809
+ DataTypeValues,
810
+ ComplexDataValues
698
811
  };