memory_iter.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. package ezdb
  2. import "sort"
  3. type MemoryIterator[T any] struct {
  4. k []string
  5. m map[string]T
  6. pos int
  7. released bool
  8. prev Iterator[T]
  9. }
  10. func (i *MemoryIterator[T]) Count() int {
  11. return len(i.k)
  12. }
  13. func (i *MemoryIterator[T]) Filter(f FilterFunc[T]) Iterator[T] {
  14. if i.released {
  15. return i
  16. }
  17. k := []string{}
  18. m := map[string]T{}
  19. i.reset()
  20. for i.Next() {
  21. key, value, _ := i.Get()
  22. if f(key, value) {
  23. k = append(k, key)
  24. m[key] = value
  25. }
  26. }
  27. return newMemoryIterator(m, k, i)
  28. }
  29. func (i *MemoryIterator[T]) First() bool {
  30. if i.released {
  31. return false
  32. }
  33. i.pos = 0
  34. return true
  35. }
  36. func (i *MemoryIterator[T]) Get() (string, T, error) {
  37. if i.released {
  38. return "", i.m[""], ErrReleased
  39. }
  40. key := i.Key()
  41. return key, i.m[key], nil
  42. }
  43. func (i *MemoryIterator[T]) GetAll() (map[string]T, error) {
  44. m := map[string]T{}
  45. if i.released {
  46. return m, ErrReleased
  47. }
  48. i.reset()
  49. for i.Next() {
  50. key, value, _ := i.Get()
  51. m[key] = value
  52. }
  53. return m, nil
  54. }
  55. func (i *MemoryIterator[T]) GetAllKeys() []string {
  56. keys := []string{}
  57. if i.released {
  58. return keys
  59. }
  60. i.reset()
  61. for i.Next() {
  62. keys = append(keys, i.Key())
  63. }
  64. return keys
  65. }
  66. func (i *MemoryIterator[T]) Key() string {
  67. if i.pos < 0 || i.pos > i.Count() || i.released {
  68. return ""
  69. }
  70. return i.k[i.pos]
  71. }
  72. func (i *MemoryIterator[T]) Last() bool {
  73. if i.released {
  74. return false
  75. }
  76. i.pos = len(i.k) - 1
  77. return true
  78. }
  79. func (i *MemoryIterator[T]) Next() bool {
  80. if i.released {
  81. return false
  82. }
  83. hasNext := i.pos+1 <= i.Count()
  84. if hasNext {
  85. i.pos++
  86. }
  87. return hasNext
  88. }
  89. func (i *MemoryIterator[T]) Prev() bool {
  90. if i.released {
  91. return false
  92. }
  93. end := i.pos > 0
  94. if !end {
  95. i.pos--
  96. }
  97. return end
  98. }
  99. func (i *MemoryIterator[T]) Release() {
  100. i.k = []string{}
  101. i.m = map[string]T{}
  102. i.released = true
  103. if i.prev != nil {
  104. i.prev.Release()
  105. }
  106. }
  107. func (i *MemoryIterator[T]) Sort(f SortFunc[T]) Iterator[T] {
  108. if i.released {
  109. return i
  110. }
  111. s := &valueSort[T]{
  112. a: makeSortable(i.m),
  113. f: f,
  114. }
  115. sort.Stable(s)
  116. k := s.Result()
  117. return newMemoryIterator(i.m, k, i)
  118. }
  119. func (i *MemoryIterator[T]) SortKeys(f SortFunc[string]) Iterator[T] {
  120. if i.released {
  121. return i
  122. }
  123. s := &keySort{
  124. a: i.k,
  125. f: f,
  126. }
  127. sort.Stable(s)
  128. k := s.Result()
  129. return newMemoryIterator(i.m, k, i)
  130. }
  131. func (i *MemoryIterator[T]) Value() (T, error) {
  132. key := i.Key()
  133. return i.m[key], nil
  134. }
  135. func (i *MemoryIterator[T]) reset() {
  136. i.pos = -1
  137. }
  138. func newMemoryIterator[T any](m map[string]T, k []string, prev Iterator[T]) *MemoryIterator[T] {
  139. i := &MemoryIterator[T]{
  140. k: []string{},
  141. m: m,
  142. pos: -1,
  143. prev: prev,
  144. }
  145. if len(k) > 0 {
  146. i.k = k
  147. } else {
  148. for k := range i.m {
  149. i.k = append(i.k, k)
  150. }
  151. }
  152. return i
  153. }