applySceneItem function

SceneNode applySceneItem(
  1. SceneNode node,
  2. String list,
  3. SceneItem item
)

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;
}