changes-in-selection.ts 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. import { SelectionRange } from '@codemirror/state'
  2. import { Ranges } from '@/features/review-panel/context/ranges-context'
  3. import { isDeleteChange, isInsertChange } from '@/utils/operations'
  4. import { canAggregate } from './can-aggregate'
  5. import { Change, EditOperation } from '../../../../../types/change'
  6. export function numberOfChangesInSelection(
  7. ranges: Ranges | undefined,
  8. selection: SelectionRange
  9. ) {
  10. if (!ranges) {
  11. return 0
  12. }
  13. let count = 0
  14. let precedingChange: Change<EditOperation> | null = null
  15. for (const change of ranges.changes) {
  16. if (
  17. precedingChange &&
  18. isInsertChange(precedingChange) &&
  19. isDeleteChange(change) &&
  20. canAggregate(change, precedingChange)
  21. ) {
  22. // only count once for the aggregated change
  23. continue
  24. } else if (
  25. isInsertChange(change) &&
  26. change.op.p >= selection.from &&
  27. change.op.p + change.op.i.length <= selection.to
  28. ) {
  29. count++
  30. } else if (
  31. isDeleteChange(change) &&
  32. selection.from <= change.op.p &&
  33. change.op.p <= selection.to
  34. ) {
  35. count++
  36. }
  37. precedingChange = change
  38. }
  39. return count
  40. }