@@ -36,11 +36,6 @@ type RenderOpts struct {
3636 Resync bool
3737}
3838
39- type atomImpl struct {
40- Val any
41- UsedBy map [string ]bool // component waveid -> true
42- }
43-
4439type EffectWorkElem struct {
4540 Id string
4641 EffectIndex int
@@ -79,7 +74,7 @@ func (r *RootElem) GetDataMap() map[string]any {
7974 for atomName , atom := range r .Atoms {
8075 if strings .HasPrefix (atomName , "$data." ) {
8176 strippedName := strings .TrimPrefix (atomName , "$data." )
82- result [strippedName ] = atom .Val
77+ result [strippedName ] = atom .GetVal ()
8378 }
8479 }
8580 return result
@@ -93,7 +88,7 @@ func (r *RootElem) GetConfigMap() map[string]any {
9388 for atomName , atom := range r .Atoms {
9489 if strings .HasPrefix (atomName , "$config." ) {
9590 strippedName := strings .TrimPrefix (atomName , "$config." )
96- result [strippedName ] = atom .Val
91+ result [strippedName ] = atom .GetVal ()
9792 }
9893 }
9994 return result
@@ -108,13 +103,14 @@ func MakeRoot() *RootElem {
108103 }
109104}
110105
111- func (r * RootElem ) ensureAtomNoLock (name string ) * atomImpl {
112- atom , ok := r .Atoms [name ]
113- if ! ok {
114- atom = & atomImpl {UsedBy : make (map [string ]bool )}
115- r .Atoms [name ] = atom
106+ func (r * RootElem ) CreateAtom (name string , initialVal any ) {
107+ r .atomLock .Lock ()
108+ defer r .atomLock .Unlock ()
109+
110+ if _ , ok := r .Atoms [name ]; ok {
111+ panic (fmt .Sprintf ("atom %s already exists" , name ))
116112 }
117- return atom
113+ r . Atoms [ name ] = makeAtom ( initialVal )
118114}
119115
120116// we can do better here with an inverted map, but
@@ -132,7 +128,10 @@ func (r *RootElem) AtomSetUsedBy(atomName string, waveId string, used bool) {
132128 r .atomLock .Lock ()
133129 defer r .atomLock .Unlock ()
134130
135- atom := r .ensureAtomNoLock (atomName )
131+ atom , ok := r .Atoms [atomName ]
132+ if ! ok {
133+ return
134+ }
136135 if used {
137136 atom .UsedBy [waveId ] = true
138137 } else {
@@ -161,23 +160,26 @@ func (r *RootElem) GetAtomVal(name string) any {
161160 if ! ok {
162161 return nil
163162 }
164- return atom .Val
163+ return atom .GetVal ()
165164}
166165
167166func (r * RootElem ) SetAtomVal (name string , val any , markDirty bool ) {
168167 r .atomLock .Lock ()
169168 defer r .atomLock .Unlock ()
170169
171- atom := r .ensureAtomNoLock (name )
170+ atom , ok := r .Atoms [name ]
171+ if ! ok {
172+ return
173+ }
172174 if ! markDirty {
173- atom .Val = val
175+ atom .SetVal ( val )
174176 return
175177 }
176178 // try to avoid setting the value and marking as dirty if it's the "same"
177- if util .JsonValEqual (val , atom .Val ) {
179+ if util .JsonValEqual (val , atom .GetVal () ) {
178180 return
179181 }
180- atom .Val = val
182+ atom .SetVal ( val )
181183}
182184
183185func (r * RootElem ) RemoveAtom (name string ) {
0 commit comments