channel/to.go
2022-03-09 14:55:11 +01:00

48 lines
1.3 KiB
Go

package channel
import "container/list"
// ToSlice returns a slice containing all values read from ch
func ToSlice[T any](ch <-chan T) []T {
s := make([]T, 0, cap(ch))
Each(ch, func(value T) { s = append(s, value) })
return s
}
// ToSliceDeref returns a slice containing all values read from ch.
// The returned slice will be a dereferenced and continuous block of memory.
// Nil pointers are ignored.
func ToSliceDeref[T any](ch <-chan *T) []T {
s := make([]T, 0, cap(ch))
Each(ch, func(value *T) {
if value != nil {
s = append(s, *value)
}
})
return s
}
// ToList returns a list.List containing all values read from ch
func ToList[T any](ch <-chan T) *list.List {
l := list.New()
Each(ch, func(value T) { l.PushBack(value) })
return l
}
// ToMap returns a map containing all values read from ch.
// The map key-value pairs are determined by f
func ToMap[T any, K comparable, V any](ch <-chan T, f func(T) (K, V)) map[K]V {
m := map[K]V{}
Each(ch, func(value T) {
k, v := f(value)
m[k] = v
})
return m
}
// ToStructMap returns a struct{} map containing all values read from ch as keys.
// It is a shorthand for ToMap(ch, func(value T) (T, struct{}) { return value, struct{}{} })
func ToStructMap[T comparable](ch <-chan T) map[T]struct{} {
return ToMap(ch, func(value T) (T, struct{}) { return value, struct{}{} })
}