package main

import (
	"fmt"
	"io"
	"strings"
)

func main() {
	// io.LimitReader membatasi jumlah byte yang bisa dibaca.
	terbatas := io.LimitReader(strings.NewReader("belajar io di Go"), 8)
	data, _ := io.ReadAll(terbatas)
	fmt.Printf("limit 8 byte: %q\n", data)

	// io.MultiReader menggabungkan beberapa sumber menjadi satu.
	gabungan := io.MultiReader(
		strings.NewReader("belajar "),
		strings.NewReader("io "),
		strings.NewReader("mudah"),
	)
	utuh, _ := io.ReadAll(gabungan)
	fmt.Printf("multi reader: %q\n", utuh)

	// io.TeeReader menyalin setiap byte yang dibaca.
	var salinan strings.Builder
	sumber := io.TeeReader(strings.NewReader("data penting"), &salinan)
	jumlah, _ := io.Copy(io.Discard, sumber)
	fmt.Printf("tee: %d byte terbaca, salinan: %q\n", jumlah, salinan.String())

	// Pola baca manual dengan io.EOF sebagai penanda akhir data.
	pembaca := strings.NewReader("AB")
	penyangga := make([]byte, 1)
	for {
		n, err := pembaca.Read(penyangga)
		if n > 0 {
			fmt.Printf("terbaca %d byte: %q\n", n, string(penyangga[:n]))
		}
		if err == io.EOF {
			fmt.Println("baca selesai (io.EOF)")
			break
		}
	}
}
