// 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()