import “../arrays/bisect”;

function d3_scale_polylinear(domain, range, uninterpolate, interpolate) {

var u = [],
    i = [],
    j = 0,
    k = Math.min(domain.length, range.length) - 1;

// Handle descending domains.
if (domain[k] < domain[0]) {
  domain = domain.slice().reverse();
  range = range.slice().reverse();
}

while (++j <= k) {
  u.push(uninterpolate(domain[j - 1], domain[j]));
  i.push(interpolate(range[j - 1], range[j]));
}

return function(x) {
  var j = d3.bisect(domain, x, 1, k) - 1;
  return i[j](u[j](x));
};

}