From 6333fa7b6d24f6d1a5f4c654f75fa87c1570de95 Mon Sep 17 00:00:00 2001 From: Snider Date: Mon, 23 Feb 2026 05:02:24 +0000 Subject: [PATCH] =?UTF-8?q?feat:=20modernise=20to=20Go=201.26=20=E2=80=94?= =?UTF-8?q?=20iterators,=20slices.Sorted,=20maps.Keys?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - List() now returns deterministic alphabetical order via slices.Sorted(maps.Keys()) - Add All() iter.Seq2[string, Backend] for iterator-based registry access - Use slices.Insert for prepend in Discover - Use maps.Values in Default() fallback - Remove redundant sort.Strings in tests (List() is now sorted) Co-Authored-By: Gemini Co-Authored-By: Virgil --- discover.go | 3 ++- inference.go | 23 +++++++++++++++++------ inference_test.go | 9 ++------- 3 files changed, 21 insertions(+), 14 deletions(-) diff --git a/discover.go b/discover.go index b19be60..7f044bc 100644 --- a/discover.go +++ b/discover.go @@ -4,6 +4,7 @@ import ( "encoding/json" "os" "path/filepath" + "slices" ) // DiscoveredModel describes a model directory found by Discover. @@ -39,7 +40,7 @@ func Discover(baseDir string) ([]DiscoveredModel, error) { // Also check baseDir itself (in case it's a model directory). if m, ok := probeModelDir(baseDir); ok { // Prepend so the base dir appears first. - models = append([]DiscoveredModel{m}, models...) + models = slices.Insert(models, 0, m) } return models, nil diff --git a/inference.go b/inference.go index ef0c78c..9f8e5db 100644 --- a/inference.go +++ b/inference.go @@ -67,6 +67,8 @@ import ( "context" "fmt" "iter" + "maps" + "slices" "sync" "time" ) @@ -212,15 +214,24 @@ func Get(name string) (Backend, bool) { return b, ok } -// List returns the names of all registered backends. +// List returns the names of all registered backends in alphabetical order. func List() []string { backendsMu.RLock() defer backendsMu.RUnlock() - names := make([]string, 0, len(backends)) - for name := range backends { - names = append(names, name) + return slices.Sorted(maps.Keys(backends)) +} + +// All returns an iterator over all registered backends. +func All() iter.Seq2[string, Backend] { + return func(yield func(string, Backend) bool) { + backendsMu.RLock() + defer backendsMu.RUnlock() + for k, v := range backends { + if !yield(k, v) { + return + } + } } - return names } // Default returns the first available backend. @@ -236,7 +247,7 @@ func Default() (Backend, error) { } } // Fall back to any available - for _, b := range backends { + for b := range maps.Values(backends) { if b.Available() { return b, nil } diff --git a/inference_test.go b/inference_test.go index 829ef01..0643a47 100644 --- a/inference_test.go +++ b/inference_test.go @@ -4,7 +4,6 @@ import ( "context" "fmt" "iter" - "sort" "sync" "testing" @@ -96,9 +95,7 @@ func TestRegister_Good_Multiple(t *testing.T) { Register(&stubBackend{name: "beta", available: true}) Register(&stubBackend{name: "gamma", available: true}) - names := List() - sort.Strings(names) - assert.Equal(t, []string{"alpha", "beta", "gamma"}, names) + assert.Equal(t, []string{"alpha", "beta", "gamma"}, List()) } func TestRegister_Ugly_Overwrites(t *testing.T) { @@ -150,9 +147,7 @@ func TestList_Good_Populated(t *testing.T) { Register(&stubBackend{name: "a", available: true}) Register(&stubBackend{name: "b", available: true}) - names := List() - sort.Strings(names) - assert.Equal(t, []string{"a", "b"}, names) + assert.Equal(t, []string{"a", "b"}, List()) } // --- Default ---