| package ordered_map |
| |
| import ( |
| "fmt" |
| "bytes" |
| ) |
| |
| type node struct { |
| Prev *node |
| Next *node |
| Value interface{} |
| } |
| |
| func newRootNode() *node { |
| root := &node{} |
| root.Prev = root |
| root.Next = root |
| return root |
| } |
| |
| func newNode(prev *node, next *node, key interface{}) *node { |
| return &node{Prev: prev, Next: next, Value: key} |
| } |
| |
| func (n *node) Add(value string) { |
| root := n |
| last := root.Prev |
| last.Next = newNode(last, n, value) |
| root.Prev = last.Next |
| } |
| |
| func (n *node) String() string { |
| var buffer bytes.Buffer |
| if n.Value == "" { |
| // Need to sentinel |
| var curr *node |
| root := n |
| curr = root.Next |
| for curr != root { |
| buffer.WriteString(fmt.Sprintf("%s, ", curr.Value)) |
| curr = curr.Next |
| } |
| } else { |
| // Else, print pointer value |
| buffer.WriteString(fmt.Sprintf("%p, ", &n)) |
| } |
| return fmt.Sprintf("LinkList[%v]", buffer.String()) |
| } |
| |
| func (n *node) IterFunc() func() (string, bool) { |
| var curr *node |
| root := n |
| curr = root.Next |
| return func() (string, bool) { |
| for curr != root { |
| tmp := curr.Value.(string) |
| curr = curr.Next |
| return tmp, true |
| } |
| return "", false |
| } |
| } |