Something went wrong. Try again.
Bluesky app fork with some witchin' additions 💫 forked from jollywhoppers.com/witchsky.app
Something went wrong. Try again.
2.4 kB · 98 lines
TypeScript
at main
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899export function choose<U, T extends Record<string, U>>( value: keyof T, choices: T,): U { return choices[value]}
export function dedupArray<T>(arr: T[]): T[] { const s = new Set(arr) return [...s]}
/** * Taken from @tanstack/query-core utils.ts * Modified to support Date object comparisons * * This function returns `a` if `b` is deeply equal. * If not, it will replace any deeply equal children of `b` with those of `a`. * This can be used for structural sharing between JSON values for example. */export function replaceEqualDeep(a: any, b: any): any { if (a === b) { return a }
if (a instanceof Date && b instanceof Date) { return a.getTime() === b.getTime() ? a : b }
const array = isPlainArray(a) && isPlainArray(b)
if (array || (isPlainObject(a) && isPlainObject(b))) { const aItems = array ? a : Object.keys(a) const aSize = aItems.length const bItems = array ? b : Object.keys(b) const bSize = bItems.length const copy: any = array ? [] : {}
let equalItems = 0
for (let i = 0; i < bSize; i++) { const key = array ? i : bItems[i] if ( !array && a[key] === undefined && b[key] === undefined && aItems.includes(key) ) { copy[key] = undefined equalItems++ } else { copy[key] = replaceEqualDeep(a[key], b[key]) if (copy[key] === a[key] && a[key] !== undefined) { equalItems++ } } }
return aSize === bSize && equalItems === aSize ? a : copy }
return b}
export function isPlainArray(value: unknown) { return Array.isArray(value) && value.length === Object.keys(value).length}
// Copied from: https://github.com/jonschlinkert/is-plain-objectexport function isPlainObject(o: any): o is object { if (!hasObjectPrototype(o)) { return false }
// If has no constructor const ctor = o.constructor if (ctor === undefined) { return true }
// If has modified prototype const prot = ctor.prototype if (!hasObjectPrototype(prot)) { return false }
// If constructor does not have an Object-specific method if (!prot.hasOwnProperty('isPrototypeOf')) { return false }
// Most likely a plain Object return true}
function hasObjectPrototype(o: any): boolean { return Object.prototype.toString.call(o) === '[object Object]'}