func (nset *nodeSet) intersection(nset2 *nodeSet) *nodeSet {
	intersection := newNodeSet()
	if nset2 == nil {
		return intersection
	}
	for k := range nset.nodes {
		if nset2.contains(k) {
			intersection.add(k)
		}
	}
	return intersection
}
returns nset intersection nset2
package phantom
import (
	"bytes"
	"encoding/gob"
	"sort"
)
type nodeSet struct {
	nodes map[*Node]struct{}
}
func newNodeSet() *nodeSet {
	return &nodeSet{
		nodes: make(map[*Node]struct{}),
	}
}
func (nset *nodeSet) size() int {
	return len(nset.nodes)
}
func (nset *nodeSet) add(node *Node) {
	if node == nil {
		return
	}
	if nset.contains(node) {
		return
	}
	nset.nodes[node] = keyExists
}
func (nset *nodeSet) remove(node *Node) {
	delete(nset.nodes, node)
}
func (nset *nodeSet) elements() []*Node {
	nodes := make([]*Node, len(nset.nodes))
	index := 0
	for k := range nset.nodes {
		nodes[index] = k
		index += 1
	}
	sort.Slice(nodes, func(i, j int) bool {
		if nodes[i].GetId() < nodes[j].GetId() {
			return true
		} else {
			return false
		}
	})
	return nodes
}
func (nset *nodeSet) contains(node *Node) bool {
	_, ok := nset.nodes[node]
	return ok
}
func (nset *nodeSet) difference(nset2 *nodeSet) *nodeSet {
	diff := newNodeSet()
	if nset2 == nil {
		return diff
	}
	for k := range nset.nodes {
		if !nset2.contains(k) {
			diff.add(k)
		}
	}
	return diff
}