From 94b9d02aa1ef29afb678d8d6d85b4d5e29ffe4ba Mon Sep 17 00:00:00 2001 From: charlestamz Date: Sun, 23 Jun 2024 11:59:17 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8A=A0=E5=85=A5=E6=8E=92=E5=BA=8FRange?= =?UTF-8?q?=E5=87=BD=E6=95=B0=20RangeSorted?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- util/map.go | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/util/map.go b/util/map.go index 430df0a..a2f09e2 100644 --- a/util/map.go +++ b/util/map.go @@ -1,6 +1,9 @@ package util -import "sync" +import ( + "sort" + "sync" +) type Map[K comparable, V any] struct { sync.Map @@ -66,3 +69,28 @@ func (m *Map[K, V]) Range(f func(K, V)) { return true }) } + +func (m *Map[K, V]) RangeSorted(f func(K, V), compare func(K, K) bool) { + // Collect keys and values + var pairs []struct { + key K + val V + } + m.Map.Range(func(k, v interface{}) bool { + pairs = append(pairs, struct { + key K + val V + }{k.(K), v.(V)}) + return true + }) + + // Sort by keys using the compare function + sort.Slice(pairs, func(i, j int) bool { + return compare(pairs[i].key, pairs[j].key) + }) + + // Apply function in sorted order + for _, pair := range pairs { + f(pair.key, pair.val) + } +}