// Created on savesnippets.com ยท https://savesnippets.com/EbEhTChIPGBs80 package main import "fmt" func source(nums ...int) <-chan int { out := make(chan int) go func() { defer close(out) for _, n := range nums { out <- n } }() return out } func square(in <-chan int) <-chan int { out := make(chan int) go func() { defer close(out) for n := range in { out <- n * n } }() return out } func filter(in <-chan int, pred func(int) bool) <-chan int { out := make(chan int) go func() { defer close(out) for n := range in { if pred(n) { out <- n } } }() return out } func main() { nums := source(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) squared := square(nums) big := filter(squared, func(n int) bool { return n > 20 }) for v := range big { fmt.Println(v) // 25 36 49 64 81 100 } }