UNPKG

@ickb/utils

Version:

General utilities built on top of CCC

170 lines 4.14 kB
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