DecompressionTable.js 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.DecompressionTable = void 0;
  4. const JsonPackExtension_1 = require("../JsonPackExtension");
  5. const isSafeInteger = Number.isSafeInteger;
  6. class DecompressionTable {
  7. constructor() {
  8. this.table = [];
  9. }
  10. importTable(rleTable) {
  11. const length = rleTable.length;
  12. if (!length)
  13. return;
  14. const table = this.table;
  15. const first = rleTable[0];
  16. table.push(first);
  17. let i = 1;
  18. if (isSafeInteger(first)) {
  19. let prev = first;
  20. let value;
  21. while (i < length) {
  22. value = rleTable[i];
  23. if (isSafeInteger(value)) {
  24. prev = prev + value;
  25. table.push(prev);
  26. i++;
  27. }
  28. else {
  29. break;
  30. }
  31. }
  32. }
  33. while (i < length)
  34. table.push(rleTable[i++]);
  35. }
  36. getLiteral(index) {
  37. const table = this.table;
  38. return table[index];
  39. }
  40. decompress(value) {
  41. switch (typeof value) {
  42. case 'number': {
  43. return this.getLiteral(value);
  44. }
  45. case 'object': {
  46. if (!value)
  47. return null;
  48. const constructor = value.constructor;
  49. switch (constructor) {
  50. case Object: {
  51. const obj = value;
  52. const newObj = {};
  53. for (const key in obj)
  54. newObj[String(this.getLiteral(Number(key)))] = this.decompress(obj[key]);
  55. return newObj;
  56. }
  57. case Array: {
  58. const arr = value;
  59. const newArr = [];
  60. const len = arr.length;
  61. for (let i = 0; i < len; i++)
  62. newArr.push(this.decompress(arr[i]));
  63. return newArr;
  64. }
  65. case Map: {
  66. const map = value;
  67. const newMap = new Map();
  68. map.forEach((value, key) => {
  69. newMap.set(this.decompress(key), this.decompress(value));
  70. });
  71. return newMap;
  72. }
  73. case Set: {
  74. const set = value;
  75. const newSet = new Set();
  76. set.forEach((value) => {
  77. newSet.add(this.decompress(value));
  78. });
  79. break;
  80. }
  81. case JsonPackExtension_1.JsonPackExtension: {
  82. const ext = value;
  83. const newExt = new JsonPackExtension_1.JsonPackExtension(Number(this.getLiteral(ext.tag)), this.decompress(ext.val));
  84. return newExt;
  85. }
  86. }
  87. return value;
  88. }
  89. default: {
  90. return value;
  91. }
  92. }
  93. }
  94. }
  95. exports.DecompressionTable = DecompressionTable;
  96. //# sourceMappingURL=DecompressionTable.js.map