1- package worker2
1+ package dag
22
33import (
44 "fmt"
@@ -129,24 +129,24 @@ func newNodesTransitive[T any](transitiveGetter func(d *Node[T]) *nodesTransitiv
129129 }
130130}
131131
132- type DAGEvent interface {
132+ type Event interface {
133133 dagEvent ()
134134}
135135
136- type DAGEventNewDep [T any ] struct {
136+ type EventNewDep [T any ] struct {
137137 Node * Node [T ]
138138}
139139
140- func (d DAGEventNewDep [T ]) dagEvent () {}
140+ func (d EventNewDep [T ]) dagEvent () {}
141141
142- type DAGHook func (DAGEvent )
142+ type Hook func (Event )
143143
144144type Node [T any ] struct {
145145 V T
146146 ID string
147147 frozen atomic.Bool
148148 m sync.Mutex
149- hooks []DAGHook
149+ hooks []Hook
150150
151151 Dependencies * nodesTransitive [T ]
152152 Dependees * nodesTransitive [T ]
@@ -169,7 +169,7 @@ func (d *Node[T]) GetID() string {
169169 return d .ID
170170}
171171
172- func (d * Node [T ]) AddHook (hook DAGHook ) {
172+ func (d * Node [T ]) AddHook (hook Hook ) {
173173 d .m .Lock ()
174174 defer d .m .Unlock ()
175175
@@ -207,7 +207,7 @@ func (d *Node[T]) addDependency(dep *Node[T]) {
207207 }
208208
209209 for _ , hook := range d .hooks {
210- hook (DAGEventNewDep [T ]{Node : dep })
210+ hook (EventNewDep [T ]{Node : dep })
211211 }
212212 }
213213 }
@@ -242,19 +242,27 @@ func (d *Node[T]) IsFrozen() bool {
242242 return d .frozen .Load ()
243243}
244244
245- // Freeze assumes the lock is already held
246- func (d * Node [T ]) Freeze () {
245+ // Freeze will lock, and run valid across all dependencies, return false to prevent locking
246+ func (d * Node [T ]) Freeze (valid func (* Node [T ]) bool ) bool {
247+ d .m .Lock () // prevent any deps modification
248+ defer d .m .Unlock ()
249+
247250 if d .frozen .Load () {
248- return
251+ return true
249252 }
250253
251- for _ , dep := range d .Dependencies .nodes .Slice () {
254+ for _ , dep := range d .Dependencies .Set () .Slice () {
252255 if ! dep .IsFrozen () {
253256 panic (fmt .Sprintf ("attempting to freeze '%v' while all deps aren't frozen, '%v' isnt" , d .ID , dep .ID ))
254257 }
258+
259+ if ! valid (dep ) {
260+ return false
261+ }
255262 }
256263
257264 d .frozen .Store (true )
265+ return true
258266}
259267
260268func (d * Node [T ]) DebugString () string {
0 commit comments