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