flattenPathMap method

List<_ValueNode> flattenPathMap(
  1. 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;
}