diff --git a/go.mod b/go.mod index 30ae0e978..46783393e 100644 --- a/go.mod +++ b/go.mod @@ -13,7 +13,7 @@ require ( github.com/go-errors/errors v1.5.1 github.com/gookit/color v1.4.2 github.com/integrii/flaggy v1.4.0 - github.com/jesseduffield/generics v0.0.0-20250406224309-4f541cb84918 + github.com/jesseduffield/generics v0.0.0-20250517122708-b0b4a53a6f5c github.com/jesseduffield/go-git/v5 v5.14.1-0.20250407170251-e1a013310ccd github.com/jesseduffield/gocui v0.3.1-0.20250421160159-82c9aaeba2b9 github.com/jesseduffield/kill v0.0.0-20250101124109-e216ddbe133a diff --git a/go.sum b/go.sum index 3c1aaab39..85db0bcca 100644 --- a/go.sum +++ b/go.sum @@ -190,8 +190,8 @@ github.com/invopop/jsonschema v0.10.0 h1:c1ktzNLBun3LyQQhyty5WE3lulbOdIIyOVlkmDL github.com/invopop/jsonschema v0.10.0/go.mod h1:ffZ5Km5SWWRAIN6wbDXItl95euhFz2uON45H2qjYt+0= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= -github.com/jesseduffield/generics v0.0.0-20250406224309-4f541cb84918 h1:meoUDZGF6jZAbhW5IBwj92mTqGmrOn+Cuu0jM7/aUcs= -github.com/jesseduffield/generics v0.0.0-20250406224309-4f541cb84918/go.mod h1:+LLj9/WUPAP8LqCchs7P+7X0R98HiFujVFANdNaxhGk= +github.com/jesseduffield/generics v0.0.0-20250517122708-b0b4a53a6f5c h1:tC2PaiisXAC5sOjDPfMArSnbswDObtCssx+xn28edX4= +github.com/jesseduffield/generics v0.0.0-20250517122708-b0b4a53a6f5c/go.mod h1:F2fEBk0ddf6ixrBrJjY7phfQ3hL9rXG0uSjvwYe50bE= github.com/jesseduffield/go-git/v5 v5.14.1-0.20250407170251-e1a013310ccd h1:ViKj6qth8FgcIWizn9KiACWwPemWSymx62OPN0tHT+Q= github.com/jesseduffield/go-git/v5 v5.14.1-0.20250407170251-e1a013310ccd/go.mod h1:lRhCiBr6XjQrvcQVa+UYsy/99d3wMXn/a0nSQlhnhlA= github.com/jesseduffield/gocui v0.3.1-0.20250421160159-82c9aaeba2b9 h1:k23sCKHCNpAvwJP8Yr16CBUItuarmUHBGH7FaAm2glc= diff --git a/vendor/github.com/jesseduffield/generics/maps/maps.go b/vendor/github.com/jesseduffield/generics/maps/maps.go index 9d41a3303..26d9c32c2 100644 --- a/vendor/github.com/jesseduffield/generics/maps/maps.go +++ b/vendor/github.com/jesseduffield/generics/maps/maps.go @@ -19,7 +19,7 @@ func Values[Key comparable, Value any](m map[Key]Value) []Value { func TransformValues[Key comparable, Value any, NewValue any]( m map[Key]Value, fn func(Value) NewValue, ) map[Key]NewValue { - output := make(map[Key]NewValue) + output := make(map[Key]NewValue, len(m)) for key, value := range m { output[key] = fn(value) } @@ -27,7 +27,7 @@ func TransformValues[Key comparable, Value any, NewValue any]( } func TransformKeys[Key comparable, Value any, NewKey comparable](m map[Key]Value, fn func(Key) NewKey) map[NewKey]Value { - output := make(map[NewKey]Value) + output := make(map[NewKey]Value, len(m)) for key, value := range m { output[fn(key)] = value } diff --git a/vendor/github.com/jesseduffield/generics/orderedset/orderedset.go b/vendor/github.com/jesseduffield/generics/orderedset/orderedset.go new file mode 100644 index 000000000..ed5c95b54 --- /dev/null +++ b/vendor/github.com/jesseduffield/generics/orderedset/orderedset.go @@ -0,0 +1,65 @@ +package orderedset + +import ( + orderedmap "github.com/wk8/go-ordered-map/v2" +) + +type OrderedSet[T comparable] struct { + om *orderedmap.OrderedMap[T, bool] +} + +func New[T comparable]() *OrderedSet[T] { + return &OrderedSet[T]{om: orderedmap.New[T, bool]()} +} + +func NewFromSlice[T comparable](slice []T) *OrderedSet[T] { + result := &OrderedSet[T]{om: orderedmap.New[T, bool](len(slice))} + result.Add(slice...) + return result +} + +func (os *OrderedSet[T]) Add(values ...T) { + for _, value := range values { + os.om.Set(value, true) + } +} + +func (os *OrderedSet[T]) Remove(value T) { + os.om.Delete(value) +} + +func (os *OrderedSet[T]) RemoveSlice(slice []T) { + for _, value := range slice { + os.Remove(value) + } +} + +func (os *OrderedSet[T]) Includes(value T) bool { + return os.om.Value(value) +} + +func (os *OrderedSet[T]) Len() int { + return os.om.Len() +} + +func (os *OrderedSet[T]) ToSliceFromOldest() []T { + // TODO: can be simplified to + // return os.om.KeysFromOldest() + // when we update to a newer version of go-ordered-map + result := make([]T, 0, os.Len()) + for pair := os.om.Oldest(); pair != nil; pair = pair.Next() { + result = append(result, pair.Key) + } + return result +} + +func (os *OrderedSet[T]) ToSliceFromNewest() []T { + // TODO: can be simplified to + // return os.om.KeysFromNewest() + // when we update to a newer version of go-ordered-map + result := make([]T, 0, os.Len()) + for pair := os.om.Newest(); pair != nil; pair = pair.Prev() { + result = append(result, pair.Key) + } + return result +} diff --git a/vendor/github.com/jesseduffield/generics/set/set.go b/vendor/github.com/jesseduffield/generics/set/set.go index 0f0f4beb1..5b8f0090e 100644 --- a/vendor/github.com/jesseduffield/generics/set/set.go +++ b/vendor/github.com/jesseduffield/generics/set/set.go @@ -11,12 +11,9 @@ func New[T comparable]() *Set[T] { } func NewFromSlice[T comparable](slice []T) *Set[T] { - hashMap := make(map[T]bool) - for _, value := range slice { - hashMap[value] = true - } - - return &Set[T]{hashMap: hashMap} + result := &Set[T]{hashMap: make(map[T]bool, len(slice))} + result.Add(slice...) + return result } func (s *Set[T]) Add(values ...T) { diff --git a/vendor/modules.txt b/vendor/modules.txt index 9859a3944..f2f6489ef 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -174,9 +174,10 @@ github.com/integrii/flaggy # github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 ## explicit github.com/jbenet/go-context/io -# github.com/jesseduffield/generics v0.0.0-20250406224309-4f541cb84918 +# github.com/jesseduffield/generics v0.0.0-20250517122708-b0b4a53a6f5c ## explicit; go 1.18 github.com/jesseduffield/generics/maps +github.com/jesseduffield/generics/orderedset github.com/jesseduffield/generics/set # github.com/jesseduffield/go-git/v5 v5.14.1-0.20250407170251-e1a013310ccd ## explicit; go 1.23.0