refactored with-undo so that it makes redo-fun from the original body