Interesting how different some of the approaches are in the same language, never mind different languages. In clojure, the “atom” version is 5 lines (not including data or tests), while the “zipper” version is 47 lines and the “reduce” version is 31 lines
Clojure also has some third party libraries like Specter [1] that make nested traversal and mutation very succinct and performant.
The author of Specter goes so far as to label traversal/update of deep immutable structures as "Clojure's Missing Piece".