68 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			68 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| ---
 | |
| title: Function Composition
 | |
| ---
 | |
| 
 | |
| ## Function composition
 | |
| 
 | |
| Function composition is the pointwise application of one function to the result of another. Developers do it in a manual manner every day when the nest functions:
 | |
| 
 | |
| ```javascript
 | |
| compose = (fn1, fn2) => value => fn2(fn1(value))
 | |
| ```
 | |
| 
 | |
| But this is hard to read. There is a better way using function composition. Instead of reading them from inside out:
 | |
| 
 | |
| ```javascript
 | |
| add2AndSquare = (n) => square(add2(n))
 | |
| ``` 
 | |
| 
 | |
| We can use a higher order function to chain them in an ordered way.
 | |
| ```javascript
 | |
| add2AndSquare = compose( add2, square)
 | |
| ``` 
 | |
| 
 | |
| A simple implementation of compose would be:
 | |
| 
 | |
| ```javascript
 | |
| compose = (f1, f2) => value => f2( f1(value) );
 | |
| ```
 | |
| 
 | |
| To get even more flexibility we can use the reduceRight function:
 | |
| ```javascript
 | |
| compose = (...fns) => (initialVal) => fns.reduceRight((val, fn) => fn(val), initialVal);
 | |
| 
 | |
| ```
 | |
| 
 | |
| Reading compose from left to right allows a clear chaining of higher order functions. Real world examples are adding authentications, logging and context properties. It's a technique that enables reusability on the highest level. Here are some examples how to use it:
 | |
| 
 | |
| ```javascript
 | |
| // example
 | |
| const add2        = (n) => n + 2;
 | |
| const times2      = (n) => n * 2;
 | |
| const times2add2  = compose(add2, times2);
 | |
| const add6        = compose(add2, add2, add2);
 | |
| 
 | |
| times2add2(2);  // 6
 | |
| add2tiems2(2);  // 8
 | |
| add6(2);        // 8
 | |
| ```
 | |
| 
 | |
| You might think this is advanced functional programming and it's not relevant for frontend programming. But it's also useful in Single Page Applications. For example you can add behavior to a React component by using higher order components:
 | |
| 
 | |
| ```javascript
 | |
| function logProps(InputComponent) {
 | |
|   InputComponent.prototype.componentWillReceiveProps = function(nextProps) {
 | |
|     console.log('Current props: ', this.props);
 | |
|     console.log('Next props: ', nextProps);
 | |
|   };
 | |
|   return InputComponent;
 | |
| }
 | |
| 
 | |
| // EnhancedComponent will log whenever props are received
 | |
| const EnhancedComponent = logProps(InputComponent);
 | |
| ```
 | |
| 
 | |
| In conclusion function composition enables reusability of functionality at a very high level. If the functions are structured well it enables developers to created new behavior based upon existing behavior.
 | |
| 
 | |
| It also increases readability of implementations. Instead of nesting functions you can cleary chain functions and create higher order functions with meaningful names.
 |