You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					53 lines
				
				1.4 KiB
			
		
		
			
		
	
	
					53 lines
				
				1.4 KiB
			| 
								 
											4 years ago
										 
									 | 
							
								/* 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;
							 | 
						||
| 
								 | 
							
								}
							 |