@ickb/utils
Version:
General utilities built on top of CCC
170 lines • 4.14 kB
JavaScript
import { ccc, mol } from "@ckb-ccc/core";
export async function getHeader(client, headerKey) {
const { type, value } = headerKey;
let header = undefined;
if (type === "hash") {
header = await client.getHeaderByHash(value);
}
else if (type === "number") {
header = await client.getHeaderByNumber(value);
}
else if (type === "txHash") {
header = (await client.getTransactionWithHeader(value))?.header;
}
if (!header) {
throw new Error("Header not found");
}
return header;
}
export function shuffle(array) {
for (let i = array.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[array[i], array[j]] = [array[j], array[i]];
}
return array;
}
export function binarySearch(n, f) {
let [i, j] = [0, n];
while (i < j) {
const h = Math.trunc((i + j) / 2);
if (!f(h)) {
i = h + 1;
}
else {
j = h;
}
}
return i;
}
export async function asyncBinarySearch(n, f) {
let [i, j] = [0, n];
while (i < j) {
const h = Math.trunc((i + j) / 2);
if (!(await f(h))) {
i = h + 1;
}
else {
j = h;
}
}
return i;
}
export async function collect(inputs) {
const res = [];
for await (const i of inputs) {
res.push(i);
}
return res;
}
export class BufferedGenerator {
constructor(generator, maxSize) {
Object.defineProperty(this, "generator", {
enumerable: true,
configurable: true,
writable: true,
value: generator
});
Object.defineProperty(this, "maxSize", {
enumerable: true,
configurable: true,
writable: true,
value: maxSize
});
Object.defineProperty(this, "buffer", {
enumerable: true,
configurable: true,
writable: true,
value: []
});
for (const value of generator) {
this.buffer.push(value);
if (this.buffer.length >= this.maxSize) {
break;
}
}
}
next(n) {
for (let i = 0; i < n; i++) {
this.buffer.shift();
const { value, done } = this.generator.next();
if (!done) {
this.buffer.push(value);
}
}
}
}
export function max(res, ...rest) {
for (const v of rest) {
if (v > res) {
res = v;
}
}
return res;
}
export function min(res, ...rest) {
for (const v of rest) {
if (v < res) {
res = v;
}
}
return res;
}
export function sum(res, ...rest) {
const elements = [res, ...rest];
let n = elements.length;
while (n > 1) {
const half = n >> 1;
const isOdd = n % 2;
for (let i = 0; i < half; i++) {
elements[i] += elements[n - i - 1];
}
n = half + isOdd;
}
return elements[0];
}
export function gcd(res, ...rest) {
for (let v of rest) {
while (v !== 0n) {
[res, v] = [v, res % v];
}
}
return res;
}
export function* unique(items) {
const set = new Set();
for (const i of items) {
const key = hexFrom(i);
if (!set.has(key)) {
set.add(key);
yield i;
}
}
}
export function hexFrom(v) {
if (typeof v === "string" && isHex(v)) {
return v;
}
if (typeof v === "bigint") {
return `0x${v.toString(16)}`;
}
if (typeof v === "object" && "toBytes" in v) {
v = v.toBytes();
}
return ccc.hexFrom(v);
}
export function isHex(s) {
if (s.length < 2 ||
s.charCodeAt(0) !== 48 ||
s.charCodeAt(1) !== 120 ||
s.length % 2 !== 0) {
return false;
}
for (let i = 2; i < s.length; i++) {
const c = s.charCodeAt(i);
if (!((c >= 48 && c <= 57) || (c >= 97 && c <= 102))) {
return false;
}
}
return true;
}
//# sourceMappingURL=utils.js.map