iter.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. package iradix
  2. import "bytes"
  3. // Iterator is used to iterate over a set of nodes
  4. // in pre-order
  5. type Iterator struct {
  6. node *Node
  7. stack []edges
  8. }
  9. // SeekPrefix is used to seek the iterator to a given prefix
  10. func (i *Iterator) SeekPrefix(prefix []byte) {
  11. // Wipe the stack
  12. i.stack = nil
  13. n := i.node
  14. search := prefix
  15. for {
  16. // Check for key exhaution
  17. if len(search) == 0 {
  18. i.node = n
  19. return
  20. }
  21. // Look for an edge
  22. _, n = n.getEdge(search[0])
  23. if n == nil {
  24. i.node = nil
  25. return
  26. }
  27. // Consume the search prefix
  28. if bytes.HasPrefix(search, n.prefix) {
  29. search = search[len(n.prefix):]
  30. } else if bytes.HasPrefix(n.prefix, search) {
  31. i.node = n
  32. return
  33. } else {
  34. i.node = nil
  35. return
  36. }
  37. }
  38. }
  39. // Next returns the next node in order
  40. func (i *Iterator) Next() ([]byte, interface{}, bool) {
  41. // Initialize our stack if needed
  42. if i.stack == nil && i.node != nil {
  43. i.stack = []edges{
  44. edges{
  45. edge{node: i.node},
  46. },
  47. }
  48. }
  49. for len(i.stack) > 0 {
  50. // Inspect the last element of the stack
  51. n := len(i.stack)
  52. last := i.stack[n-1]
  53. elem := last[0].node
  54. // Update the stack
  55. if len(last) > 1 {
  56. i.stack[n-1] = last[1:]
  57. } else {
  58. i.stack = i.stack[:n-1]
  59. }
  60. // Push the edges onto the frontier
  61. if len(elem.edges) > 0 {
  62. i.stack = append(i.stack, elem.edges)
  63. }
  64. // Return the leaf values if any
  65. if elem.leaf != nil {
  66. return elem.leaf.key, elem.leaf.val, true
  67. }
  68. }
  69. return nil, nil, false
  70. }