mirror of
https://github.com/fluencelabs/tendermint
synced 2025-07-31 20:21:56 +00:00
Fixed merkle implementation to fit official algorithm.
This commit is contained in:
54
merkle/util.go
Normal file
54
merkle/util.go
Normal file
@@ -0,0 +1,54 @@
|
||||
package merkle
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
)
|
||||
|
||||
func Iterator(node Node) NodeIterator {
|
||||
stack := make([]Node, 0, 10)
|
||||
var cur Node = node
|
||||
var tn_iterator NodeIterator
|
||||
tn_iterator = func()(tn Node, next NodeIterator) {
|
||||
if len(stack) > 0 || cur != nil {
|
||||
for cur != nil {
|
||||
stack = append(stack, cur)
|
||||
cur = cur.Left()
|
||||
}
|
||||
stack, cur = pop(stack)
|
||||
tn = cur
|
||||
cur = cur.Right()
|
||||
return tn, tn_iterator
|
||||
} else {
|
||||
return nil, nil
|
||||
}
|
||||
}
|
||||
return tn_iterator
|
||||
}
|
||||
|
||||
func pop(stack []Node) ([]Node, Node) {
|
||||
if len(stack) <= 0 {
|
||||
return stack, nil
|
||||
} else {
|
||||
return stack[0:len(stack)-1], stack[len(stack)-1]
|
||||
}
|
||||
}
|
||||
|
||||
func PrintIAVLNode(node *IAVLNode) {
|
||||
fmt.Println("==== NODE")
|
||||
printIAVLNode(node, 0)
|
||||
fmt.Println("==== END")
|
||||
}
|
||||
|
||||
func printIAVLNode(node *IAVLNode, indent int) {
|
||||
indentPrefix := ""
|
||||
for i:=0; i<indent; i++ {
|
||||
indentPrefix += " "
|
||||
}
|
||||
if node == nil {
|
||||
fmt.Printf("%s--\n", indentPrefix)
|
||||
} else {
|
||||
printIAVLNode(node.left, indent+1)
|
||||
fmt.Printf("%s%v:%v\n", indentPrefix, node.key, node.height)
|
||||
printIAVLNode(node.right, indent+1)
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user