I'm also in general in favor of linear update procedures. Even if every implementation
always uses mutation, I think the functional API is cleaner and easier to remember.
The only cause for confusion seems to be with the use of ! for naming, and the fact
that many conventional languages perform similar operations as in-place mutations.
To consider some alternatives for the future:
foo?! : ? maybe ! update (also appropriately means "dubious" in chess notation)
foo✂ : scissors indicate we are cutting up (consuming the input), conveniently pointed in the right direction
foo8< : ascii representation of scissors
--
Alex