memory_iter.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  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 MemoryIter(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]) Reset() {
  108. i.pos = -1
  109. }
  110. func (i *MemoryIterator[T]) Sort(f SortFunc[T]) Iterator[T] {
  111. if i.released {
  112. return i
  113. }
  114. s := &valueSort[T]{
  115. a: makeSortable(i.m),
  116. f: f,
  117. }
  118. sort.Stable(s)
  119. k := s.Result()
  120. return MemoryIter(i.m, k, i)
  121. }
  122. func (i *MemoryIterator[T]) SortKeys(f SortFunc[string]) Iterator[T] {
  123. if i.released {
  124. return i
  125. }
  126. s := &keySort{
  127. a: i.k,
  128. f: f,
  129. }
  130. sort.Stable(s)
  131. k := s.Result()
  132. return MemoryIter(i.m, k, i)
  133. }
  134. func (i *MemoryIterator[T]) Value() (T, error) {
  135. key := i.Key()
  136. return i.m[key], nil
  137. }
  138. // MemoryIter creates an in-memory iterator for any data.
  139. // k must have a direct relation to m, representing the sorting of keys in the map, otherwise results may be unpredictable.
  140. //
  141. // If the iterator prev is non-nil, it will be released when this iterator is released.
  142. func MemoryIter[T any](m map[string]T, k []string, prev Iterator[T]) *MemoryIterator[T] {
  143. i := &MemoryIterator[T]{
  144. k: []string{},
  145. m: m,
  146. pos: -1,
  147. prev: prev,
  148. }
  149. if len(k) > 0 {
  150. i.k = k
  151. } else {
  152. for k := range i.m {
  153. i.k = append(i.k, k)
  154. }
  155. }
  156. return i
  157. }