mirror of
https://github.com/opencloud-eu/opencloud.git
synced 2025-12-26 15:50:47 -05:00
63 lines
1.1 KiB
Go
63 lines
1.1 KiB
Go
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
|
|
}
|
|
}
|