/*
Морамо пренети податке из извора у неку врсту потрошача.
Извор даје податке у малим пакетићима (~десет записа), док потрошач ради ефикасније са већим пакетићима (~хиљаду записа).
Прави пример је пренос података из Kafka типа редова у базу података Clickhouse.
Извор:
- Практично бесконачан.
- Извор никада не враћа више од MaxItems записа у једном позиву Next.
- У оквиру једне "сесије" (једног позива функције Pipe), извор сваки пут враћа нове податке на сваки позив Next.
- Међутим, након поновног покретања, извор почиње од претходне "потврђене" позиције, дефинисане cookie-јем.
Због тога, *свака* вредност cookie-ја коју врати Next, након што се подаци сачувају у примаоцу,
мора бити потврђена позивом Commit, у истом редоследу у коме су враћени од стране Next.
Прималац:
- Не може обрадити више од MaxItems одједном.
Потребно је имплементирати функцију func Pipe(p Producer, c Consumer) error
која чита податке из извора, групише их у буфер величине не већој од MaxItems и чува у примаоцу,
након чега потврђује напредак у извору.
*/
const MaxItems = 9999
type Producer interface {
// Next враћа:
// - пакет ставки за обраду
// - cookie за потврду када је обрада завршена
// - грешка
Next() (items []any, cookie int, err error)
// Commit се користи за означавање пакета података као обрађеног
Commit(cookie int) error
}
type Consumer interface {
Process(items []any) error
}
func Pipe(p Producer, c Consumer) error {
// TODO
}