diff --git a/to.go b/to.go new file mode 100644 index 0000000..d27dff7 --- /dev/null +++ b/to.go @@ -0,0 +1,52 @@ +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 keys are determined by f +func ToMap[K comparable, V any](ch <-chan V, f func(V) K) map[K]V { + m := map[K]V{} + Each(ch, func(value V) { m[f(value)] = value }) + return m +} + +// ToKeyMap returns a map containing all values read from ch as keys. +// The map values are determined by f +func ToKeyMap[K comparable, V any](ch <-chan K, f func(K) V) map[K]V { + m := map[K]V{} + Each(ch, func(key K) { m[key] = f(key) }) + return m +} + +// ToStructMap returns a struct{} map containing all values read from ch as keys. +// It is a shorthand for ToKeyMap(ch, func(k K) struct{} { return struct{}{} }) +func ToStructMap[T comparable](ch <-chan T) map[T]struct{} { + return ToKeyMap(ch, func(key T) struct{} { return struct{}{} }) +}