sort.go 1014 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. package ezdb
  2. type sortable[T any] struct {
  3. Key string
  4. Value T
  5. }
  6. type keySort struct {
  7. a []string
  8. f SortFunc[string]
  9. }
  10. func (s *keySort) Len() int {
  11. return len(s.a)
  12. }
  13. func (s *keySort) Less(i, j int) bool {
  14. return s.f(s.a[i], s.a[j])
  15. }
  16. func (s *keySort) Result() []string {
  17. return s.a
  18. }
  19. func (s *keySort) Swap(i, j int) {
  20. a := s.a[i]
  21. b := s.a[j]
  22. s.a[i] = b
  23. s.a[j] = a
  24. }
  25. type valueSort[T any] struct {
  26. a []*sortable[T]
  27. f SortFunc[T]
  28. }
  29. func (s *valueSort[T]) Len() int {
  30. return len(s.a)
  31. }
  32. func (s *valueSort[T]) Less(i, j int) bool {
  33. a := s.a[i]
  34. b := s.a[j]
  35. return s.f(a.Value, b.Value)
  36. }
  37. func (s *valueSort[T]) Result() []string {
  38. k := []string{}
  39. for _, el := range s.a {
  40. k = append(k, el.Key)
  41. }
  42. return k
  43. }
  44. func (s *valueSort[T]) Swap(i, j int) {
  45. a := s.a[i]
  46. b := s.a[j]
  47. s.a[i] = b
  48. s.a[j] = a
  49. }
  50. func makeSortable[T any](m map[string]T) []*sortable[T] {
  51. a := []*sortable[T]{}
  52. for key, value := range m {
  53. a = append(a, &sortable[T]{Key: key, Value: value})
  54. }
  55. return a
  56. }