cursor.go 714 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  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) AddCursor(cur Cursor) {
  15. cm.Cursors = append(cm.Cursors, cur)
  16. cm.DeduplicateAndSort()
  17. }
  18. func (cm *CursorManager) DeduplicateAndSort() {
  19. if len(cm.Cursors) <= 1 {
  20. return
  21. }
  22. primaryCursor := cm.Cursors[cm.PrimaryIdx]
  23. slices.SortFunc(cm.Cursors, func(a, b Cursor) int {
  24. return cmp.Compare(a.Offset, b.Offset)
  25. })
  26. cm.Cursors = slices.CompactFunc(cm.Cursors, func(a, b Cursor) bool {
  27. return a.Offset == b.Offset
  28. })
  29. for i, cur := range cm.Cursors {
  30. if cur == primaryCursor {
  31. cm.PrimaryIdx = i
  32. break
  33. }
  34. }
  35. }