| 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); |
| } |
|
|