import “../core/functor”; import “../core/identity”; import “../core/true”; import “svg”; import “line”;

function d3_svg_area(projection) {

var x0 = d3_svg_lineX,
    x1 = d3_svg_lineX,
    y0 = 0,
    y1 = d3_svg_lineY,
    defined = d3_true,
    interpolate = d3_svg_lineLinear,
    interpolateKey = interpolate.key,
    interpolateReverse = interpolate,
    L = "L",
    tension = .7;

function area(data) {
  var segments = [],
      points0 = [],
      points1 = [],
      i = -1,
      n = data.length,
      d,
      fx0 = d3_functor(x0),
      fy0 = d3_functor(y0),
      fx1 = x0 === x1 ? function() { return x; } : d3_functor(x1),
      fy1 = y0 === y1 ? function() { return y; } : d3_functor(y1),
      x,
      y;

  function segment() {
    segments.push("M", interpolate(projection(points1), tension),
        L, interpolateReverse(projection(points0.reverse()), tension),
        "Z");
  }

  while (++i < n) {
    if (defined.call(this, d = data[i], i)) {
      points0.push([x = +fx0.call(this, d, i), y = +fy0.call(this, d, i)]);
      points1.push([+fx1.call(this, d, i), +fy1.call(this, d, i)]);
    } else if (points0.length) {
      segment();
      points0 = [];
      points1 = [];
    }
  }

  if (points0.length) segment();

  return segments.length ? segments.join("") : null;
}

area.x = function(_) {
  if (!arguments.length) return x1;
  x0 = x1 = _;
  return area;
};

area.x0 = function(_) {
  if (!arguments.length) return x0;
  x0 = _;
  return area;
};

area.x1 = function(_) {
  if (!arguments.length) return x1;
  x1 = _;
  return area;
};

area.y = function(_) {
  if (!arguments.length) return y1;
  y0 = y1 = _;
  return area;
};

area.y0 = function(_) {
  if (!arguments.length) return y0;
  y0 = _;
  return area;
};

area.y1 = function(_) {
  if (!arguments.length) return y1;
  y1 = _;
  return area;
};

area.defined  = function(_) {
  if (!arguments.length) return defined;
  defined = _;
  return area;
};

area.interpolate = function(_) {
  if (!arguments.length) return interpolateKey;
  if (typeof _ === "function") interpolateKey = interpolate = _;
  else interpolateKey = (interpolate = d3_svg_lineInterpolators.get(_) || d3_svg_lineLinear).key;
  interpolateReverse = interpolate.reverse || interpolate;
  L = interpolate.closed ? "M" : "L";
  return area;
};

area.tension = function(_) {
  if (!arguments.length) return tension;
  tension = _;
  return area;
};

return area;

}

d3_svg_lineStepBefore.reverse = d3_svg_lineStepAfter; d3_svg_lineStepAfter.reverse = d3_svg_lineStepBefore;

d3.svg.area = function() {

return d3_svg_area(d3_identity);

};