Our formatting engine constantly switches between TextChange and TextEdit, and generally uses arrays for things, because it was written with LSP concepts (TextEdit and arrays) in mind. We should consider re-writing it to use more modern concepts/features.