Permalink
| /* 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 `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 `string` | |
| 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; | |
| } |