|
import identity from "../identity.js"; |
|
import stream from "../stream.js"; |
|
import pathArea from "./area.js"; |
|
import pathBounds from "./bounds.js"; |
|
import pathCentroid from "./centroid.js"; |
|
import PathContext from "./context.js"; |
|
import pathMeasure from "./measure.js"; |
|
import PathString from "./string.js"; |
|
|
|
export default function(projection, context) { |
|
let digits = 3, |
|
pointRadius = 4.5, |
|
projectionStream, |
|
contextStream; |
|
|
|
function path(object) { |
|
if (object) { |
|
if (typeof pointRadius === "function") contextStream.pointRadius(+pointRadius.apply(this, arguments)); |
|
stream(object, projectionStream(contextStream)); |
|
} |
|
return contextStream.result(); |
|
} |
|
|
|
path.area = function(object) { |
|
stream(object, projectionStream(pathArea)); |
|
return pathArea.result(); |
|
}; |
|
|
|
path.measure = function(object) { |
|
stream(object, projectionStream(pathMeasure)); |
|
return pathMeasure.result(); |
|
}; |
|
|
|
path.bounds = function(object) { |
|
stream(object, projectionStream(pathBounds)); |
|
return pathBounds.result(); |
|
}; |
|
|
|
path.centroid = function(object) { |
|
stream(object, projectionStream(pathCentroid)); |
|
return pathCentroid.result(); |
|
}; |
|
|
|
path.projection = function(_) { |
|
if (!arguments.length) return projection; |
|
projectionStream = _ == null ? (projection = null, identity) : (projection = _).stream; |
|
return path; |
|
}; |
|
|
|
path.context = function(_) { |
|
if (!arguments.length) return context; |
|
contextStream = _ == null ? (context = null, new PathString(digits)) : new PathContext(context = _); |
|
if (typeof pointRadius !== "function") contextStream.pointRadius(pointRadius); |
|
return path; |
|
}; |
|
|
|
path.pointRadius = function(_) { |
|
if (!arguments.length) return pointRadius; |
|
pointRadius = typeof _ === "function" ? _ : (contextStream.pointRadius(+_), +_); |
|
return path; |
|
}; |
|
|
|
path.digits = function(_) { |
|
if (!arguments.length) return digits; |
|
if (_ == null) digits = null; |
|
else { |
|
const d = Math.floor(_); |
|
if (!(d >= 0)) throw new RangeError(`invalid digits: ${_}`); |
|
digits = d; |
|
} |
|
if (context === null) contextStream = new PathString(digits); |
|
return path; |
|
}; |
|
|
|
return path.projection(projection).digits(digits).context(context); |
|
} |
|
|