/*
Մեզ անհրաժեշտ է տվյալներ փոխանցել մի աղբյուրից մի սպառողի։
Աղբյուրն ապահովում է տվյալները փոքր խմբաքանակներով (~տասը գրառում), մինչդեռ սպառողը ավելի արդյունավետ է աշխատում մեծ խմբաքանակներով (~հազար գրառում):
Իրական օրինակ է 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
}