package main

import (
	"fmt"
)

// generator mengubah kumpulan angka menjadi stream di sebuah channel.
func generator(angka ...int) <-chan int {
	keluar := make(chan int)
	go func() {
		defer close(keluar)
		for _, n := range angka {
			keluar <- n
		}
	}()
	return keluar
}

// kuadrat membaca setiap angka dari channel masukan, menghitung
// kuadratnya, lalu mengirim hasilnya ke channel keluaran.
func kuadrat(masuk <-chan int) <-chan int {
	keluar := make(chan int)
	go func() {
		defer close(keluar)
		for n := range masuk {
			keluar <- n * n
		}
	}()
	return keluar
}

func main() {
	sumber := generator(1, 2, 3, 4, 5)
	hasil := kuadrat(sumber)

	// Tahap akhir: kumpulkan hasil sampai channel ditutup.
	terkumpul := []int{}
	for v := range hasil {
		terkumpul = append(terkumpul, v)
	}
	fmt.Println("hasil pipeline:", terkumpul)
}
