Too Long; Didn't Read
The most straightforward functional approach is using `pipe()` with stateless setters. This pattern doesn’t allow you chaining, but some of us need chaining to feel comfortable in reading code. The idea here is that the expression builder is based on a curried function that accepts a path defined by lens. value: value: the value to write to the path defines by lens, value: set will return a new object (never mutate) based on the source object with the new property and value.