url-safe-bitpacking 0.1.15 → 0.2.0

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 (43) hide show
  1. package/dist/enums/dataTypes.d.ts +4 -9
  2. package/dist/factory/arrayFactory.d.ts +2 -0
  3. package/dist/factory/enumArrayFactory.d.ts +1 -1
  4. package/dist/factory/enumFactory.d.ts +1 -1
  5. package/dist/factory/enumOptionsFactory.d.ts +2 -0
  6. package/dist/factory/factory.d.ts +8 -0
  7. package/dist/factory/optionalFactory.d.ts +2 -0
  8. package/dist/factory/utils.d.ts +9 -0
  9. package/dist/index.d.ts +4 -4
  10. package/dist/index.js +434 -345
  11. package/dist/parsers/arrayParser.d.ts +4 -0
  12. package/dist/parsers/enumOptionsFactory.d.ts +4 -0
  13. package/dist/parsers/optionalParser.d.ts +4 -0
  14. package/dist/parsers/parsers.d.ts +16 -12
  15. package/dist/stateHandling/index.d.ts +1 -0
  16. package/dist/stateHandling/stateData.d.ts +3 -0
  17. package/dist/stateHandling/stateDataObject.d.ts +15 -0
  18. package/dist/typeFactory/stateDataTyping.d.ts +1 -9
  19. package/dist/types/arrayData.d.ts +10 -0
  20. package/dist/types/booleanData.d.ts +1 -2
  21. package/dist/types/dataEntry.d.ts +12 -5
  22. package/dist/types/enumArrayData.d.ts +2 -3
  23. package/dist/types/enumData.d.ts +2 -2
  24. package/dist/types/enumOptionsData.d.ts +8 -0
  25. package/dist/types/floatData.d.ts +1 -2
  26. package/dist/types/index.d.ts +7 -5
  27. package/dist/types/intData.d.ts +1 -2
  28. package/dist/types/optionalData.d.ts +7 -0
  29. package/dist/types/stateDataEntry.d.ts +16 -0
  30. package/dist/types/versionData.d.ts +1 -2
  31. package/dist/update/arrayUpdate.d.ts +2 -0
  32. package/dist/update/enumOptionsUpdate.d.ts +2 -0
  33. package/dist/update/nestedDataMatching.d.ts +2 -0
  34. package/dist/update/optionalUpdate.d.ts +2 -0
  35. package/dist/update/updateValues.d.ts +8 -1
  36. package/package.json +1 -1
  37. package/dist/objectmap/index.d.ts +0 -4
  38. package/dist/objectmap/stateDataModel.d.ts +0 -33
  39. package/dist/objectmap/stateValueHelperMethods.d.ts +0 -13
  40. package/dist/objectmap/userMethods.d.ts +0 -12
  41. package/dist/types/arrayDefinitions.d.ts +0 -58
  42. package/dist/types/semanticMapping.d.ts +0 -6
  43. 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,59 @@ 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 getOptionsFromEnumOptions = (options) => {
88
+ if (typeof options === "string")
89
+ return { max: options.length - 1, mapping: options.split(",").map(Number) };
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
+
96
95
  // src/factory/enumFactory.ts
97
- var create5 = (value, max = 10, name = "", index = -1) => {
96
+ var create5 = (value, options, name = "", index = -1) => {
97
+ const { max, mapping } = getOptionsFromEnumOptions(options);
98
98
  if (!Number.isInteger(max))
99
- throw new Error("min and max must be integers");
99
+ throw new Error(`max must be integers, you have given ${max}`);
100
100
  if (max < 1)
101
101
  throw new Error("max must be at least one");
102
102
  if (max > 2 ** EnumMaxBits - 1)
103
103
  throw new Error("max - min must be less than 256");
104
104
  const bits = getBitsForIntegerNumber(max + 1, EnumMaxBits);
105
- return { value, type: 2 /* ENUM */, max, bits, name, index };
105
+ return { value, type: "ENUM", max, bits, name, index, mapping };
106
106
  };
107
107
 
108
108
  // 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");
109
+ var create6 = (value, options, minCount = 1, maxCount = 10, name = "", index = -1) => {
110
+ const { max, mapping } = getOptionsFromEnumOptions(options);
111
+ if (!Number.isInteger(max))
112
+ throw new Error(`max must be integers, you have given ${max}`);
112
113
  if (!Number.isInteger(minCount) || !Number.isInteger(maxCount))
113
114
  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");
115
+ if (max < 1)
116
+ throw new Error("must have at least two options");
117
+ if (max > 2 ** IntegerMaxBits - 1)
118
+ throw new Error(`maximum allowed options is 1024, you have given ${max + 1} options`);
120
119
  minCount = Math.min(minCount, maxCount);
121
120
  maxCount = Math.max(minCount, maxCount);
122
121
  if (minCount < 1)
@@ -128,12 +127,85 @@ var create6 = (value, min = 0, max = 10, minCount = 1, maxCount = 10, name = "",
128
127
  value.forEach((v, i) => {
129
128
  if (!Number.isInteger(v))
130
129
  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`);
130
+ if (v > max)
131
+ throw new Error(`all entries must be within the range ${0} - ${max}, index ${i} (${v}) is not`);
133
132
  });
134
133
  if (value.length < minCount || value.length > maxCount)
135
134
  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 };
135
+ return {
136
+ type: "ENUM_ARRAY",
137
+ minCount,
138
+ maxCount,
139
+ value: JSON.parse(JSON.stringify(value)),
140
+ max,
141
+ name,
142
+ index,
143
+ mapping
144
+ };
145
+ };
146
+
147
+ // src/factory/optionalFactory.ts
148
+ var create7 = (descriptor, defaultState = false, name = "", index = -1) => {
149
+ if (descriptor[0] === null && descriptor[1] === null)
150
+ throw new Error("descriptor must have at least one non-null value");
151
+ if (descriptor[0] !== null && descriptor[1] !== null)
152
+ throw new Error("descriptor must have only one non-null value");
153
+ return {
154
+ type: "OPTIONAL",
155
+ state: defaultState,
156
+ descriptor,
157
+ value: JSON.parse(JSON.stringify(defaultState ? descriptor[1] : descriptor[0])),
158
+ name,
159
+ index
160
+ };
161
+ };
162
+
163
+ // src/factory/enumOptionsFactory.ts
164
+ var maxEnumOptions = 64;
165
+ var maxEnumOptionsBits = getMinimumBitsForInteger(maxEnumOptions);
166
+ var create8 = (descriptor, defaultState = 0, name = "", index = -1) => {
167
+ if (descriptor.length < 2)
168
+ throw new Error("descriptor must have at least two entries");
169
+ if (descriptor.length - 1 < defaultState)
170
+ throw new Error("defaultState must be less than the length of the descriptor");
171
+ return {
172
+ value: JSON.parse(JSON.stringify(descriptor[defaultState])),
173
+ descriptor,
174
+ name,
175
+ index,
176
+ type: "ENUM_OPTIONS",
177
+ stateBits: getBitsForIntegerNumber(descriptor.length, maxEnumOptionsBits),
178
+ state: defaultState
179
+ };
180
+ };
181
+
182
+ // src/factory/arrayFactory.ts
183
+ var maxArrayCount = 64;
184
+ var create9 = (descriptor, defaultState = 0, minCount = 0, maxCount = 10, name = "", index = -1) => {
185
+ if (!Number.isInteger(minCount) || !Number.isInteger(maxCount))
186
+ throw new Error("minCount and maxCount must be integers");
187
+ if (minCount < 0)
188
+ throw new Error("minCount must be at least 0");
189
+ if (maxCount < 0)
190
+ throw new Error("maxCount must be at least 0");
191
+ if (maxCount - minCount < 0)
192
+ throw new Error("maxCount must be greater than or equal to minCount");
193
+ if (maxCount - minCount > maxArrayCount)
194
+ throw new Error(`maxCount (${maxCount}) - minCount (${minCount}) = ${maxCount - minCount} must be less than or equal to maxArrayCount (${maxArrayCount})`);
195
+ if (defaultState < minCount || defaultState > maxCount)
196
+ throw new Error(`defaultState must be between minCount (${minCount}) and maxCount (${maxCount}), given defaultState is ${defaultState}`);
197
+ const stateBits = getMinimumBitsForInteger(maxCount - minCount);
198
+ return {
199
+ value: [...Array(defaultState)].map(() => JSON.parse(JSON.stringify(descriptor))),
200
+ descriptor,
201
+ type: "ARRAY",
202
+ minCount,
203
+ maxCount,
204
+ stateBits,
205
+ state: defaultState,
206
+ name,
207
+ index
208
+ };
137
209
  };
138
210
 
139
211
  // src/factory/factory.ts
@@ -145,6 +217,11 @@ var DataEntryFactory = {
145
217
  createVersion: create4,
146
218
  createEnumArray: create6
147
219
  };
220
+ var ComplexDataEntryFactory = {
221
+ createOptional: create7,
222
+ createEnumOptions: create8,
223
+ createArray: create9
224
+ };
148
225
  // src/parsers/intParser.ts
149
226
  var getBitsCount = (intData2) => intData2.bits;
150
227
  var rawValueParser = (stateString, bitCount) => {
@@ -225,81 +302,124 @@ var rawParser5 = (stateString) => rawValueParser3(stateString);
225
302
  var rawStringifier5 = (value) => value ? "1" : "0";
226
303
 
227
304
  // src/parsers/enumArrayParser.ts
228
- var getCountBitsCount = (enumArrayData) => getBitsForIntegerNumber(enumArrayData.maxCount - enumArrayData.minCount + 1, IntegerMaxBits);
305
+ var getCountBitsCount = (enumArrayData2) => getBitsForIntegerNumber(enumArrayData2.maxCount - enumArrayData2.minCount + 1, IntegerMaxBits);
229
306
  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);
307
+ var getEnumArrayBase = (enumArrayData2) => enumArrayData2.max + 1;
308
+ var getCount = (enumArrayData2, bitString) => {
309
+ const countBits = getCountBitsCount(enumArrayData2);
233
310
  if (countBits === 0)
234
- return enumArrayData.minCount;
235
- return rawValueParser(bitString.slice(0, countBits), countBits) + enumArrayData.minCount;
311
+ return enumArrayData2.minCount;
312
+ return rawValueParser(bitString.slice(0, countBits), countBits) + enumArrayData2.minCount;
236
313
  };
237
- var getBitsCount6 = (enumArrayData, bitString) => {
238
- const countBits = getCountBitsCount(enumArrayData);
239
- const count = getCount(enumArrayData, bitString);
240
- const valuesBitCount = getNumberBitsCountForBase(count, getEnumArrayBase(enumArrayData));
314
+ var getBitsCount6 = (enumArrayData2, bitString) => {
315
+ const countBits = getCountBitsCount(enumArrayData2);
316
+ const count = getCount(enumArrayData2, bitString);
317
+ const valuesBitCount = getNumberBitsCountForBase(count, getEnumArrayBase(enumArrayData2));
241
318
  return countBits + valuesBitCount;
242
319
  };
243
- var rawParser6 = (bitString, enumArrayData) => {
244
- const countBits = getCountBitsCount(enumArrayData);
245
- const count = getCount(enumArrayData, bitString);
246
- const base = getEnumArrayBase(enumArrayData);
320
+ var rawParser6 = (bitString, enumArrayData2) => {
321
+ const countBits = getCountBitsCount(enumArrayData2);
322
+ const count = getCount(enumArrayData2, bitString);
323
+ const base = getEnumArrayBase(enumArrayData2);
247
324
  const valuesBitCount = getNumberBitsCountForBase(count, base);
248
- const value = convertBitStringToArbitraryBase(bitString.slice(countBits, countBits + valuesBitCount), base, count);
249
- return value.map((v) => v + enumArrayData.min);
325
+ return convertBitStringToArbitraryBase(bitString.slice(countBits, countBits + valuesBitCount), base, count);
250
326
  };
251
- var rawStringifier6 = (value, enumArrayData) => {
252
- const countBits = getCountBitsCount(enumArrayData);
327
+ var rawStringifier6 = (value, enumArrayData2) => {
328
+ const countBits = getCountBitsCount(enumArrayData2);
253
329
  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);
330
+ const base = getEnumArrayBase(enumArrayData2);
331
+ const countBitstring = countBits ? rawIntStringifier(count - enumArrayData2.minCount, countBits) : "";
332
+ const enumArrayBitstring = convertArbitraryBaseToBitString(value, base);
257
333
  return countBitstring + enumArrayBitstring;
258
334
  };
259
335
 
336
+ // src/parsers/arrayParser.ts
337
+ var getCount2 = (arrayData2, bitString) => {
338
+ if (arrayData2.stateBits === 0)
339
+ return arrayData2.minCount;
340
+ return rawValueParser(bitString.slice(0, arrayData2.stateBits), arrayData2.stateBits) + arrayData2.minCount;
341
+ };
342
+ var rawParser7 = (bitString, arrayData2) => {
343
+ const state = getCount2(arrayData2, bitString);
344
+ bitString = bitString.slice(arrayData2.stateBits);
345
+ const value = [];
346
+ for (let i = 0;i < state; i++) {
347
+ const [nestedData, remainingBitstring] = nestedDataBitstringParser(bitString, arrayData2.descriptor);
348
+ value.push(nestedData);
349
+ bitString = remainingBitstring;
350
+ }
351
+ return [{ ...arrayData2, value, state }, bitString];
352
+ };
353
+ var rawStateStringifier = (arrayData2) => arrayData2.stateBits ? rawIntStringifier(arrayData2.value.length - arrayData2.minCount, arrayData2.stateBits) : "";
354
+
355
+ // src/parsers/optionalParser.ts
356
+ var getState = (bitString) => Number(bitString.slice(0, 1));
357
+ var rawParser8 = (bitString, optionalData2) => {
358
+ const descriptorIndex = getState(bitString);
359
+ bitString = bitString.slice(1);
360
+ const [value, remainingBitstring] = optionalData2.descriptor[descriptorIndex] ? nestedDataBitstringParser(bitString, optionalData2.descriptor[descriptorIndex]) : [null, bitString];
361
+ const state = Boolean(descriptorIndex);
362
+ return [{ ...optionalData2, value, state }, remainingBitstring];
363
+ };
364
+ var rawStateStringifier2 = (optionalData2) => optionalData2.state ? "1" : "0";
365
+
366
+ // src/parsers/enumOptionsFactory.ts
367
+ var getStateIndex = (enumOptionsData2, bitString) => {
368
+ if (enumOptionsData2.stateBits === 0)
369
+ return 0;
370
+ return rawValueParser(bitString.slice(0, enumOptionsData2.stateBits), enumOptionsData2.stateBits);
371
+ };
372
+ var rawParser9 = (bitString, enumOptionsData2) => {
373
+ const state = getStateIndex(enumOptionsData2, bitString);
374
+ bitString = bitString.slice(enumOptionsData2.stateBits);
375
+ const [value, remainingBitstring] = nestedDataBitstringParser(bitString, enumOptionsData2.descriptor[state]);
376
+ return [{ ...enumOptionsData2, value, state }, remainingBitstring];
377
+ };
378
+ var rawStateStringifier3 = (enumOptionsData2) => rawIntStringifier(enumOptionsData2.state, enumOptionsData2.stateBits);
379
+
260
380
  // src/parsers/parsers.ts
261
381
  var valueBitsParser = (bitString, mapData) => {
262
382
  switch (mapData.type) {
263
- case 1 /* BOOLEAN */:
383
+ case "BOOLEAN":
264
384
  return rawParser5(bitString);
265
- case 3 /* INT */:
385
+ case "INT":
266
386
  return rawParser(bitString, mapData);
267
- case 2 /* ENUM */:
387
+ case "ENUM":
268
388
  return rawParser3(bitString, mapData);
269
- case 4 /* FLOAT */:
389
+ case "FLOAT":
270
390
  return rawParser2(bitString, mapData);
271
- case 0 /* VERSION */:
391
+ case "VERSION":
272
392
  return rawParser4(bitString, mapData);
273
- case 5 /* ENUM_ARRAY */:
393
+ case "ENUM_ARRAY":
274
394
  return rawParser6(bitString, mapData);
275
395
  }
276
396
  };
277
397
  var dataBitsParser = (rawString, mapData) => {
278
398
  switch (mapData.type) {
279
- case 1 /* BOOLEAN */:
399
+ case "BOOLEAN":
280
400
  return { ...mapData, value: valueBitsParser(rawString, mapData) };
281
- case 2 /* ENUM */:
282
- case 3 /* INT */:
283
- case 4 /* FLOAT */:
284
- case 0 /* VERSION */:
401
+ case "ENUM":
402
+ case "INT":
403
+ case "FLOAT":
404
+ case "VERSION":
285
405
  return { ...mapData, value: valueBitsParser(rawString, mapData) };
286
- case 5 /* ENUM_ARRAY */:
406
+ case "ENUM_ARRAY":
287
407
  return { ...mapData, value: valueBitsParser(rawString, mapData) };
288
408
  }
289
409
  };
290
410
  var getBitsCount7 = (mapData, bitString) => {
291
411
  switch (mapData.type) {
292
- case 1 /* BOOLEAN */:
412
+ case "BOOLEAN":
293
413
  return getBitsCount5();
294
- case 3 /* INT */:
414
+ case "INT":
295
415
  return getBitsCount(mapData);
296
- case 4 /* FLOAT */:
416
+ case "FLOAT":
297
417
  return getBitsCount2(mapData);
298
- case 0 /* VERSION */:
418
+ case "VERSION":
299
419
  return getBitsCount4(mapData);
300
- case 2 /* ENUM */:
420
+ case "ENUM":
301
421
  return getBitsCount3(mapData);
302
- case 5 /* ENUM_ARRAY */:
422
+ case "ENUM_ARRAY":
303
423
  return getBitsCount6(mapData, bitString);
304
424
  }
305
425
  };
@@ -307,22 +427,50 @@ var dataEntryBitstringParser = (bitstring, dataEntry2) => [
307
427
  dataBitsParser(bitstring.slice(0, getBitsCount7(dataEntry2, bitstring)), dataEntry2),
308
428
  bitstring.slice(getBitsCount7(dataEntry2, bitstring))
309
429
  ];
430
+ var nestedDataBitstringParser = (bitstring, descriptor) => {
431
+ const resultingNestedData = descriptor.map((data) => {
432
+ const [resultingData, remainingBitstring] = ComplexDataValues.includes(data.type) ? complexDataEntryBitstringParser(bitstring, data) : dataEntryBitstringParser(bitstring, data);
433
+ bitstring = remainingBitstring;
434
+ return resultingData;
435
+ });
436
+ return [resultingNestedData, bitstring];
437
+ };
438
+ var complexDataEntryBitstringParser = (bitstring, complexDataEntry) => {
439
+ switch (complexDataEntry.type) {
440
+ case "ARRAY":
441
+ return rawParser7(bitstring, complexDataEntry);
442
+ case "OPTIONAL":
443
+ return rawParser8(bitstring, complexDataEntry);
444
+ case "ENUM_OPTIONS":
445
+ return rawParser9(bitstring, complexDataEntry);
446
+ }
447
+ };
310
448
  var dataBitsStringifier = (data) => {
311
449
  switch (data.type) {
312
- case 1 /* BOOLEAN */:
450
+ case "BOOLEAN":
313
451
  return rawStringifier5(data.value);
314
- case 3 /* INT */:
452
+ case "INT":
315
453
  return rawStringifier(data.value, data);
316
- case 4 /* FLOAT */:
454
+ case "FLOAT":
317
455
  return rawStringifier2(data.value, data);
318
- case 0 /* VERSION */:
456
+ case "VERSION":
319
457
  return rawStringifier4(data.value, data);
320
- case 2 /* ENUM */:
458
+ case "ENUM":
321
459
  return rawStringifier3(data.value, data);
322
- case 5 /* ENUM_ARRAY */:
460
+ case "ENUM_ARRAY":
323
461
  return rawStringifier6(data.value, data);
324
462
  }
325
463
  };
464
+ var complexDataStateStringifier = (complexDataEntry) => {
465
+ switch (complexDataEntry.type) {
466
+ case "ARRAY":
467
+ return rawStateStringifier(complexDataEntry);
468
+ case "OPTIONAL":
469
+ return rawStateStringifier2(complexDataEntry);
470
+ case "ENUM_OPTIONS":
471
+ return rawStateStringifier3(complexDataEntry);
472
+ }
473
+ };
326
474
  var dataEntryCorrecting = (dataEntry2) => dataBitsParser(dataBitsStringifier(dataEntry2), dataEntry2);
327
475
  var base64url = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
328
476
  var getBitsForEnumArrayCountOfBase = (count, base) => Math.ceil(Math.log2(base) * count);
@@ -359,34 +507,22 @@ var parseBase64ToBits = (base64) => {
359
507
  const chunks = numbers.map((n) => n.toString(2).padStart(6, "0"));
360
508
  return chunks.join("");
361
509
  };
362
- var dataArrayStringifier = (dataEntryArray) => {
363
- return dataEntryArray.map(dataBitsStringifier).join("");
364
- };
365
510
  // src/update/floatUpdate.ts
366
511
  var updateValue = (original, update) => {
367
- const value = Math.max(Math.min(update.value, original.max), original.min);
368
- return {
369
- ...original,
370
- value
371
- };
512
+ original.value = Math.max(Math.min(update.value, original.max), original.min);
513
+ return original;
372
514
  };
373
515
 
374
516
  // src/update/intUpdate.ts
375
517
  var updateValue2 = (original, update) => {
376
- const value = Math.max(Math.min(update.value, original.max), original.min);
377
- return {
378
- ...original,
379
- value
380
- };
518
+ original.value = Math.max(Math.min(update.value, original.max), original.min);
519
+ return original;
381
520
  };
382
521
 
383
522
  // src/update/enumUpdate.ts
384
523
  var updateValue3 = (original, update) => {
385
- const value = Math.min(original.max, update.value);
386
- return {
387
- ...original,
388
- value
389
- };
524
+ original.value = Math.min(original.max, update.value);
525
+ return original;
390
526
  };
391
527
 
392
528
  // src/update/versionUpdate.ts
@@ -399,18 +535,55 @@ var updateValue4 = (original, update) => {
399
535
  };
400
536
 
401
537
  // src/update/booleanUpdate.ts
402
- var updateValue5 = (original, update) => ({
403
- ...original,
404
- value: update.value
405
- });
538
+ var updateValue5 = (original, update) => {
539
+ original.value = update.value;
540
+ return original;
541
+ };
406
542
 
407
543
  // src/update/enumArrayUpdate.ts
408
544
  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
- };
545
+ const count = Math.max(Math.min(update.value.length, original.maxCount), original.minCount);
546
+ original.value = [...new Array(count)].map((_, i) => Math.min(update.value[i] ?? 0, original.max));
547
+ return original;
548
+ };
549
+
550
+ // src/update/nestedDataMatching.ts
551
+ var updateNestedData = (original, descriptor) => {
552
+ const descriptorClone = JSON.parse(JSON.stringify(descriptor));
553
+ if (!original)
554
+ return descriptorClone;
555
+ 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);
556
+ };
557
+
558
+ // src/update/optionalUpdate.ts
559
+ var updateComplexValue2 = (original, update) => {
560
+ if (update.descriptor[Number(original.state)] !== null && original.value !== null) {
561
+ original.state = update.state;
562
+ original.value.length = 0;
563
+ original.value.push(...updateNestedData(update.value, original.descriptor[Number(update.state)]));
564
+ }
565
+ return original;
566
+ };
567
+
568
+ // src/update/enumOptionsUpdate.ts
569
+ var updateComplexValue3 = (original, update) => {
570
+ if (update.state <= original.descriptor.length - 1) {
571
+ original.value.length = 0;
572
+ original.value.push(...updateNestedData(update.value, original.descriptor[update.state]));
573
+ original.state = update.state;
574
+ }
575
+ return original;
576
+ };
577
+
578
+ // src/update/arrayUpdate.ts
579
+ var updateComplexValue4 = (original, update) => {
580
+ if (update.state >= original.minCount && update.state <= original.maxCount) {
581
+ original.state = update.state;
582
+ original.value.length = 0;
583
+ for (let i = 0;i < original.state; i++)
584
+ original.value.push(updateNestedData(update.value[i], original.descriptor));
585
+ }
586
+ return original;
414
587
  };
415
588
 
416
589
  // src/update/updateValues.ts
@@ -418,281 +591,197 @@ var updateValue7 = (original, update) => {
418
591
  if (original.type !== update.type)
419
592
  throw new Error("Types do not match");
420
593
  switch (original.type) {
421
- case 4 /* FLOAT */:
594
+ case "FLOAT":
422
595
  return updateValue(original, update);
423
- case 3 /* INT */:
596
+ case "INT":
424
597
  return updateValue2(original, update);
425
- case 2 /* ENUM */:
598
+ case "ENUM":
426
599
  return updateValue3(original, update);
427
- case 1 /* BOOLEAN */:
600
+ case "BOOLEAN":
428
601
  return updateValue5(original, update);
429
- case 0 /* VERSION */:
602
+ case "VERSION":
430
603
  return updateValue4(original, update);
431
- case 5 /* ENUM_ARRAY */:
604
+ case "ENUM_ARRAY":
432
605
  return updateValue6(original, update);
433
606
  }
434
607
  };
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;
608
+ var updateComplexValue = (original, update) => {
609
+ if (original.type !== update.type)
610
+ throw new Error("Types do not match");
611
+ switch (original.type) {
612
+ case "OPTIONAL":
613
+ return updateComplexValue2(original, update);
614
+ case "ENUM_OPTIONS":
615
+ return updateComplexValue3(original, update);
616
+ case "ARRAY":
617
+ return updateComplexValue4(original, update);
618
+ }
619
+ };
620
+ // src/stateHandling/stateData.ts
621
+ var getStateData = (state) => {
622
+ const object = {};
623
+ state.forEach((item) => {
624
+ switch (item.type) {
625
+ case "BOOLEAN":
626
+ object[item.name] = item.value;
627
+ break;
628
+ case "INT":
629
+ object[item.name] = item.value;
630
+ break;
631
+ case "ENUM":
632
+ object[item.name] = item.mapping[item.value];
633
+ break;
634
+ case "FLOAT":
635
+ object[item.name] = item.value;
636
+ break;
637
+ case "VERSION":
638
+ object[item.name] = item.value;
639
+ break;
640
+ case "ENUM_ARRAY":
641
+ object[item.name] = item.value.map((v) => item.mapping[v]);
642
+ break;
643
+ case "OPTIONAL":
644
+ object[item.name] = item.value === null ? null : getStateData(item.value);
645
+ break;
646
+ case "ENUM_OPTIONS":
647
+ object[item.name] = {
648
+ ...getStateData(item.value),
649
+ state: item.state
650
+ };
651
+ break;
652
+ case "ARRAY":
653
+ object[item.name] = item.value.map(getStateData);
654
+ break;
655
+ }
656
+ });
657
+ return object;
658
+ };
470
659
 
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);
660
+ // src/stateHandling/stateDataObject.ts
661
+ var getBitstringForStateDataEntry = (stateDataEntry2) => {
662
+ switch (stateDataEntry2.type) {
663
+ case "BOOLEAN":
664
+ case "INT":
665
+ case "ENUM":
666
+ case "FLOAT":
667
+ case "VERSION":
668
+ case "ENUM_ARRAY":
669
+ return stateDataEntry2.bitstring = stateDataEntry2.bitstring ?? dataBitsStringifier(stateDataEntry2);
670
+ case "OPTIONAL":
671
+ return stateDataEntry2.value === null ? complexDataStateStringifier(stateDataEntry2) : complexDataStateStringifier(stateDataEntry2) + getBitstringForStateNestedData(stateDataEntry2.value);
672
+ case "ENUM_OPTIONS":
673
+ return complexDataStateStringifier(stateDataEntry2) + getBitstringForStateNestedData(stateDataEntry2.value);
674
+ case "ARRAY":
675
+ return complexDataStateStringifier(stateDataEntry2) + stateDataEntry2.value.map((vs) => getBitstringForStateNestedData(vs)).join("");
676
+ }
677
+ };
678
+ var getBitstringForStateNestedData = (nestedData) => nestedData.map(getBitstringForStateDataEntry).join("");
679
+ var setComplexDataEntryValuesAsStateDataEntry = (currenEntry, updateCallback) => {
680
+ switch (currenEntry.type) {
681
+ case "OPTIONAL":
682
+ currenEntry.value = currenEntry.value === null ? null : currenEntry.value.map((v) => getStateDataEntry(v, updateCallback));
683
+ break;
684
+ case "ARRAY":
685
+ currenEntry.value = currenEntry.value.map((vs) => vs.map((v) => getStateDataEntry(v, updateCallback)));
686
+ break;
687
+ case "ENUM_OPTIONS":
688
+ currenEntry.value = currenEntry.value.map((v) => getStateDataEntry(v, updateCallback));
689
+ break;
498
690
  }
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);
691
+ const newBitString = getBitstringForStateDataEntry(currenEntry);
692
+ currenEntry.bitstring = newBitString;
693
+ };
694
+ var updateStateDataEntry = (currenEntry, newEntry, updateCallback) => {
695
+ if (currenEntry.type !== newEntry.type || currenEntry.name !== newEntry.name)
696
+ throw new Error(`Types (${currenEntry.type} & ${newEntry.type}) or names (${currenEntry.name} & ${newEntry.name}) do not match`);
697
+ if (ComplexDataValues.includes(currenEntry.type)) {
698
+ if (currenEntry.state !== newEntry.state) {
699
+ const currentBitString = currenEntry.bitstring;
700
+ const updatedCurrentEntry = updateComplexValue(currenEntry, newEntry);
701
+ setComplexDataEntryValuesAsStateDataEntry(updatedCurrentEntry, updateCallback);
702
+ if (currentBitString !== updatedCurrentEntry.bitstring)
703
+ updateCallback();
704
+ }
705
+ } else {
706
+ const currentBitString = currenEntry.bitstring;
707
+ const updatedCurrentEntry = updateValue7(currenEntry, newEntry);
708
+ updatedCurrentEntry.bitstring = dataBitsStringifier(updatedCurrentEntry);
709
+ if (currentBitString !== updatedCurrentEntry.bitstring)
710
+ updateCallback();
545
711
  }
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
712
+ return currenEntry;
713
+ };
714
+ var getStateDataEntry = (entry, updateCallback) => {
715
+ entry.bitstring = getBitstringForStateDataEntry(entry);
716
+ entry.updateValue = (newEntry) => updateStateDataEntry(entry, newEntry, updateCallback);
717
+ return entry;
718
+ };
719
+ var createStateDataObject = (initialState, updateCallback) => {
720
+ const stateObject = {};
721
+ const wrappedUpdateCallback = () => {
722
+ stateObject.bitstring = getBitstringForStateNestedData(stateObject.state);
723
+ stateObject.base64 = parseBitsToBase64(stateObject.bitstring);
724
+ stateObject.data = getStateData(stateObject.state);
725
+ updateCallback(stateObject);
634
726
  };
727
+ stateObject.state = initialState.map((item) => getStateDataEntry(item, wrappedUpdateCallback));
728
+ wrappedUpdateCallback();
729
+ return stateObject;
635
730
  };
731
+ var getInitialStateFromBase64 = (base64, descriptor) => nestedDataBitstringParser(parseBase64ToBits(base64), descriptor)[0];
636
732
  // src/utils/interpolateData.ts
637
733
  var interpolateEntryAt = (dataEntry2, t) => {
638
734
  const localT = Math.max(Math.min(1, t), 0);
639
735
  const cosT = Math.cos(localT * 2 * Math.PI) * 0.5 + 0.5;
640
736
  switch (dataEntry2.type) {
641
- case 1 /* BOOLEAN */:
737
+ case "BOOLEAN":
642
738
  return { ...dataEntry2, value: Boolean(Math.round(localT)) };
643
- case 0 /* VERSION */:
739
+ case "VERSION":
644
740
  return { ...dataEntry2, value: Math.floor(localT * (dataEntry2.bits ** 2 - 0.001)) };
645
- case 2 /* ENUM */:
741
+ case "ENUM":
646
742
  return { ...dataEntry2, value: Math.floor(localT * (dataEntry2.max + 0.999)) };
647
- case 3 /* INT */:
743
+ case "INT":
648
744
  return { ...dataEntry2, value: dataEntry2.min + Math.floor(cosT * (dataEntry2.max - dataEntry2.min + 0.999)) };
649
- case 4 /* FLOAT */:
745
+ case "FLOAT":
650
746
  const v = dataEntry2.min + cosT * (dataEntry2.max - dataEntry2.min);
651
747
  return dataEntryCorrecting({ ...dataEntry2, value: Math.min(dataEntry2.max, Math.max(v, dataEntry2.min)) });
652
- case 5 /* ENUM_ARRAY */:
748
+ case "ENUM_ARRAY":
653
749
  return { ...dataEntry2, value: dataEntry2.value.map((v2) => Math.floor(localT * (v2 + 0.999))) };
654
750
  }
655
751
  };
656
752
  // src/utils/relativeValue.ts
657
753
  var getRelativeValue = (dataEntry2) => {
658
754
  switch (dataEntry2.type) {
659
- case 1 /* BOOLEAN */:
755
+ case "BOOLEAN":
660
756
  return Number(dataEntry2.value);
661
- case 3 /* INT */:
662
- case 4 /* FLOAT */:
757
+ case "INT":
758
+ case "FLOAT":
663
759
  return (dataEntry2.value - dataEntry2.min) / (dataEntry2.max - dataEntry2.min);
664
- case 0 /* VERSION */:
760
+ case "VERSION":
665
761
  return dataEntry2.value / (2 ** dataEntry2.bits - 1);
666
- case 2 /* ENUM */:
762
+ case "ENUM":
667
763
  return dataEntry2.value / dataEntry2.max;
668
- case 5 /* ENUM_ARRAY */:
764
+ case "ENUM_ARRAY":
669
765
  return dataEntry2.value.reduce((acc, v) => acc + v, 0) / dataEntry2.value.length;
670
766
  }
671
767
  };
672
768
  export {
673
769
  valueBitsParser,
674
770
  parseBase64ToBits,
675
- isSingleLevelContentType,
676
- isDoubleLevelContentType,
677
- isDataEntry,
678
771
  interpolateEntryAt,
679
- getStateValue,
680
772
  getRelativeValue,
681
- getDataEntryArray,
773
+ getInitialStateFromBase64,
682
774
  getBitsCount7 as getBitsCount,
683
- getBase64String,
684
- doubleLevelContentTypeIsOptionalEntryDataType,
685
- doubleLevelContentTypeIsEnumEntryDataType,
686
- doubleLevelContentTypeIsArrayDefinitionType,
687
775
  dataEntryCorrecting,
688
776
  dataEntryBitstringParser,
689
777
  dataBitsStringifier,
690
778
  dataBitsParser,
691
- createParserObject,
779
+ createStateDataObject,
692
780
  SignificandMaxBits,
693
781
  PROTECTED_ATTRIBUTE_NAMES,
694
- PREFIX_SEPERATOR_DELIMETER,
695
782
  IntegerMaxBits,
696
- DataType,
697
- DataEntryFactory
783
+ DataTypeValues,
784
+ DataEntryFactory,
785
+ ComplexDataValues,
786
+ ComplexDataEntryFactory
698
787
  };