Итак sozu. Это отпугивалка оленей, которая поможет вам собрать ваши данные в кучку.
На текущий момент реализовано 2 режима работы: буфер и агрегатор
Буфер накапливает масив данных и отдает его по запросу.
Чтобы создать фабрику буферов, выполните fabric := sozu.NewBuffer[type]()
И затем создайте любое количество буферов вызвав
output, flush := fabric.Create(ctx, input)
где
input
канал типа type, куда предпологается передавать входные данные.ctx
контекст для экстреного завершения работы буфераoutput
канал типа []type с масивом выходных данныхflush
функция принуждающая буфер отдать данные
Пример кода с использованием буфера можно посмотреть тут
Агрегатор работает похожим образом, но позволяет сэкономить на алокации масива, в случае если вам необходимо просто выполнить простую операцию с данными. Например если вам нужно хранить только максимальный элемент.
Чтобы создать фабрику агрегаторов выполните
fabric := sozu.NewAggregator[type](aggregateFunc)
где
aggregateFunc
это функция с сигнатурой func(type, type) type
.
Затем вы можете создать любое количество агрегаторов вызвав
output, flush := fabric.Create(ctx, input)
где
input
канал типа type, куда предпологается передавать входные данные.ctx
контекст для экстреного завершения работы буфераoutput
канал типа []type с масивом выходных данныхflush
функция принуждающая буфер отдать данные
Пример кода с использованием агрегатора можно посмотреть тут
Базовые элементы библиотеки sozu бесполезны, но их функционал можно расширить, добавляя к ним опции модицицирующие их поведение. Далее все опции будут демонстрироваться на примере Buffer но они применимы ко всем базовым элементам sozu. Опции так же можно сочетать в любых комбинациях и в любом порядке. Опции применяются в порядке передаче их в конструктор
Опция WithLimit позволяет задать лимит количества значений в буфере. По достижении этого лимита произойдет принудительный "сброс" буфера. "Сброс" буфера из другой опции, так же приведет к откату счетчика limit на соответствующее количество элементов
Создать фабрику буферов с лимитом элементов можно добавив соотвествующую опцию в параметры конструктора:
fabric := sozu.NewBuffer[type](sozu.WithLimit(limit))
где limit
это максимальнео количество элементов в буфере
Пример кода можно посмотреть тут
Опция WithTimer позволяет задать лимит времени на хранение данных в буфере. По истечении времени произойдет принудительный "сброс" буфера. "Сброс" из другой опции также приведет к сбросу таймера, при условии что в буфере не осталось элементов.
Создать фабрику буферов с лимитом по времени можно добавив соответствуующую опцию в параметры конструктора:
fabric := sozu.NewBuffer[type](sozu.WithTimer(duration))
где duration
это максимальное время хранения данных в буфере типа
time.Duration
Пример кода можно посмотреть тут
Опция WithFlipFLop позволяет "сбросить" буфер при изменении какойлибо характеристики данных
Создать фабрику буферов с FlipFlop опцией можно вызвав
fabric := sozu.NewBuffer[type](sozu.WithFlipFlop(criteria))
где criteria это функция с сигнатурой func[V any, C comparable](V) C
эта функция будет применятся ко всем входным данным и при изменении ее ответа
произойдет "сброс" буфера
Пример кода можно посмотреть тут
Опция WithMultiplexor позволяет независимо хранить данные с разными характеристиками
Создать буфер с мультиплексором можно вызвав
fabric := sozu.NewBuffer[type](sozu.WithMultiplexor(separator, capacity))
где separator
функция с сигнатурой func[V any, C comparable](V) C
а capacity
ожидаемое количество вариантов ответа этой функции
Под копотом буфер с этой опцией создаст "подбуферы" для значений с разными ответами функции separator
Пример кода можно посмотреть тут
Комбинируя эту опцию с другими можно добится сложного поведения, как тут
- опция для указания капасити в случае если limit не задан
- опции для ручной постановки колбеков
- опция для сброса по достижению количества определенных элементов