Flatten calls (#1200)

This commit is contained in:
Jaco
2021-11-18 08:48:15 +02:00
committed by GitHub
parent 93fb633ea6
commit 6f0aa35098
5 changed files with 69 additions and 72 deletions
+1 -1
View File
@@ -2,7 +2,7 @@
// SPDX-License-Identifier: Apache-2.0
export function arrayShuffle <T> (input: T[]): T[] {
const result = [...input];
const result = input.slice();
let curr = result.length;
if (curr === 1) {
+8 -8
View File
@@ -20,24 +20,24 @@ import { u8aToBn, u8aToU8a } from '../u8a';
* console.log('value offset=', offset, 'length=', length); // 4, 0xffff
* ```
*/
export function compactFromU8a (_input: U8aLike): [number, BN] {
const input = u8aToU8a(_input);
const flag = input[0] & 0b11;
export function compactFromU8a (input: U8aLike): [number, BN] {
const u8a = u8aToU8a(input);
const flag = u8a[0] & 0b11;
if (flag === 0b00) {
return [1, new BN(input[0]).ishrn(2)];
return [1, new BN(u8a[0]).ishrn(2)];
} else if (flag === 0b01) {
return [2, u8aToBn(input.subarray(0, 2), true).ishrn(2)];
return [2, u8aToBn(u8a.subarray(0, 2), true).ishrn(2)];
} else if (flag === 0b10) {
return [4, u8aToBn(input.subarray(0, 4), true).ishrn(2)];
return [4, u8aToBn(u8a.subarray(0, 4), true).ishrn(2)];
}
const offset = 1 + (
new BN(input[0])
new BN(u8a[0])
.ishrn(2) // clear flag
.iadd(BN_FOUR) // add 4 for base length
.toNumber()
);
return [offset, u8aToBn(input.subarray(1, offset), true)];
return [offset, u8aToBn(u8a.subarray(1, offset), true)];
}
+9 -9
View File
@@ -21,18 +21,18 @@ const MAX_U32 = BN_TWO.pow(new BN(32 - 2)).isub(BN_ONE);
* console.log(compactToU8a(511, 32)); // Uint8Array([0b11111101, 0b00000111])
* ```
*/
export function compactToU8a (_value: BN | bigint | number): Uint8Array {
const value = bnToBn(_value);
export function compactToU8a (value: BN | bigint | number): Uint8Array {
const bn = bnToBn(value);
if (value.lte(MAX_U8)) {
return new Uint8Array([value.toNumber() << 2]);
} else if (value.lte(MAX_U16)) {
return bnToU8a(value.shln(2).iadd(BN_ONE), 16, true);
} else if (value.lte(MAX_U32)) {
return bnToU8a(value.shln(2).iadd(BN_TWO), 32, true);
if (bn.lte(MAX_U8)) {
return new Uint8Array([bn.toNumber() << 2]);
} else if (bn.lte(MAX_U16)) {
return bnToU8a(bn.shln(2).iadd(BN_ONE), 16, true);
} else if (bn.lte(MAX_U32)) {
return bnToU8a(bn.shln(2).iadd(BN_TWO), 32, true);
}
const u8a = bnToU8a(value);
const u8a = bnToU8a(bn);
let length = u8a.length;
// adjust to the minimum number of bytes
+26 -28
View File
@@ -5,33 +5,6 @@ import type { HexString } from '../types';
import { u8aToU8a } from './toU8a';
function compare (a: Uint8Array, b: Uint8Array): number {
let i = 0;
while (true) {
const overA = i >= a.length;
const overB = i >= b.length;
if (overA && overB) {
// both ends reached
return 0;
} else if (overA) {
// a has no more data, b has data
return -1;
} else if (overB) {
// b has no more data, a has data
return 1;
} else if (a[i] !== b[i]) {
// the number in this index doesn't match
return a[i] > b[i]
? 1
: -1;
}
i++;
}
}
/**
* @name u8aCmp
* @summary Compares two Uint8Arrays for sorting.
@@ -49,5 +22,30 @@ function compare (a: Uint8Array, b: Uint8Array): number {
* ```
*/
export function u8aCmp (a: HexString | Uint8Array | string, b: HexString | Uint8Array | string): number {
return compare(u8aToU8a(a), u8aToU8a(b));
const u8aa = u8aToU8a(a);
const u8ab = u8aToU8a(b);
let i = 0;
while (true) {
const overA = i >= u8aa.length;
const overB = i >= u8ab.length;
if (overA && overB) {
// both ends reached
return 0;
} else if (overA) {
// a has no more data, b has data
return -1;
} else if (overB) {
// b has no more data, a has data
return 1;
} else if (u8aa[i] !== u8ab[i]) {
// the number in this index doesn't match
return u8aa[i] > u8ab[i]
? 1
: -1;
}
i++;
}
}
+25 -26
View File
@@ -5,31 +5,6 @@ import type { HexString } from '../types';
import { u8aToU8a } from './toU8a';
function equals (a: Uint8Array, b: Uint8Array): boolean {
if (a.length === b.length) {
const dvA = new DataView(a.buffer, a.byteOffset);
const dvB = new DataView(b.buffer, b.byteOffset);
const mod = a.length % 4;
const length = a.length - mod;
for (let i = 0; i < length; i += 4) {
if (dvA.getUint32(i) !== dvB.getUint32(i)) {
return false;
}
}
for (let i = length; i < a.length; i++) {
if (a[i] !== b[i]) {
return false;
}
}
return true;
}
return false;
}
/**
* @name u8aEq
* @summary Compares two Uint8Arrays for equality.
@@ -45,5 +20,29 @@ function equals (a: Uint8Array, b: Uint8Array): boolean {
* ```
*/
export function u8aEq (a: HexString | Uint8Array | string, b: HexString | Uint8Array | string): boolean {
return equals(u8aToU8a(a), u8aToU8a(b));
const u8aa = u8aToU8a(a);
const u8ab = u8aToU8a(b);
if (u8aa.length === u8ab.length) {
const dvA = new DataView(u8aa.buffer, u8aa.byteOffset);
const dvB = new DataView(u8ab.buffer, u8ab.byteOffset);
const mod = u8aa.length % 4;
const length = u8aa.length - mod;
for (let i = 0; i < length; i += 4) {
if (dvA.getUint32(i) !== dvB.getUint32(i)) {
return false;
}
}
for (let i = length; i < u8aa.length; i++) {
if (u8aa[i] !== u8ab[i]) {
return false;
}
}
return true;
}
return false;
}