func (t *Tree) Insert(s string, v interface{}) (interface{}, bool) {
	var parent *node
	n := t.root
	search := s
	for {
		// Handle key exhaution
		if len(search) == 0 {
			if n.isLeaf() {
				old := n.leaf.val
				n.leaf.val = v
				return old, true
			}

			n.leaf = &leafNode{
				key: s,
				val: v,
			}
			t.size++
			return nil, false
		}

		// Look for the edge
		parent = n
		n = n.getEdge(search[0])

		// No edge, create one
		if n == nil {
			e := edge{
				label: search[0],
				node: &node{
					leaf: &leafNode{
						key: s,
						val: v,
					},
					prefix: search,
				},
			}
			parent.addEdge(e)
			t.size++
			return nil, false
		}

		// Determine longest prefix of the search key on match
		commonPrefix := longestPrefix(search, n.prefix)
		if commonPrefix == len(n.prefix) {
			search = search[commonPrefix:]
			continue
		}

		// Split the node
		t.size++
		child := &node{
			prefix: search[:commonPrefix],
		}
		parent.updateEdge(search[0], child)

		// Restore the existing node
		child.addEdge(edge{
			label: n.prefix[commonPrefix],
			node:  n,
		})
		n.prefix = n.prefix[commonPrefix:]

		// Create a new leaf node
		leaf := &leafNode{
			key: s,
			val: v,
		}

		// If the new key is a subset, add to to this node
		search = search[commonPrefix:]
		if len(search) == 0 {
			child.leaf = leaf
			return nil, false
		}

		// Create a new edge for the node
		child.addEdge(edge{
			label: search[0],
			node: &node{
				leaf:   leaf,
				prefix: search,
			},
		})
		return nil, false
	}
}
func (t *Tree) Insert(s string, v interface{}) (interface{}, bool) {
	var parent *node
	n := t.root
	search := s
	for {
		
		if len(search) == 0 {
			if n.isLeaf() {
				old := n.leaf.val
				n.leaf.val = v
				return old, true
			}

			n.leaf = &leafNode{
				key: s,
				val: v,
			}
			t.size++
			return nil, false
		}

		
		parent = n
		n = n.getEdge(search[0])

		
		if n == nil {
			e := edge{
				label: search[0],
				node: &node{
					leaf: &leafNode{
						key: s,
						val: v,
					},
					prefix: search,
				},
			}
			parent.addEdge(e)
			t.size++
			return nil, false
		}

		
		commonPrefix := longestPrefix(search, n.prefix)
		if commonPrefix == len(n.prefix) {
			search = search[commonPrefix:]
			continue
		}

		
		t.size++
		child := &node{
			prefix: search[:commonPrefix],
		}
		parent.updateEdge(search[0], child)

		
		child.addEdge(edge{
			label: n.prefix[commonPrefix],
			node:  n,
		})
		n.prefix = n.prefix[commonPrefix:]

		
		leaf := &leafNode{
			key: s,
			val: v,
		}

		
		search = search[commonPrefix:]
		if len(search) == 0 {
			child.leaf = leaf
			return nil, false
		}

		
		child.addEdge(edge{
			label: search[0],
			node: &node{
				leaf:   leaf,
				prefix: search,
			},
		})
		return nil, false
	}
}
func ( t * Tree ) Insert ( s string , v interface { } ) ( interface { } , bool ) { var parent * node n := t . root search := s for { // Handle key exhaution if len ( search ) == 0 { if n . isLeaf ( ) { old := n . leaf . val n . leaf . val = v return old , true } n . leaf = & leafNode { key : s , val : v , } t . size ++ return nil , false } // Look for the edge parent = n n = n . getEdge ( search [ 0 ] ) // No edge, create one if n == nil { e := edge { label : search [ 0 ] , node : & node { leaf : & leafNode { key : s , val : v , } , prefix : search , } , } parent . addEdge ( e ) t . size ++ return nil , false } // Determine longest prefix of the search key on match commonPrefix := longestPrefix ( search , n . prefix ) if commonPrefix == len ( n . prefix ) { search = search [ commonPrefix : ] continue } // Split the node t . size ++ child := & node { prefix : search [ : commonPrefix ] , } parent . updateEdge ( search [ 0 ] , child ) // Restore the existing node child . addEdge ( edge { label : n . prefix [ commonPrefix ] , node : n , } ) n . prefix = n . prefix [ commonPrefix : ] // Create a new leaf node leaf := & leafNode { key : s , val : v , } // If the new key is a subset, add to to this node search = search [ commonPrefix : ] if len ( search ) == 0 { child . leaf = leaf return nil , false } // Create a new edge for the node child . addEdge ( edge { label : search [ 0 ] , node : & node { leaf : leaf , prefix : search , } , } ) return nil , false } }
// Insert is used to add a newentry or update
// an existing entry. Returns if updated.
Insert is used to add a newentry or update an existing entry . Returns if updated .