export function ob(o: Ob) { return { map: (transform: ObTransform) => ( obMap(o, transform) ), filter: (predicate: ObPredicate) => ( obFilter(o, predicate) ), } } //////////// //////////// ob.pipe = Object.freeze({ map: ( transform: (value: O[keyof O], key: keyof O) => Value, ) => ( (o: O) => obMap(o, transform) ), filter: ( transform: (value: O[keyof O], key: keyof O) => boolean, ) => ( (o: O) => obFilter(o, transform) as {[key: string]: O[keyof O]} ), }) //////////// //////////// export type ObTransform = ( (value: Ob[keyof Ob], key: keyof Ob) => Value ) export type ObPredicate = ( (value: Ob[keyof Ob], key: keyof Ob) => boolean ) //////////// //////////// const obMap = ( o: Ob, transform: ObTransform, ) => { return Object.fromEntries( Object.entries(o).map( ([key, value]: any) => [key, transform(value, key)] ) ) as {[P in keyof Ob]: Value} } const obFilter = ( o: Ob, predicate: ObPredicate, ) => { return Object.fromEntries( Object.entries(o).filter( ([key, value]: any) => predicate(value, key) ) ) as {[P in keyof Ob]?: Ob[keyof Ob]} }