cursor.go 599 B

123456789101112131415161718192021222324252627282930313233343536373839
  1. package buffer
  2. import (
  3. "cmp"
  4. "slices"
  5. )
  6. type Cursor struct {
  7. Offset int
  8. Goal int
  9. }
  10. type CursorManager struct {
  11. Cursors []Cursor
  12. PrimaryIdx int
  13. }
  14. func (cm *CursorManager) DeduplicateAndSort() {
  15. if len(cm.Cursors) <= 1 {
  16. return
  17. }
  18. primaryCursor := cm.Cursors[cm.PrimaryIdx]
  19. slices.SortFunc(cm.Cursors, func(a, b Cursor) int {
  20. return cmp.Compare(a.Offset, b.Offset)
  21. })
  22. cm.Cursors = slices.CompactFunc(cm.Cursors, func(a, b Cursor) bool {
  23. return a.Offset == b.Offset
  24. })
  25. for i, cur := range cm.Cursors {
  26. if cur == primaryCursor {
  27. cm.PrimaryIdx = i
  28. break
  29. }
  30. }
  31. }