/* IMPORT */ import isObservable from '~/methods/is_observable'; import {isArray, isFunction} from '~/utils/lang'; import type {FN, ObservableReadonly} from '~/types'; /* HELPERS */ type F = T extends () => infer U ? U : T; type O = T extends ObservableReadonly ? U : T; /* MAIN */ //TODO: Maybe port this to oby, as "resolved" function useResolved ( value: readonly [T1, T2, T3, T4, T5, T6, T7, T8, T9], resolveFunction?: true ): [F, F, F, F, F, F, F, F, F]; function useResolved ( value: readonly [T1, T2, T3, T4, T5, T6, T7, T8], resolveFunction?: true ): [F, F, F, F, F, F, F, F]; function useResolved ( value: readonly [T1, T2, T3, T4, T5, T6, T7], resolveFunction?: true ): [F, F, F, F, F, F, F]; function useResolved ( value: readonly [T1, T2, T3, T4, T5, T6], resolveFunction?: true ): [F, F, F, F, F, F]; function useResolved ( value: readonly [T1, T2, T3, T4, T5], resolveFunction?: true ): [F, F, F, F, F]; function useResolved ( value: readonly [T1, T2, T3, T4], resolveFunction?: true ): [F, F, F, F]; function useResolved ( value: readonly [T1, T2, T3], resolveFunction?: true ): [F, F, F]; function useResolved ( value: readonly [T1, T2], resolveFunction?: true ): [F, F]; function useResolved ( value: readonly [T1], resolveFunction?: true ): [F]; function useResolved ( value: readonly [], resolveFunction?: true ): []; function useResolved ( value: readonly [T1, T2, T3, T4, T5, T6, T7, T8, T9], resolveFunction: false ): [O, O, O, O, O, O, O, O, O]; function useResolved ( value: readonly [T1, T2, T3, T4, T5, T6, T7, T8], resolveFunction: false ): [O, O, O, O, O, O, O, O]; function useResolved ( value: readonly [T1, T2, T3, T4, T5, T6, T7], resolveFunction: false ): [O, O, O, O, O, O, O]; function useResolved ( value: readonly [T1, T2, T3, T4, T5, T6], resolveFunction: false ): [O, O, O, O, O, O]; function useResolved ( value: readonly [T1, T2, T3, T4, T5], resolveFunction: false ): [O, O, O, O, O]; function useResolved ( value: readonly [T1, T2, T3, T4], resolveFunction: false ): [O, O, O, O]; function useResolved ( value: readonly [T1, T2, T3], resolveFunction: false ): [O, O, O]; function useResolved ( value: readonly [T1, T2], resolveFunction: false ): [O, O]; function useResolved ( value: readonly [T1], resolveFunction: false ): [O]; function useResolved ( value: readonly [], resolveFunction: false ): []; function useResolved ( value: readonly [T1, T2, T3, T4, T5, T6, T7, T8, T9], callback: FN<[F, F, F, F, F, F, F, F, F], R>, resolveFunction?: true ): R; function useResolved ( value: readonly [T1, T2, T3, T4, T5, T6, T7, T8], callback: FN<[F, F, F, F, F, F, F, F], R>, resolveFunction?: true ): R; function useResolved ( value: readonly [T1, T2, T3, T4, T5, T6, T7], callback: FN<[F, F, F, F, F, F, F], R>, resolveFunction?: true ): R; function useResolved ( value: readonly [T1, T2, T3, T4, T5, T6], callback: FN<[F, F, F, F, F, F], R>, resolveFunction?: true ): R; function useResolved ( value: readonly [T1, T2, T3, T4, T5], callback: FN<[F, F, F, F, F], R>, resolveFunction?: true ): R; function useResolved ( value: readonly [T1, T2, T3, T4], callback: FN<[F, F, F, F], R>, resolveFunction?: true ): R; function useResolved ( value: readonly [T1, T2, T3], callback: FN<[F, F, F], R>, resolveFunction?: true ): R; function useResolved ( value: readonly [T1, T2], callback: FN<[F, F], R>, resolveFunction?: true ): R; function useResolved ( value: readonly [T1], callback: FN<[F], R>, resolveFunction?: true ): R; function useResolved ( value: readonly [], callback: FN<[], R>, resolveFunction?: true ): R; function useResolved ( value: readonly [T1, T2, T3, T4, T5, T6, T7, T8, T9], callback: FN<[O, O, O, O, O, O, O, O, O], R>, resolveFunction: false ): R; function useResolved ( value: readonly [T1, T2, T3, T4, T5, T6, T7, T8], callback: FN<[O, O, O, O, O, O, O, O], R>, resolveFunction: false ): R; function useResolved ( value: readonly [T1, T2, T3, T4, T5, T6, T7], callback: FN<[O, O, O, O, O, O, O], R>, resolveFunction: false ): R; function useResolved ( value: readonly [T1, T2, T3, T4, T5, T6], callback: FN<[O, O, O, O, O, O], R>, resolveFunction: false ): R; function useResolved ( value: readonly [T1, T2, T3, T4, T5], callback: FN<[O, O, O, O, O], R>, resolveFunction: false ): R; function useResolved ( value: readonly [T1, T2, T3, T4], callback: FN<[O, O, O, O], R>, resolveFunction: false ): R; function useResolved ( value: readonly [T1, T2, T3], callback: FN<[O, O, O], R>, resolveFunction: false ): R; function useResolved ( value: readonly [T1, T2], callback: FN<[O, O], R>, resolveFunction: false ): R; function useResolved ( value: readonly [T1], callback: FN<[O], R>, resolveFunction: false ): R; function useResolved ( value: readonly [], callback: FN<[], R>, resolveFunction: false ): R; function useResolved ( value: T, resolveFunction?: true ): F; function useResolved ( value: T, resolveFunction: false ): O; function useResolved ( value: T, callback: FN<[F], R>, resolveFunction?: true ): R; function useResolved ( value: T, callback: FN<[O], R>, resolveFunction: false ): R; function useResolved ( values: any, callback: any, resolveFunction?: boolean ) { const isResolvable = ( resolveFunction !== false && callback !== false ) ? isFunction : isObservable; const resolve = ( value: any ) => isResolvable ( value ) ? value () : value; if ( isArray ( values ) ) { const resolved = values.map ( resolve ); if ( isFunction ( callback ) ) { return callback.apply ( undefined, resolved ); } else { return resolved; } } else { const resolved = resolve ( values ); if ( isFunction ( callback ) ) { return callback ( resolved ); } else { return resolved; } } } /* EXPORT */ export default useResolved;