lst_sort.go 3.2 KB

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