sozu

package module
v1.0.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jun 9, 2025 License: MIT Imports: 4 Imported by: 0

README

sozu

Итак 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 функция принуждающая буфер отдать данные

Пример кода с использованием агрегатора можно посмотреть тут

⚠ Закрытие контекста не приводит к немедленому завершению работы буфера. Чтобы буфер коректно завершил работу, и не вызвал протечку горутин - необходимо убедится что output канал пуст. Закрытый output означает что буфер отчистился и завершил работу

Расширеный функционал

Базовые элементы библиотеки sozu бесполезны, но их функционал можно расширить, добавляя к ним опции модицицирующие их поведение. Далее все опции будут демонстрироваться на примере Buffer но они применимы ко всем базовым элементам sozu. Опции так же можно сочетать в любых комбинациях и в любом порядке. Опции применяются в порядке передаче их в конструктор

Лимит на количество

Опция WithLimit позволяет задать лимит количества значений в буфере. По достижении этого лимита произойдет принудительный "сброс" буфера. "Сброс" буфера из другой опции, так же приведет к откату счетчика limit на соответствующее количество элементов

Создать фабрику буферов с лимитом элементов можно добавив соотвествующую опцию в параметры конструктора:

fabric := sozu.NewBuffer[type](sozu.WithLimit(limit))

где limit это максимальнео количество элементов в буфере

Пример кода можно посмотреть тут

⚠ WithLimit переопределяет capacity буфера, это стоит учитывать при использовании нескольких опций влияющих на capacity. Итоговый буфер будет создан с capacity первой афектящей опции из списка параметров конструктора.

Лимит по времени

Опция 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

Пример кода можно посмотреть тут

Комбинируя эту опцию с другими можно добится сложного поведения, как тут

TODO

  • опция для указания капасити в случае если limit не задан
  • опции для ручной постановки колбеков
  • опция для сброса по достижению количества определенных элементов

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func WithFlipFlop

func WithFlipFlop[V any, C comparable](criteria func(V) C) applyOptionFunc[V]

func WithLimit

func WithLimit[V any](limit int) applyOptionFunc[V]

func WithMultiplexor

func WithMultiplexor[V any, C comparable](
	separator func(V) C,
	capacity int,
) applyOptionFunc[V]

func WithTimer

func WithTimer[V any](duratiorn time.Duration) applyOptionFunc[V]

Types

type Factory

type Factory[V any] interface {
	Create(ctx context.Context, input chan V) (<-chan []V, func(context.Context))
}

func NewAggregator

func NewAggregator[V any](aggregateFunc func(V, V) V, opts ...applyOptionFunc[V]) Factory[V]

func NewBuffer

func NewBuffer[V any](opts ...applyOptionFunc[V]) Factory[V]

Directories

Path Synopsis
example
aggregator command
buffer command
limited_buffer command
timer_buffer command
Package internal is a generated GoMock package.
Package internal is a generated GoMock package.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL