locked.go

v0.2.0
Doc Versions Source
1
package syncutil
2
3
import "sync"
4
5
type LockedImmutable[T any] struct {
6
	mu    sync.RWMutex
7
	value T
8
}
9
10
func NewLockedImmutable[T any](value T) *LockedImmutable[T] {
11
	return &LockedImmutable[T]{value: value}
12
}
13
14
func (l *LockedImmutable[T]) Do(f func(value T) T) {
15
	l.mu.Lock()
16
	defer l.mu.Unlock()
17
	l.value = f(l.value)
18
}
19
20
func (l *LockedImmutable[T]) Set(value T) {
21
	l.mu.Lock()
22
	defer l.mu.Unlock()
23
	l.value = value
24
}
25
26
func (l *LockedImmutable[T]) Get() T {
27
	l.mu.RLock()
28
	defer l.mu.RUnlock()
29
	return l.value
30
}
31
32
func (l *LockedImmutable[T]) Apply(f func(value T)) {
33
	l.mu.RLock()
34
	defer l.mu.RUnlock()
35
	f(l.value)
36
}
37
38
func ApplyWithResult[T any, V any](l *LockedImmutable[T], f func(value T) V) V {
39
	l.mu.RLock()
40
	defer l.mu.RUnlock()
41
	return f(l.value)
42
}
43

Source Files