rotate = function(input, transform) {
function fixPoint(input) {
var n = input.length, i = 2;
var output = transform(input);
while (i < n) output[i] = input[i], ++i;
return output;
}
function fixPoints(input) {
return input.map(fixPoint);
}
function fixPolygon(input) {
return input.map(fixPoints);
}
function fixGeometry(input) {
if (input == null) return input;
var output;
switch (input.type) {
case "GeometryCollection": output = {type: "GeometryCollection", geometries: input.geometries.map(fixGeometry)}; break;
case "Point": output = {type: "Point", coordinates: fixPoint(input.coordinates)}; break;
case "MultiPoint": output = {type: input.type, coordinates: fixPoints(input.coordinates)}; break;
case "LineString": output = {type: input.type, coordinates: fixPoints(input.coordinates)}; break;
case "MultiLineString": case "Polygon": output = {type: input.type, coordinates: fixPolygon(input.coordinates)}; break;
case "MultiPolygon": output = {type: "MultiPolygon", coordinates: input.coordinates.map(fixPolygon)}; break;
default: return input;
}
if (input.bbox != null) output.bbox = input.bbox;
return output;
}
function fixFeature(input) {
var output = {type: "Feature", properties: input.properties, geometry: fixGeometry(input.geometry)};
if (input.id != null) output.id = input.id;
if (input.bbox != null) output.bbox = input.bbox;
return output;
}
if (input != null) switch (input.type) {
case "Feature": return fixFeature(input);
case "FeatureCollection": {
var output = {type: "FeatureCollection", features: input.features.map(fixFeature)};
if (input.bbox != null) output.bbox = input.bbox;
return output;
}
default: return fixGeometry(input);
}
return input;
}