Piping function in JavaScript – Part 2

Create a function that accepts multiple functions as an argument and a value and run this value through each function and return the final output.

Also checkout piping function – part 1.

Example

Input:
const val = { salary: 10000 };

const getSalary = (person) => person.salary
const addBonus = (netSalary) => netSalary + 1000;
const deductTax = (grossSalary) => grossSalary - (grossSalary * .3);

const result = pipe(
  getSalary,
  addBonus,
  deductTax 
)(val);

Output:
7700

The best way to solve this is by forming a closure, create two functions.

In the first function accept all the functions as argument and inside it create another function and return it. The inner function will accept the value and it will pass the value through the functions that are received in the outer function in the sequence.

At the end return the final output from the last function.

// accept functions as arguments
// using rest ... operator convert then to array
const pipe = function(...fns){
  
  // form a closure with inner function
  return function(val){
    // run the value through all the functions
    for(let f of fns){
      val = f(val);
    }
    
    // return the value after last processing
    return val;
  };
};
Input:
const getSalary = (person) => person.salary
const addBonus = (netSalary) => netSalary + 1000;
const deductTax = (grossSalary) => grossSalary - (grossSalary * .3);

const val = { salary: 10000 };

const result = pipe(
  getSalary,
  addBonus,
  deductTax 
)({ salary: 10000 });

console.log(result);

Output:
7700