// package lst_sort -- сортированный список значений контекста. package lst_sort import ( "sort" "sync" "gitp78su.ipnodns.ru/svi/kern/v4/lev0" "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs" "gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers" "gitp78su.ipnodns.ru/svi/kern/v4/lev1/local_ctx/ctx_value" ) // LstSort -- сортированный список значений контекста. type LstSort struct { sync.RWMutex lstVal []*ctx_value.CtxValue // Сортированный список значений } // NewLstSort -- возвращает новый сортированный список значений контекста. func NewLstSort() *LstSort { sf := &LstSort{ lstVal: []*ctx_value.CtxValue{}, } return sf } // Add -- добавляет значение в список. func (sf *LstSort) Add(val *ctx_value.CtxValue) { sf.Lock() defer sf.Unlock() lev0.If(val == nil). Hassert("LstSort.Add(): *CtxValue==nil", []any{}) sf.lstVal = append(sf.lstVal, val) sf.sort() } // Del -- удаляет элемент из списка. func (sf *LstSort) Del(val *ctx_value.CtxValue) { sf.Lock() defer sf.Unlock() if val == nil { return } sf.del(val) } // List -- возвращает сортированный список. func (sf *LstSort) List() []*ctx_value.CtxValue { sf.RLock() defer sf.RUnlock() return sf.list() } // Size -- возвращает длину списка. func (sf *LstSort) Size() defs.Num { sf.RLock() defer sf.RUnlock() return defs.Num(len(sf.lstVal)) } // Get -- возвращает по индексу. func (sf *LstSort) Get(ind defs.Num) *ctx_value.CtxValue { sf.RLock() defer sf.RUnlock() helpers.If(ind < 0).Hassert("LstSort.Get(): ind(%v)<0", []any{ind}) helpers.If(ind >= defs.Num(len(sf.lstVal))).Hassert("LstSort.Get(): ind(%v)>=len(%v)", []any{ind, len(sf.lstVal)}) return sf.lstVal[ind] } // удаляет элемент из списка. func (sf *LstSort) del(val *ctx_value.CtxValue) { var ( ind int _val *ctx_value.CtxValue ) for ind, _val = range sf.lstVal { if val == _val { break } _val = nil } if _val == nil { return } lst0 := sf.lstVal[:ind] lst1 := []*ctx_value.CtxValue{} if ind < len(sf.lstVal)-1 { lst1 = sf.lstVal[ind+1:] } sf.lstVal = sf.lstVal[:0] sf.lstVal = append(sf.lstVal, lst0...) sf.lstVal = append(sf.lstVal, lst1...) sf.sort() } // возвращает сортированный список. func (sf *LstSort) list() []*ctx_value.CtxValue { lst := make([]*ctx_value.CtxValue, 0, len(sf.lstVal)) lst = append(lst, sf.lstVal...) return lst } // Сортирует элементы в списке. func (sf *LstSort) sort() { sort.Sort(sf) } // Swap -- НЕ ИСПОЛЬЗОВАТЬ меняет местами два элемента. func (sf *LstSort) Swap(ind1, ind2 int) { sf.lstVal[ind1], sf.lstVal[ind2] = sf.lstVal[ind2], sf.lstVal[ind1] } // Less -- НЕ ИСПОЛЬЗОВАТЬ сравнивает элементы по индексам. func (sf *LstSort) Less(ind1, ind2 int) bool { return sf.lstVal[ind1].Key().Get() < sf.lstVal[ind2].Key().Get() } // Len -- НЕ ИСПОЛЬЗОВАТЬ возвращает длину списка. func (sf *LstSort) Len() int { return len(sf.lstVal) }