~sircmpwn/aerc

d3379dd7f0d2e5caffeda4a97fc72649421cccca — Jeffas 8 months ago 1339faf
Preserve sorting order in search results

This ensures that the search results follow the order of the current
sort so that cycling throught the results proceeds in displayed order.
2 files changed, 18 insertions(+), 0 deletions(-)

M lib/msgstore.go
M lib/sort/sort.go
M lib/msgstore.go => lib/msgstore.go +2 -0
@@ 4,6 4,7 @@ import (
	"io"
	"time"

	"git.sr.ht/~sircmpwn/aerc/lib/sort"
	"git.sr.ht/~sircmpwn/aerc/models"
	"git.sr.ht/~sircmpwn/aerc/worker/types"
)


@@ 386,6 387,7 @@ func (store *MessageStore) Search(args []string, cb func([]uint32)) {
	}, func(msg types.WorkerMessage) {
		switch msg := msg.(type) {
		case *types.SearchResults:
			sort.SortBy(msg.Uids, store.uids)
			cb(msg.Uids)
		}
	})

M lib/sort/sort.go => lib/sort/sort.go +16 -0
@@ 3,6 3,7 @@ package sort
import (
	"errors"
	"fmt"
	"sort"
	"strings"

	"git.sr.ht/~sircmpwn/aerc/worker/types"


@@ 54,3 55,18 @@ func parseSortField(arg string) (types.SortField, error) {
		return types.SortArrival, fmt.Errorf("%v is not a valid sort criterion", arg)
	}
}

// Sorts toSort by sortBy so that toSort becomes a permutation following the
// order of sortBy.
// toSort should be a subset of sortBy
func SortBy(toSort []uint32, sortBy []uint32) {
	// build a map from sortBy
	uidMap := make(map[uint32]int)
	for i, uid := range sortBy {
		uidMap[uid] = i
	}
	// sortslice of toSort with less function of indexing the map sortBy
	sort.Slice(toSort, func(i, j int) bool {
		return uidMap[toSort[i]] < uidMap[toSort[j]]
	})
}