1
0

cursor.go 707 B

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