summaryrefslogtreecommitdiff
path: root/debian/tests/test_modules/topojson-client/src/mesh.js
diff options
context:
space:
mode:
Diffstat (limited to 'debian/tests/test_modules/topojson-client/src/mesh.js')
-rw-r--r--debian/tests/test_modules/topojson-client/src/mesh.js53
1 files changed, 53 insertions, 0 deletions
diff --git a/debian/tests/test_modules/topojson-client/src/mesh.js b/debian/tests/test_modules/topojson-client/src/mesh.js
new file mode 100644
index 0000000..e0b7097
--- /dev/null
+++ b/debian/tests/test_modules/topojson-client/src/mesh.js
@@ -0,0 +1,53 @@
+import {object} from "./feature.js";
+import stitch from "./stitch.js";
+
+export default function(topology) {
+ return object(topology, meshArcs.apply(this, arguments));
+}
+
+export function meshArcs(topology, object, filter) {
+ var arcs, i, n;
+ if (arguments.length > 1) arcs = extractArcs(topology, object, filter);
+ else for (i = 0, arcs = new Array(n = topology.arcs.length); i < n; ++i) arcs[i] = i;
+ return {type: "MultiLineString", arcs: stitch(topology, arcs)};
+}
+
+function extractArcs(topology, object, filter) {
+ var arcs = [],
+ geomsByArc = [],
+ geom;
+
+ function extract0(i) {
+ var j = i < 0 ? ~i : i;
+ (geomsByArc[j] || (geomsByArc[j] = [])).push({i: i, g: geom});
+ }
+
+ function extract1(arcs) {
+ arcs.forEach(extract0);
+ }
+
+ function extract2(arcs) {
+ arcs.forEach(extract1);
+ }
+
+ function extract3(arcs) {
+ arcs.forEach(extract2);
+ }
+
+ function geometry(o) {
+ switch (geom = o, o.type) {
+ case "GeometryCollection": o.geometries.forEach(geometry); break;
+ case "LineString": extract1(o.arcs); break;
+ case "MultiLineString": case "Polygon": extract2(o.arcs); break;
+ case "MultiPolygon": extract3(o.arcs); break;
+ }
+ }
+
+ geometry(object);
+
+ geomsByArc.forEach(filter == null
+ ? function(geoms) { arcs.push(geoms[0].i); }
+ : function(geoms) { if (filter(geoms[0].g, geoms[geoms.length - 1].g)) arcs.push(geoms[0].i); });
+
+ return arcs;
+}