import “../core/functor”; import “../math/trigonometry”; import “svg”;

d3.svg.arc = function() {

var innerRadius = d3_svg_arcInnerRadius,
    outerRadius = d3_svg_arcOuterRadius,
    startAngle = d3_svg_arcStartAngle,
    endAngle = d3_svg_arcEndAngle;

function arc() {
  var r0 = innerRadius.apply(this, arguments),
      r1 = outerRadius.apply(this, arguments),
      a0 = startAngle.apply(this, arguments) + d3_svg_arcOffset,
      a1 = endAngle.apply(this, arguments) + d3_svg_arcOffset,
      da = (a1 < a0 && (da = a0, a0 = a1, a1 = da), a1 - a0),
      df = da < π ? "0" : "1",
      c0 = Math.cos(a0),
      s0 = Math.sin(a0),
      c1 = Math.cos(a1),
      s1 = Math.sin(a1);
  return da >= d3_svg_arcMax
    ? (r0
    ? "M0," + r1
    + "A" + r1 + "," + r1 + " 0 1,1 0," + (-r1)
    + "A" + r1 + "," + r1 + " 0 1,1 0," + r1
    + "M0," + r0
    + "A" + r0 + "," + r0 + " 0 1,0 0," + (-r0)
    + "A" + r0 + "," + r0 + " 0 1,0 0," + r0
    + "Z"
    : "M0," + r1
    + "A" + r1 + "," + r1 + " 0 1,1 0," + (-r1)
    + "A" + r1 + "," + r1 + " 0 1,1 0," + r1
    + "Z")
    : (r0
    ? "M" + r1 * c0 + "," + r1 * s0
    + "A" + r1 + "," + r1 + " 0 " + df + ",1 " + r1 * c1 + "," + r1 * s1
    + "L" + r0 * c1 + "," + r0 * s1
    + "A" + r0 + "," + r0 + " 0 " + df + ",0 " + r0 * c0 + "," + r0 * s0
    + "Z"
    : "M" + r1 * c0 + "," + r1 * s0
    + "A" + r1 + "," + r1 + " 0 " + df + ",1 " + r1 * c1 + "," + r1 * s1
    + "L0,0"
    + "Z");
}

arc.innerRadius = function(v) {
  if (!arguments.length) return innerRadius;
  innerRadius = d3_functor(v);
  return arc;
};

arc.outerRadius = function(v) {
  if (!arguments.length) return outerRadius;
  outerRadius = d3_functor(v);
  return arc;
};

arc.startAngle = function(v) {
  if (!arguments.length) return startAngle;
  startAngle = d3_functor(v);
  return arc;
};

arc.endAngle = function(v) {
  if (!arguments.length) return endAngle;
  endAngle = d3_functor(v);
  return arc;
};

arc.centroid = function() {
  var r = (innerRadius.apply(this, arguments)
      + outerRadius.apply(this, arguments)) / 2,
      a = (startAngle.apply(this, arguments)
      + endAngle.apply(this, arguments)) / 2 + d3_svg_arcOffset;
  return [Math.cos(a) * r, Math.sin(a) * r];
};

return arc;

};

var d3_svg_arcOffset = -π / 2,

d3_svg_arcMax = 2 * π - 1e-6;

function d3_svg_arcInnerRadius(d) {

return d.innerRadius;

}

function d3_svg_arcOuterRadius(d) {

return d.outerRadius;

}

function d3_svg_arcStartAngle(d) {

return d.startAngle;

}

function d3_svg_arcEndAngle(d) {

return d.endAngle;

}