applySceneItem function
Fill in one item's fields across a repeated subtree: every property
bound to <list>.<field> takes that field's value. Returns node, so a
copy can be made and filled in one expression.
Implementation
SceneNode applySceneItem(SceneNode node, String list, SceneItem item) {
void visit(SceneNode n) {
for (var ref in n.bindings.entries) {
if (ref.value case ItemRef(list: var l, :var field) when l == list) {
if (item.containsKey(field)) setSceneProperty(n, ref.key, item[field]);
}
}
n.children.forEach(visit);
}
visit(node);
return node;
}