package nf import ( "strings" ) type _node struct { pattern string part string children []*_node isWild bool } func (n *_node) insert(pattern string, parts []string, height int) { if len(parts) == height { n.pattern = pattern return } part := parts[height] child := n.matchChild(part) if child == nil { child = &_node{part: part, isWild: part[0] == ':' || part[0] == '*'} n.children = append(n.children, child) } child.insert(pattern, parts, height+1) } func (n *_node) search(parts []string, height int) *_node { if len(parts) == height || strings.HasPrefix(n.part, "*") { if n.pattern == "" { return nil } return n } part := parts[height] children := n.matchChildren(part) for _, child := range children { result := child.search(parts, height+1) if result != nil { return result } } return nil } func (n *_node) travel(list *([]*_node)) { if n.pattern != "" { *list = append(*list, n) } for _, child := range n.children { child.travel(list) } } func (n *_node) matchChild(part string) *_node { for _, child := range n.children { if child.part == part || child.isWild { return child } } return nil } func (n *_node) matchChildren(part string) []*_node { nodes := make([]*_node, 0) for _, child := range n.children { if child.part == part || child.isWild { nodes = append(nodes, child) } } return nodes }