private void AddItem(GraphMap <TKey, TNode, TEdge> map, IGraphCommon element, TKey parentKey) { switch (element) { case NodeMap <TKey> node: map.Add((TNode)CreateNode(node.Key)); if (!EqualityComparer <TKey> .Default.Equals(parentKey, default(TKey))) { map.Add((TEdge)CreateEdge(parentKey, node.Key)); } foreach (var child in node) { AddItem(map, child, node.Key); } break; case SequenceMap <TKey> sequence: TKey linkParent = parentKey; bool first = true; foreach (var child in sequence) { AddItem(map, child, parentKey); if (child is IGraphNode <TKey> childNode) { if (!first) { map.Add((TEdge)CreateDependsOnEdge(childNode.Key, linkParent)); } else { first = false; } linkParent = childNode.Key; } } break; case IGraphNode <TKey> node: map.Add((TNode)CreateNode(node.Key)); break; case GraphEdge <TKey> edge: map.Add((TEdge)CreateEdge(edge.FromNodeKey, edge.ToNodeKey)); break; case GraphDependOnEdge <TKey> edge: map.Add((TEdge)CreateDependsOnEdge(edge.FromNodeKey, edge.ToNodeKey)); break; default: throw new ArgumentException($"Not supported type: {element.GetType()}"); } }
public GraphMapBuilder <TKey, TNode, TEdge> Add(IGraphCommon item) { _items.Add(item); return(this); }