package main

import (
	"context"
	"errors"
	"fmt"
	"sync"
)

type kunciCtx string

const kunciUser kunciCtx = "user"

func kerja(ctx context.Context, tugas <-chan int, wg *sync.WaitGroup) {
	defer wg.Done()
	for {
		select {
		case id := <-tugas:
			fmt.Printf("user %s memproses tugas %d\n", ctx.Value(kunciUser), id)
		case <-ctx.Done():
			fmt.Println("worker berhenti:", ctx.Err())
			return
		}
	}
}

func main() {
	ctx, cancel := context.WithCancel(context.Background())
	defer cancel()

	ctx = context.WithValue(ctx, kunciUser, "budi")

	tugas := make(chan int)
	var wg sync.WaitGroup

	wg.Add(1)
	go kerja(ctx, tugas, &wg)

	tugas <- 1
	tugas <- 2

	cancel()
	wg.Wait()

	fmt.Println("Err() setelah cancel:", ctx.Err())
	fmt.Println("Canceled?", errors.Is(ctx.Err(), context.Canceled))
}
