Skip to content

Instantly share code, notes, and snippets.

@3d0c
Last active January 2, 2016 19:09
Show Gist options
  • Save 3d0c/8348816 to your computer and use it in GitHub Desktop.
Save 3d0c/8348816 to your computer and use it in GitHub Desktop.
func (iter *Iter) All(result interface{}) error {
resultv := reflect.ValueOf(result)
if resultv.Kind() != reflect.Ptr || (resultv.Elem().Kind() != reflect.Slice && resultv.Elem().Kind() != reflect.Interface) {
panic("result argument must be a slice address")
}
slicev := resultv.Elem()
if resultv.Elem().Kind() == reflect.Interface {
slicev = slicev.Elem().Slice(0, slicev.Elem().Cap())
} else {
slicev = slicev.Slice(0, slicev.Elem().Cap())
}
elemt := slicev.Type().Elem()
i := 0
for {
if slicev.Len() == i {
elemp := reflect.New(elemt)
if !iter.Next(elemp.Interface()) {
break
}
slicev = reflect.Append(slicev, elemp.Elem())
slicev = slicev.Slice(0, slicev.Cap())
} else {
if !iter.Next(slicev.Index(i).Addr().Interface()) {
break
}
}
i++
}
resultv.Elem().Set(slicev.Slice(0, i))
return iter.Close()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment