package ezdb

type sortable[T any] struct {
	Key   string
	Value T
}

type keySort struct {
	a []string
	f SortFunc[string]
}

func (s *keySort) Len() int {
	return len(s.a)
}

func (s *keySort) Less(i, j int) bool {
	return s.f(s.a[i], s.a[j])
}

func (s *keySort) Result() []string {
	return s.a
}

func (s *keySort) Swap(i, j int) {
	a := s.a[i]
	b := s.a[j]
	s.a[i] = b
	s.a[j] = a
}

type valueSort[T any] struct {
	a []*sortable[T]
	f SortFunc[T]
}

func (s *valueSort[T]) Len() int {
	return len(s.a)
}

func (s *valueSort[T]) Less(i, j int) bool {
	a := s.a[i]
	b := s.a[j]

	return s.f(a.Value, b.Value)
}

func (s *valueSort[T]) Result() []string {
	k := []string{}
	for _, el := range s.a {
		k = append(k, el.Key)
	}
	return k
}

func (s *valueSort[T]) Swap(i, j int) {
	a := s.a[i]
	b := s.a[j]
	s.a[i] = b
	s.a[j] = a
}

func makeSortable[T any](m map[string]T) []*sortable[T] {
	a := []*sortable[T]{}
	for key, value := range m {
		a = append(a, &sortable[T]{Key: key, Value: value})
	}
	return a
}