asset_singleton.go

v0.1.0
Doc Versions Source
1
package steward
2
3
import (
4
	"reflect"
5
	"sync"
6
7
	"github.com/soverenio/vanilla/throw"
8
)
9
10
var (
11
	singletonStorageLock sync.Mutex
12
	singletonStorage     = make(map[interface{}]Asset)
13
)
14
15
func RegisterSingleton(assetKey interface{}, asset Asset) (got Asset, isNew bool) {
16
	if !isComparable(assetKey) {
17
		panic(throw.IllegalValue())
18
	}
19
20
	singletonStorageLock.Lock()
21
	defer singletonStorageLock.Unlock()
22
23
	if oldSingleton, ok := singletonStorage[assetKey]; ok {
24
		return oldSingleton, false
25
	}
26
27
	singletonStorage[assetKey] = asset
28
	return asset, true
29
}
30
31
type DummySingleton struct {
32
	key interface{}
33
}
34
35
func (d DummySingleton) asset() {}
36
37
func ReserveSingleton(assetKey interface{}) {
38
	if !isComparable(assetKey) {
39
		panic(throw.IllegalValue())
40
	}
41
42
	singletonStorageLock.Lock()
43
	defer singletonStorageLock.Unlock()
44
45
	if _, ok := singletonStorage[assetKey]; ok {
46
		panic(throw.IllegalState()) // trying to assign dummy singleton to already assigned key
47
	}
48
49
	singletonStorage[assetKey] = DummySingleton{}
50
}
51
52
func (d DummySingleton) Name() string {
53
	return reflect.TypeOf(d.key).Name()
54
}
55

Source Files