kilo/vendor/github.com/awalterschulze/gographviz/nodes.go

79 lines
1.8 KiB
Go

//Copyright 2013 GoGraphviz Authors
//
//Licensed under the Apache License, Version 2.0 (the "License");
//you may not use this file except in compliance with the License.
//You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
//Unless required by applicable law or agreed to in writing, software
//distributed under the License is distributed on an "AS IS" BASIS,
//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//See the License for the specific language governing permissions and
//limitations under the License.
package gographviz
import (
"fmt"
"sort"
)
// Node represents a Node.
type Node struct {
Name string
Attrs Attrs
}
// Nodes represents a set of Nodes.
type Nodes struct {
Lookup map[string]*Node
Nodes []*Node
}
// NewNodes creates a new set of Nodes.
func NewNodes() *Nodes {
return &Nodes{make(map[string]*Node), make([]*Node, 0)}
}
// Remove removes a node
func (nodes *Nodes) Remove(name string) error {
for i := 0; i < len(nodes.Nodes); i++ {
if nodes.Nodes[i].Name != name {
continue
}
nodes.Nodes = append(nodes.Nodes[:i], nodes.Nodes[i+1:]...)
delete(nodes.Lookup, name)
return nil
}
return fmt.Errorf("node %s not found", name)
}
// Add adds a Node to the set of Nodes, extending the attributes of an already existing node.
func (nodes *Nodes) Add(node *Node) {
n, ok := nodes.Lookup[node.Name]
if ok {
n.Attrs.Extend(node.Attrs)
return
}
nodes.Lookup[node.Name] = node
nodes.Nodes = append(nodes.Nodes, node)
}
// Sorted returns a sorted list of nodes.
func (nodes Nodes) Sorted() []*Node {
keys := make([]string, 0, len(nodes.Lookup))
for key := range nodes.Lookup {
keys = append(keys, key)
}
sort.Strings(keys)
nodeList := make([]*Node, len(keys))
for i := range keys {
nodeList[i] = nodes.Lookup[keys[i]]
}
return nodeList
}