Todo Row Binding private func todoRowBinding(todo: Todo) -> Binding<Todo> { .init(get: { todo }, set: { mutatedTodo in let isToggleChange = mutatedTodo.isCompleted != todo.isCompleted if isToggleChange { handleToggleChange(mutatedTodo) } else { controller.update(mutatedTodo) } }) } Move And Update Indices private func move(todos: inout [Todo], from source: IndexSet, to destination: Int) { todos.move(fromOffsets: source, toOffset: destination) todos.indices.forEach { todos[$0].sortOrder = $0 } } Handle Toggle Change private func handleToggleChange(_ todo: Todo) { guard let originalIndex = todos.firstIndex(where: { $0.id == todo.id }) else { controller.update(todo) return } var copy = todos copy[originalIndex] = todo for index in todos.indices.reversed() where index != originalIndex { if todos[index].isCompleted { continue } move(todos: ©, from: .init(integer: originalIndex), to: index + 1) break } withAnimation { todos = copy controller.updateAll(copy) } }