/** @module function/parallelObj.ts */ import { AnyFunction } from '../helper-types' import { assoc } from '../object' import type from '../type/type' import untypedCurry from './untypedCurry' type ParallelObjRecursive = { [K in keyof O] : O[K] extends ( ( a: Input ) => infer B ) ? B : ParallelObjRecursive } const _parallelObjA = ( arr, input ) => arr.map( ( val ) => type( val ) !== 'Function' ? type( val ) === 'Object' ? _parallelObjO( val, input ) : type( val ) === 'Array' ? _parallelObjA( val, input ) : val : ( val as AnyFunction )( input ) , ) // export declare function parallelObj( obj: O , input: Input ): ParallelObjRecursive const _parallelObjO = ( obj, input ) => Object.entries( obj ).reduce( ( acc, [ key, val ] ) => type( val ) !== 'Function' ? type( val ) === 'Object' ? assoc( acc, key, _parallelObjO( val, input ) ) : type( val ) === 'Array' ? assoc( acc, key, _parallelObjA( val, input ) ) : assoc( acc, key, val ) : assoc( acc, key, ( val as AnyFunction )( input ) ), {} ) // : shouldCopy( type( val ) ) export function parallelObj( obj: O , input: Input ): O extends [any, ...any[]] ? ParallelObjRecursive : ParallelObjRecursive export function parallelObj( obj: O ): ( input: Input ) => ParallelObjRecursive export function parallelObj( ...args ) { return untypedCurry( ( obj, input ) => type( obj ) === 'Object' ? _parallelObjO( obj, input ) : _parallelObjA( obj, input ) )( ...args ) }