lst_sort.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. // package lst_sort -- сортированный список значений контекста.
  2. package lst_sort
  3. import (
  4. "sort"
  5. "sync"
  6. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
  7. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
  8. "gitp78su.ipnodns.ru/svi/kern/v4/lev1/comp_spec"
  9. )
  10. // LstSort -- сортированный список значений контекста.
  11. type LstSort struct {
  12. sync.RWMutex
  13. lstVal []comp_spec.ICtxValue // Сортированный список значений
  14. }
  15. // NewLstSort -- возвращает новый сортированный список значений контекста.
  16. func NewLstSort() *LstSort {
  17. sf := &LstSort{
  18. lstVal: []comp_spec.ICtxValue{},
  19. }
  20. return sf
  21. }
  22. // Add -- добавляет значение в список.
  23. func (sf *LstSort) Add(val comp_spec.ICtxValue) {
  24. sf.Lock()
  25. defer sf.Unlock()
  26. helpers.If(val == nil).Hassert("LstSort.Add(): ICtxValue==nil", []any{})
  27. sf.lstVal = append(sf.lstVal, val)
  28. sf.sort()
  29. }
  30. // Del -- удаляет элемент из списка.
  31. func (sf *LstSort) Del(val comp_spec.ICtxValue) {
  32. sf.Lock()
  33. defer sf.Unlock()
  34. if val == nil {
  35. return
  36. }
  37. sf.del(val)
  38. }
  39. // List -- возвращает сортированный список.
  40. func (sf *LstSort) List() []comp_spec.ICtxValue {
  41. sf.RLock()
  42. defer sf.RUnlock()
  43. return sf.list()
  44. }
  45. // Size -- возвращает длину списка.
  46. func (sf *LstSort) Size() defs.Num {
  47. sf.RLock()
  48. defer sf.RUnlock()
  49. return defs.Num(len(sf.lstVal))
  50. }
  51. // Get -- возвращает по индексу.
  52. func (sf *LstSort) Get(ind defs.Num) comp_spec.ICtxValue {
  53. sf.RLock()
  54. defer sf.RUnlock()
  55. helpers.If(ind < 0).Hassert("LstSort.Get(): ind(%v)<0", []any{ind})
  56. helpers.If(ind >= defs.Num(len(sf.lstVal))).Hassert("LstSort.Get(): ind(%v)>=len(%v)", []any{ind, len(sf.lstVal)})
  57. return sf.lstVal[ind]
  58. }
  59. // удаляет элемент из списка.
  60. func (sf *LstSort) del(val comp_spec.ICtxValue) {
  61. var (
  62. ind int
  63. _val comp_spec.ICtxValue
  64. )
  65. for ind, _val = range sf.lstVal {
  66. if val == _val {
  67. break
  68. }
  69. _val = nil
  70. }
  71. if _val == nil {
  72. return
  73. }
  74. lst0 := sf.lstVal[:ind]
  75. lst1 := []comp_spec.ICtxValue{}
  76. if ind < len(sf.lstVal)-1 {
  77. lst1 = sf.lstVal[ind+1:]
  78. }
  79. sf.lstVal = sf.lstVal[:0]
  80. sf.lstVal = append(sf.lstVal, lst0...)
  81. sf.lstVal = append(sf.lstVal, lst1...)
  82. sf.sort()
  83. }
  84. // возвращает сортированный список.
  85. func (sf *LstSort) list() []comp_spec.ICtxValue {
  86. lst := make([]comp_spec.ICtxValue, 0, len(sf.lstVal))
  87. lst = append(lst, sf.lstVal...)
  88. return lst
  89. }
  90. // Сортирует элементы в списке.
  91. func (sf *LstSort) sort() {
  92. sort.Sort(sf)
  93. }
  94. // Swap -- НЕ ИСПОЛЬЗОВАТЬ меняет местами два элемента.
  95. func (sf *LstSort) Swap(ind1, ind2 int) {
  96. sf.lstVal[ind1], sf.lstVal[ind2] = sf.lstVal[ind2], sf.lstVal[ind1]
  97. }
  98. // Less -- НЕ ИСПОЛЬЗОВАТЬ сравнивает элементы по индексам.
  99. func (sf *LstSort) Less(ind1, ind2 int) bool {
  100. return sf.lstVal[ind1].Key().Get() < sf.lstVal[ind2].Key().Get()
  101. }
  102. // Len -- НЕ ИСПОЛЬЗОВАТЬ возвращает длину списка.
  103. func (sf *LstSort) Len() int {
  104. return len(sf.lstVal)
  105. }