UNPKG

ucsc-xena-client

Version:

UCSC Xena Client. Functional genomics visualizations.

56 lines (50 loc) 1.28 kB
'use strict'; var _ = require('./underscore_ext'); // Partition n bins (e.g. pixels) proportional to sizes, // distributing bins that won't evenly divide. // // total is optional & should be the sum of sizes. function bysize(n, sizes) { var total = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _.sum(sizes); return sizes.map(function (size) { var p = Math.round(size * n / total); n -= p; total -= size; return p; }); } function equally(n, m) { var starts = _.times(m, function (i) { return Math.round(i * n / m); }); return _.map(starts, function (s, i) { return (i === m - 1 ? n : starts[i + 1]) - s; }); } // Same as bysize, but return array of objects with start & size. // "sizes" can be an array of sizes, or a count (for equal bysize) function offsets(n, sep, sizes) { var fn, cut, parts, offset; if (_.isArray(sizes)) { fn = bysize; cut = sep * (sizes.length - 1); } else { fn = equally; cut = sep * (sizes - 1); } parts = fn(n - cut, sizes); offset = 0; return _(parts).map(function (size) { var ret = { start: offset, size: size }; offset = offset + size + sep; // XXX assumes map() iterates in order return ret; }); } module.exports = { bysize: bysize, equally: equally, offsets: offsets };