flattenPathMap method
List<_ValueNode>
flattenPathMap(
- List<_ValueTargetPath> targets
)
Implementation
List<_ValueNode> flattenPathMap(List<_ValueTargetPath> targets) {
var nodeList = <_ValueNode>[];
var keys = targets.map((e) => e.rootKey).toSet();
/// for each unique root key for this map/list
for (var key in keys) {
var node = nodeList.firstWhere((element) => element.key == key,
orElse: () => _ValueNode(key));
var nodeValues =
targets.where((element) => element.rootKey == key).toList();
/// for each value attached to a node with this root key
for (var target in nodeValues) {
var subNodes = [target]
.map((e) => e.popNode())
.whereType<_ValueTargetPath>()
.toList();
if (subNodes.isNotEmpty) {
var flatSubNodes = flattenPathMap(subNodes);
node.childs.addAll(flatSubNodes);
} else {
node.value = target.value;
}
}
// a node cannot be without a value nor some childs
assert(node.value != null || node.childs.isNotEmpty);
nodeList.add(node);
}
return nodeList;
}