Spaces:
Running
on
CPU Upgrade
Running
on
CPU Upgrade
import type { PipelineType } from "@huggingface/tasks"; | |
const ESCAPED = { | |
'"': """, | |
"'": "'", | |
"&": "&", | |
"<": "<", | |
">": ">", | |
}; | |
/** | |
* Returns a function that clamps input value to range [min <= x <= max]. | |
*/ | |
export function clamp(x: number, min: number, max: number): number { | |
return Math.max(min, Math.min(x, max)); | |
} | |
/** | |
* Similar to lodash's uniqBy. In case of multiple items with the same key, | |
* only the first one is kept. | |
*/ | |
export function uniqBy<T, K>(items: T[], itemToKey: (item: T) => K): T[] { | |
const keys = new Set(items.map((item) => itemToKey(item))); | |
return items.filter((item) => { | |
// Will return true if was in set - e.g. was the first item with its key. | |
return keys.delete(itemToKey(item)); | |
}); | |
} | |
export function typedKeys<K extends string, V>(obj: { [k in K]: V }): K[] { | |
return Object.keys(obj) as K[]; | |
} | |
/** | |
* HTML escapes the passed string | |
*/ | |
export function escape(html: unknown): string { | |
return String(html).replace(/["'&<>]/g, (match) => ESCAPED[match as keyof typeof ESCAPED]); | |
} | |
/** | |
* Returns a promise that will resolve after the specified time | |
* @param ms Number of ms to wait | |
*/ | |
export function delay(ms: number): Promise<void> { | |
return new Promise((resolve) => { | |
setTimeout(() => resolve(), ms); | |
}); | |
} | |
/** | |
* "Real" modulo (always >= 0), not remainder. | |
*/ | |
export function mod(a: number, n: number): number { | |
return ((a % n) + n) % n; | |
} | |
/** | |
* Sum of elements in array | |
*/ | |
export function sum(arr: number[]): number { | |
return arr.reduce((a, b) => a + b, 0); | |
} | |
/** | |
* Return a random item from an array | |
*/ | |
export function randomItem<T>(arr: T[]): T { | |
return arr[Math.floor(Math.random() * arr.length)]; | |
} | |
/** | |
* Safely parse JSON | |
*/ | |
export function parseJSON<T>(x: unknown): T | undefined { | |
if (!x || typeof x !== "string") { | |
return undefined; | |
} | |
try { | |
return JSON.parse(x); | |
} catch (e) { | |
if (e instanceof SyntaxError) { | |
console.error(e.name); | |
} else if (e instanceof Error) { | |
console.error(e.message); | |
} else { | |
console.error(e); | |
} | |
return undefined; | |
} | |
} | |
/** | |
* Return true if an HTML element is scrolled all the way | |
*/ | |
export function isFullyScrolled(elt: HTMLElement): boolean { | |
return elt.scrollHeight - Math.abs(elt.scrollTop) === elt.clientHeight; | |
} | |
/** | |
* Smoothly scroll an element all the way | |
*/ | |
export function scrollToMax(elt: HTMLElement, axis: "x" | "y" = "y"): void { | |
elt.scroll({ | |
behavior: "smooth", | |
left: axis === "x" ? elt.scrollWidth : undefined, | |
top: axis === "y" ? elt.scrollHeight : undefined, | |
}); | |
} | |
/** | |
* Converts hex string to rgb array (i.e. [r,g,b]) | |
* original from https://stackoverflow.com/a/39077686/6558628 | |
*/ | |
export function hexToRgb(hex: string): number[] { | |
return ( | |
hex | |
.replace(/^#?([a-f\d])([a-f\d])([a-f\d])$/i, (_, r, g, b) => "#" + r + r + g + g + b + b) | |
.substring(1) | |
.match(/.{2}/g) | |
?.map((x) => parseInt(x, 16)) || [0, 0, 0] | |
); | |
} | |
// Get the Task id corresponding to the modelPipeline (should be === in 99% cases) | |
export function getPipelineTask(modelPipeline: PipelineType): PipelineType { | |
return modelPipeline === "text2text-generation" ? "text-generation" : modelPipeline; | |
} | |
/** | |
* For Tailwind: | |
bg-blue-100 border-blue-100 dark:bg-blue-800 dark:border-blue-800 | |
bg-green-100 border-green-100 dark:bg-green-800 dark:border-green-800 | |
bg-yellow-100 border-yellow-100 dark:bg-yellow-800 dark:border-yellow-800 | |
bg-purple-100 border-purple-100 dark:bg-purple-800 dark:border-purple-800 | |
bg-red-100 border-red-100 dark:bg-red-800 dark:border-red-800 | |
*/ | |