diff --git a/lib/collections/unordered-map.d.ts b/lib/collections/unordered-map.d.ts index 609bae4be..eb31a8833 100644 --- a/lib/collections/unordered-map.d.ts +++ b/lib/collections/unordered-map.d.ts @@ -9,9 +9,6 @@ export declare class UnorderedMap { constructor(prefix: Bytes); len(): number; isEmpty(): boolean; - serializeIndex(index: number): Bytes; - deserializeIndex(rawIndex: Bytes): number; - getIndexRaw(key: Bytes): Bytes; get(key: Bytes): unknown | null; set(key: Bytes, value: unknown): unknown | null; remove(key: Bytes): unknown | null; diff --git a/lib/collections/unordered-map.js b/lib/collections/unordered-map.js index 3cb0d1809..b644d262f 100644 --- a/lib/collections/unordered-map.js +++ b/lib/collections/unordered-map.js @@ -2,6 +2,21 @@ import * as near from "../api"; import { u8ArrayToBytes, bytesToU8Array } from "../utils"; import { Vector, VectorIterator } from "./vector"; const ERR_INCONSISTENT_STATE = "The collection is an inconsistent state. Did previous smart contract execution terminate unexpectedly?"; +function serializeIndex(index) { + let data = new Uint32Array([index]); + let array = new Uint8Array(data.buffer); + return u8ArrayToBytes(array); +} +function deserializeIndex(rawIndex) { + let array = bytesToU8Array(rawIndex); + let data = new Uint32Array(array.buffer); + return data[0]; +} +function getIndexRaw(keyIndexPrefix, key) { + let indexLookup = keyIndexPrefix + JSON.stringify(key); + let indexRaw = near.storageRead(indexLookup); + return indexRaw; +} export class UnorderedMap { constructor(prefix) { this.length = 0; @@ -28,25 +43,10 @@ export class UnorderedMap { } return keysIsEmpty; } - serializeIndex(index) { - let data = new Uint32Array([index]); - let array = new Uint8Array(data.buffer); - return u8ArrayToBytes(array); - } - deserializeIndex(rawIndex) { - let array = bytesToU8Array(rawIndex); - let data = new Uint32Array(array.buffer); - return data[0]; - } - getIndexRaw(key) { - let indexLookup = this.keyIndexPrefix + JSON.stringify(key); - let indexRaw = near.storageRead(indexLookup); - return indexRaw; - } get(key) { - let indexRaw = this.getIndexRaw(key); + let indexRaw = getIndexRaw(this.keyIndexPrefix, key); if (indexRaw) { - let index = this.deserializeIndex(indexRaw); + let index = deserializeIndex(indexRaw); let value = this.values.get(index); if (value) { return value; @@ -61,12 +61,12 @@ export class UnorderedMap { let indexLookup = this.keyIndexPrefix + JSON.stringify(key); let indexRaw = near.storageRead(indexLookup); if (indexRaw) { - let index = this.deserializeIndex(indexRaw); + let index = deserializeIndex(indexRaw); return this.values.replace(index, value); } else { let nextIndex = this.len(); - let nextIndexRaw = this.serializeIndex(nextIndex); + let nextIndexRaw = serializeIndex(nextIndex); near.storageWrite(indexLookup, nextIndexRaw); this.keys.push(key); this.values.push(value); @@ -97,7 +97,7 @@ export class UnorderedMap { near.storageWrite(lastLookupKey, indexRaw); } } - let index = this.deserializeIndex(indexRaw); + let index = deserializeIndex(indexRaw); this.keys.swapRemove(index); return this.values.swapRemove(index); } diff --git a/lib/collections/unordered-set.d.ts b/lib/collections/unordered-set.d.ts index b1be5ac5d..4db030d97 100644 --- a/lib/collections/unordered-set.d.ts +++ b/lib/collections/unordered-set.d.ts @@ -8,8 +8,6 @@ export declare class UnorderedSet { constructor(prefix: Bytes); len(): number; isEmpty(): boolean; - serializeIndex(index: number): string; - deserializeIndex(rawIndex: Bytes): number; contains(element: unknown): boolean; set(element: unknown): boolean; remove(element: unknown): boolean; diff --git a/lib/collections/unordered-set.js b/lib/collections/unordered-set.js index f36704b09..5466bc866 100644 --- a/lib/collections/unordered-set.js +++ b/lib/collections/unordered-set.js @@ -2,6 +2,16 @@ import * as near from "../api"; import { u8ArrayToBytes, bytesToU8Array } from "../utils"; import { Vector } from "./vector"; const ERR_INCONSISTENT_STATE = "The collection is an inconsistent state. Did previous smart contract execution terminate unexpectedly?"; +function serializeIndex(index) { + let data = new Uint32Array([index]); + let array = new Uint8Array(data.buffer); + return u8ArrayToBytes(array); +} +function deserializeIndex(rawIndex) { + let array = bytesToU8Array(rawIndex); + let data = new Uint32Array(array.buffer); + return data[0]; +} export class UnorderedSet { constructor(prefix) { this.length = 0; @@ -16,16 +26,6 @@ export class UnorderedSet { isEmpty() { return this.elements.isEmpty(); } - serializeIndex(index) { - let data = new Uint32Array([index]); - let array = new Uint8Array(data.buffer); - return u8ArrayToBytes(array); - } - deserializeIndex(rawIndex) { - let array = bytesToU8Array(rawIndex); - let data = new Uint32Array(array.buffer); - return data[0]; - } contains(element) { let indexLookup = this.elementIndexPrefix + JSON.stringify(element); return near.storageHasKey(indexLookup); @@ -37,7 +37,7 @@ export class UnorderedSet { } else { let nextIndex = this.len(); - let nextIndexRaw = this.serializeIndex(nextIndex); + let nextIndexRaw = serializeIndex(nextIndex); near.storageWrite(indexLookup, nextIndexRaw); this.elements.push(element); return true; @@ -67,7 +67,7 @@ export class UnorderedSet { near.storageWrite(lastLookupElement, indexRaw); } } - let index = this.deserializeIndex(indexRaw); + let index = deserializeIndex(indexRaw); this.elements.swapRemove(index); return true; } diff --git a/src/collections/unordered-map.ts b/src/collections/unordered-map.ts index d36072cfa..f18abd3c7 100644 --- a/src/collections/unordered-map.ts +++ b/src/collections/unordered-map.ts @@ -5,6 +5,24 @@ import { Vector, VectorIterator } from "./vector"; const ERR_INCONSISTENT_STATE = "The collection is an inconsistent state. Did previous smart contract execution terminate unexpectedly?"; +function serializeIndex(index: number): Bytes { + let data = new Uint32Array([index]); + let array = new Uint8Array(data.buffer); + return u8ArrayToBytes(array); +} + +function deserializeIndex(rawIndex: Bytes) { + let array = bytesToU8Array(rawIndex); + let data = new Uint32Array(array.buffer); + return data[0]; +} + +function getIndexRaw(keyIndexPrefix: Bytes, key: Bytes): Bytes { + let indexLookup = keyIndexPrefix + JSON.stringify(key); + let indexRaw = near.storageRead(indexLookup); + return indexRaw; +} + export class UnorderedMap { readonly length: number; readonly prefix: Bytes; @@ -40,28 +58,10 @@ export class UnorderedMap { return keysIsEmpty; } - serializeIndex(index: number): Bytes { - let data = new Uint32Array([index]); - let array = new Uint8Array(data.buffer); - return u8ArrayToBytes(array); - } - - deserializeIndex(rawIndex: Bytes) { - let array = bytesToU8Array(rawIndex); - let data = new Uint32Array(array.buffer); - return data[0]; - } - - getIndexRaw(key: Bytes): Bytes { - let indexLookup = this.keyIndexPrefix + JSON.stringify(key); - let indexRaw = near.storageRead(indexLookup); - return indexRaw; - } - get(key: Bytes): unknown | null { - let indexRaw = this.getIndexRaw(key); + let indexRaw = getIndexRaw(this.keyIndexPrefix, key); if (indexRaw) { - let index = this.deserializeIndex(indexRaw); + let index = deserializeIndex(indexRaw); let value = this.values.get(index); if (value) { return value; @@ -76,11 +76,11 @@ export class UnorderedMap { let indexLookup = this.keyIndexPrefix + JSON.stringify(key); let indexRaw = near.storageRead(indexLookup); if (indexRaw) { - let index = this.deserializeIndex(indexRaw); + let index = deserializeIndex(indexRaw); return this.values.replace(index, value); } else { let nextIndex = this.len(); - let nextIndexRaw = this.serializeIndex(nextIndex); + let nextIndexRaw = serializeIndex(nextIndex); near.storageWrite(indexLookup, nextIndexRaw); this.keys.push(key); this.values.push(value); @@ -111,7 +111,7 @@ export class UnorderedMap { near.storageWrite(lastLookupKey, indexRaw); } } - let index = this.deserializeIndex(indexRaw); + let index = deserializeIndex(indexRaw); this.keys.swapRemove(index); return this.values.swapRemove(index); } @@ -162,7 +162,7 @@ export class UnorderedMap { // reconstruct values Vector map.values = new Vector(data.prefix + "v"); map.values.length = data.values.length; - return map; + return map as UnorderedMap; } } diff --git a/src/collections/unordered-set.ts b/src/collections/unordered-set.ts index 1094f11ae..2df62eaf1 100644 --- a/src/collections/unordered-set.ts +++ b/src/collections/unordered-set.ts @@ -6,6 +6,18 @@ import { Mutable } from "../utils"; const ERR_INCONSISTENT_STATE = "The collection is an inconsistent state. Did previous smart contract execution terminate unexpectedly?"; +function serializeIndex(index: number) { + let data = new Uint32Array([index]); + let array = new Uint8Array(data.buffer); + return u8ArrayToBytes(array); +} + +function deserializeIndex(rawIndex: Bytes): number { + let array = bytesToU8Array(rawIndex); + let data = new Uint32Array(array.buffer); + return data[0]; +} + export class UnorderedSet { readonly length: number; readonly prefix: Bytes; @@ -28,18 +40,6 @@ export class UnorderedSet { return this.elements.isEmpty(); } - serializeIndex(index: number) { - let data = new Uint32Array([index]); - let array = new Uint8Array(data.buffer); - return u8ArrayToBytes(array); - } - - deserializeIndex(rawIndex: Bytes): number { - let array = bytesToU8Array(rawIndex); - let data = new Uint32Array(array.buffer); - return data[0]; - } - contains(element: unknown): boolean { let indexLookup = this.elementIndexPrefix + JSON.stringify(element); return near.storageHasKey(indexLookup); @@ -51,7 +51,7 @@ export class UnorderedSet { return false; } else { let nextIndex = this.len(); - let nextIndexRaw = this.serializeIndex(nextIndex); + let nextIndexRaw = serializeIndex(nextIndex); near.storageWrite(indexLookup, nextIndexRaw); this.elements.push(element); return true; @@ -81,7 +81,7 @@ export class UnorderedSet { near.storageWrite(lastLookupElement, indexRaw); } } - let index = this.deserializeIndex(indexRaw); + let index = deserializeIndex(indexRaw); this.elements.swapRemove(index); return true; } @@ -129,6 +129,6 @@ export class UnorderedSet { let elementsPrefix = data.prefix + "e"; set.elements = new Vector(elementsPrefix); set.elements.length = data.elements.length; - return set; + return set as UnorderedSet; } } diff --git a/tests/jsconfig.json b/tests/jsconfig.json index d49b02077..e4e17cc70 100644 --- a/tests/jsconfig.json +++ b/tests/jsconfig.json @@ -1,8 +1,8 @@ { "compilerOptions": { - "experimentalDecorators": true, + "experimentalDecorators": true }, "exclude": [ "node_modules" - ], + ] } \ No newline at end of file diff --git a/tests/src/unordered-map.js b/tests/src/unordered-map.js index 639dc4066..aa70f09a1 100644 --- a/tests/src/unordered-map.js +++ b/tests/src/unordered-map.js @@ -29,21 +29,6 @@ class UnorderedMapTestContract extends NearContract { return this.unorderedMap.isEmpty(); } - @view - serializeIndex({index}) { - return this.unorderedMap.serializeIndex(index); - } - - @view - deserializeIndex({rawIndex}) { - return this.unorderedMap.deserializeIndex(rawIndex); - } - - @view - getIndexRaw({key}) { - return this.unorderedMap.getIndexRaw(key); - } - @view get({key}) { return this.unorderedMap.get(key);