method/applyToFunc.ts

/** @module Function */

import { isArr } from '@array/isArr'
import { isFunc } from './isFunc'

/**
 * Helper for pipeline. Passes 'item' into 'expression' as its first argument.
 * <br/>Expression may be a function or an array of form: [function, ...remainingArguments].
 * @function
 * @param {*} item
 * @param {*} expression
 */
export const applyToFunc = <T = any>(item: any, expression: any): T => {
  if (isArr(expression)) {
    const [func, ...args] = expression
    return func(item, ...args)
  } else if (isFunc(expression)) {
    return expression(item)
  } else {
    console.error(
      `Pipeline expected either a function or an array (for function expressions). Found ${typeof expression}`
    )
    return item
  }
}