ucsc-xena-client
Version:
UCSC Xena Client. Functional genomics visualizations.
56 lines (45 loc) • 1.6 kB
JavaScript
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
var _ = require('./underscore_ext');
function permuteCaseArray(str) {
var i = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
if (i === str.length) {
return [''];
}
var c = str[i],
u = c.toLowerCase(),
l = c.toUpperCase();
return u === l ? _.flatmap(permuteCaseArray(str, i + 1), function (suffix) {
return [[c].concat(_toConsumableArray(suffix))];
}) : _.flatmap(permuteCaseArray(str, i + 1), function (suffix) {
return [[u].concat(_toConsumableArray(suffix)), [l].concat(_toConsumableArray(suffix))];
});
}
var permuteCase = function permuteCase(str) {
return _.map(permuteCaseArray(_.map(str.split(''))), function (arr) {
return arr.join('');
});
};
var hasCase = function hasCase(s) {
return s.toLowerCase() === s.toUpperCase() ? 0 : 1;
};
// Number of chars in str having case ('a' has case, '5' does not, so
// "a5a" returns 2, for example)
function permuteBitCount(str) {
return _.sum(_.map(str, hasCase));
}
// prefix of str having at most n chars with case.
var prefixBitLimit = _.curry(function (n, str) {
var counts = _.scan(str, function (count, c) {
return hasCase(c) ? count + 1 : count;
}, 0),
l = _.findLastIndex(counts, function (c) {
return c <= n;
});
return str.slice(0, l);
});
module.exports = {
prefixBitLimit: prefixBitLimit,
permuteCase: permuteCase,
permuteBitCount: permuteBitCount
};
;