engine: util: Add EdgeCombiner() for combining auto edges
This commit is contained in:
@@ -331,3 +331,38 @@ func unitStateAction(ctx context.Context, conn *dbus.Conn, unit, action string)
|
|||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// autoEdgeCombiner holds the state of the auto edge generator.
|
||||||
|
type autoEdgeCombiner struct {
|
||||||
|
ae []engine.AutoEdge
|
||||||
|
ptr int
|
||||||
|
}
|
||||||
|
|
||||||
|
// Next returns the next automatic edge.
|
||||||
|
func (obj *autoEdgeCombiner) Next() []engine.ResUID {
|
||||||
|
if len(obj.ae) <= obj.ptr {
|
||||||
|
panic("shouldn't be called anymore!")
|
||||||
|
}
|
||||||
|
return obj.ae[obj.ptr].Next() // return the next edge
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test takes the output of the last call to Next() and outputs true if we
|
||||||
|
// should continue.
|
||||||
|
func (obj *autoEdgeCombiner) Test(input []bool) bool {
|
||||||
|
if !obj.ae[obj.ptr].Test(input) {
|
||||||
|
obj.ptr++ // match found, on to the next
|
||||||
|
}
|
||||||
|
return len(obj.ae) > obj.ptr // are there any auto edges left?
|
||||||
|
}
|
||||||
|
|
||||||
|
// AutoEdgeCombiner takes any number of AutoEdge structs, and combines them
|
||||||
|
// into a single one, so that the logic from each one can be built separately,
|
||||||
|
// and then combined using this utility. This makes implementing different
|
||||||
|
// AutoEdge generators much easier. This respects the Next() and Test() API,
|
||||||
|
// and ratchets through each AutoEdge entry until they have all run their
|
||||||
|
// course.
|
||||||
|
func AutoEdgeCombiner(ae ...engine.AutoEdge) (engine.AutoEdge, error) {
|
||||||
|
return &autoEdgeCombiner{
|
||||||
|
ae: ae,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user