Skip to content

Instantly share code, notes, and snippets.

@simon-engledew
Created June 4, 2025 10:29
Show Gist options
  • Save simon-engledew/5cd2f70d4a257b91ce6cdaa8ab5c19b1 to your computer and use it in GitHub Desktop.
Save simon-engledew/5cd2f70d4a257b91ce6cdaa8ab5c19b1 to your computer and use it in GitHub Desktop.
func Search[V any](s any) iter.Seq[reflect.Value] {
v := reflect.ValueOf(s)
t := reflect.TypeFor[V]()
for v.Kind() == reflect.Ptr {
v = reflect.Indirect(v)
}
if v.Kind() == reflect.Struct {
return doSearch(v, t)
}
return func(yield func(reflect.Value) bool) {
if v.Kind() == t.Kind() {
yield(v)
}
}
}
func doSearch(v reflect.Value, t reflect.Type) iter.Seq[reflect.Value] {
return func(yield func(reflect.Value) bool) {
OUTER:
for i := 0; i < v.NumField(); i++ {
f := v.Field(i)
if f.Kind() == t.Kind() {
if !yield(f) {
break
}
}
if f.Kind() == reflect.Struct {
for inner := range doSearch(f, t) {
if !yield(inner) {
break OUTER
}
}
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment