d3379dd7f0d2e5caffeda4a97fc72649421cccca — Jeffas 15 days 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 @@ "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(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 @@ import (
  	"errors"
  	"fmt"
+ 	"sort"
  	"strings"
  
  	"git.sr.ht/~sircmpwn/aerc/worker/types"


@@ 54,3 55,18 @@ 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]]
+ 	})
+ }