package main

import (
	"fmt"
	"strings"
)

// Pembaca dan Penulis adalah dua interface kecil yang berdiri sendiri.
type Pembaca interface {
	Baca() string
}

type Penulis interface {
	Tulis(s string)
}

// PembacaPenulis menggabungkan dua interface menjadi satu kontrak baru.
type PembacaPenulis interface {
	Pembaca
	Penulis
}

// Catatan mengimplementasikan Pembaca sekaligus Penulis.
type Catatan struct {
	isi strings.Builder
}

func (c *Catatan) Tulis(s string) {
	c.isi.WriteString(s)
}

func (c *Catatan) Baca() string {
	return c.isi.String()
}

func isiCatatan(rw PembacaPenulis, potongan []string) string {
	for _, p := range potongan {
		rw.Tulis(p)
	}
	return rw.Baca()
}

func main() {
	var rw PembacaPenulis = &Catatan{}
	hasil := isiCatatan(rw, []string{"belajar ", "komposisi ", "interface"})
	fmt.Println(hasil)
}
