53 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			53 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /* This program is free software. It comes without any warranty, to
 | |
|      * the extent permitted by applicable law. You can redistribute it
 | |
|      * and/or modify it under the terms of the Do What The Fuck You Want
 | |
|      * To Public License, Version 2, as published by Sam Hocevar. See
 | |
|      * http://www.wtfpl.net/ for more details. */
 | |
| 'use strict';
 | |
| module.exports = leftPad;
 | |
| 
 | |
| var cache = [
 | |
|   '',
 | |
|   ' ',
 | |
|   '  ',
 | |
|   '   ',
 | |
|   '    ',
 | |
|   '     ',
 | |
|   '      ',
 | |
|   '       ',
 | |
|   '        ',
 | |
|   '         '
 | |
| ];
 | |
| 
 | |
| function leftPad (str, len, ch) {
 | |
|   // convert `str` to a `string`
 | |
|   str = str + '';
 | |
|   // `len` is the `pad`'s length now
 | |
|   len = len - str.length;
 | |
|   // doesn't need to pad
 | |
|   if (len <= 0) return str;
 | |
|   // `ch` defaults to `' '`
 | |
|   if (!ch && ch !== 0) ch = ' ';
 | |
|   // convert `ch` to a `string` cuz it could be a number
 | |
|   ch = ch + '';
 | |
|   // cache common use cases
 | |
|   if (ch === ' ' && len < 10) return cache[len] + str;
 | |
|   // `pad` starts with an empty string
 | |
|   var pad = '';
 | |
|   // loop
 | |
|   while (true) {
 | |
|     // add `ch` to `pad` if `len` is odd
 | |
|     if (len & 1) pad += ch;
 | |
|     // divide `len` by 2, ditch the remainder
 | |
|     len >>= 1;
 | |
|     // "double" the `ch` so this operation count grows logarithmically on `len`
 | |
|     // each time `ch` is "doubled", the `len` would need to be "doubled" too
 | |
|     // similar to finding a value in binary search tree, hence O(log(n))
 | |
|     if (len) ch += ch;
 | |
|     // `len` is 0, exit the loop
 | |
|     else break;
 | |
|   }
 | |
|   // pad `str`!
 | |
|   return pad + str;
 | |
| }
 |