import { inspect } from 'util' import type { Assert, Asserted, Primitive } from './prelude.js' const partial = >>(kvs: T): Assert<{ [k in keyof T]?: T[k] extends Primitive ? T[k] : Asserted }> => value => { if (typeof value !== 'object' || value == null) { throw new TypeError('Expected object.') } for (const k in kvs) { if (typeof (value as Record)[k] === 'undefined') { continue } const v = kvs[k] if (typeof v === 'function') { try { v((value as Record)[k]) } catch (err: unknown) { throw new TypeError(`[${k}] ${err instanceof Error ? err.message : err}`) } } else if (v !== (value as Record)[k]) { throw new TypeError(`Expected ${inspect(k)} to be ${inspect(v)}, got ${inspect((value as Record)[k])} in ${inspect(value)} object.`) } } return value } export default partial