in modules/edit-modes/src/lib/immutable-feature-collection.ts [224:266]
function immutablyReplacePosition(
coordinates: any,
positionIndexes: number[] | null | undefined,
updatedPosition: Position,
isPolygonal: boolean
): any {
if (!positionIndexes) {
return coordinates;
}
if (positionIndexes.length === 0) {
return getUpdatedPosition(updatedPosition, coordinates);
}
if (positionIndexes.length === 1) {
const updated = [
...coordinates.slice(0, positionIndexes[0]),
getUpdatedPosition(updatedPosition, coordinates[positionIndexes[0]]),
...coordinates.slice(positionIndexes[0] + 1),
];
if (
isPolygonal &&
(positionIndexes[0] === 0 || positionIndexes[0] === coordinates.length - 1)
) {
// for polygons, the first point is repeated at the end of the array
// so, update it on both ends of the array
updated[0] = getUpdatedPosition(updatedPosition, coordinates[0]);
updated[coordinates.length - 1] = getUpdatedPosition(updatedPosition, coordinates[0]);
}
return updated;
}
// recursively update inner array
return [
...coordinates.slice(0, positionIndexes[0]),
immutablyReplacePosition(
coordinates[positionIndexes[0]],
positionIndexes.slice(1, positionIndexes.length),
updatedPosition,
isPolygonal
),
...coordinates.slice(positionIndexes[0] + 1),
];
}