| 123456789101112131415161718192021222324252627282930313233343536373839404142 |
- // package kchan -- умный потокобезопасный канал
- package kchan
- import (
- "sync"
- "gitp78su.ipnodns.ru/svi/kern/v4/lev0/etypes/ebool"
- "gitp78su.ipnodns.ru/svi/kern/v4/lev0/kspec"
- )
- // KChan -- умный потокобезопасный канал
- //
- // Канал является резиновым, но лимит можно поставить сверху.
- // При необходимости лимит ёмкости можно поднять, но не снизить.
- // Умный канал можно безопасно закрывать многократно.
- // Умный канал можно использовать неблокирующим способом.
- // Умный канал точно знает своё состояние (длина, закрыт и т.п.)
- // При передаче инстанса канала -- из него можно только читать.
- // Умный канал строго типизирован и его тип видно из сигнатуры.
- // Кроме того, можно повесить хуки на события записи, чтения и закрытия
- // (например, для целей валидации).
- type KChan[T any] struct {
- block sync.RWMutex
- isClosed kspec.ISafeBool
- lstMsg []T
- onWrite func(T)
- onRead func(T)
- onClose func()
- }
- // NewKChan -- создаёт новый безопасный умный канал
- func NewKChan[T any](fnWrite func()T) *KChan[T] {
- sf := &KChan[T]{}
- return sf
- }
- // Close -- закрывает канал
- func (sf *KChan[T]) Close() error {
- if sf.block.TryLock() == false {
- return nil
- }
- defer sf.block.Unlock()
|