1use crate::merge;
2use crate::model::{AnyNode, NodeType};
3
4pub fn merge_any(xs: &AnyNode, ys: AnyNode) -> NodeType {
5 let xs = &xs.nodes;
6 let ys = ys.nodes;
7
8 let mut zs = xs.clone();
9 for node_type in ys {
10 match node_type {
11 node @ NodeType::Object { .. } => match xs.iter().find(|x| x.is_object()) {
12 None => {
13 zs.insert(node);
14 }
15 Some(other @ NodeType::Object { .. }) => {
16 zs.remove(other);
17 zs.insert(merge::merge_node_type(node, other.clone()));
18 }
19 Some(_) => unreachable!(),
20 },
21 node @ NodeType::Array(_) => match xs.iter().find(|x| x.is_array()) {
22 None => {
23 zs.insert(node);
24 }
25 Some(other @ NodeType::Array(_)) => {
26 zs.remove(other);
27 zs.insert(merge::merge_node_type(node, other.clone()));
28 }
29 Some(_) => unreachable!(),
30 },
31 _ => {
32 zs.insert(node_type);
33 }
34 }
35 }
36
37 AnyNode::new(zs).into()
38}