rbtree-ruby 0.1.7 → 0.1.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +10 -4
- data/lib/rbtree/version.rb +1 -1
- data/lib/rbtree.rb +41 -86
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: ad4ff4e15079d2034a111e0180f1abbf5f433283de5c125f45569f9b69f558fc
|
|
4
|
+
data.tar.gz: 7355e1ae3964e79aa8d110c52e38672641c8d67ac1cb4cfbbd974fe6298f07f7
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: e62ddc40bfc16d4afaf9430b679b03cfb50e89d3a02d7ab43a190b168015d4c6605baf579cc55abc0d42db207465538f99e81618beca873a1b4c654d1ab0c72f
|
|
7
|
+
data.tar.gz: d11f0258d1ea5ea2686cc8bb581eb3b5c524554bf2182d68d54759e592d58d57e463bfa87b13dbabb67e68becfa8648108b267751791a1877e49bc7c6e2f6a06
|
data/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,15 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [0.1.8] - 2026-01-14
|
|
9
|
+
|
|
10
|
+
### Changed
|
|
11
|
+
- **Range Query Returns Enumerator**: `lt`, `lte`, `gt`, `gte`, `between` now return an `Enumerator` instead of an `Array` when no block is given
|
|
12
|
+
- Enables lazy evaluation: `tree.gt(100).lazy.take(5).to_a`
|
|
13
|
+
- Enables chaining: `tree.lt(50).map { |k, v| k }`
|
|
14
|
+
- Use `.to_a` to get an Array: `tree.lt(50).to_a`
|
|
15
|
+
- **Breaking**: Code using direct array access like `tree.lt(50)[0]` must change to `tree.lt(50).first`
|
|
16
|
+
|
|
8
17
|
## [0.1.7] - 2026-01-14
|
|
9
18
|
|
|
10
19
|
### Added
|
|
@@ -107,9 +116,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
107
116
|
- ASCII diagrams for tree rotation operations
|
|
108
117
|
- MIT License (Copyright © 2026 Masahito Suzuki)
|
|
109
118
|
|
|
119
|
+
[0.1.8]: https://github.com/firelzrd/rbtree-ruby/releases/tag/v0.1.8
|
|
110
120
|
[0.1.7]: https://github.com/firelzrd/rbtree-ruby/releases/tag/v0.1.7
|
|
111
121
|
[0.1.6]: https://github.com/firelzrd/rbtree-ruby/releases/tag/v0.1.6
|
|
112
|
-
[0.1.5]: https://github.com/firelzrd/rbtree-ruby/releases/tag/v0.1.5
|
|
113
|
-
[0.1.4]: https://github.com/firelzrd/rbtree-ruby/releases/tag/v0.1.4
|
|
114
|
-
[0.1.3]: https://github.com/firelzrd/rbtree-ruby/releases/tag/v0.1.3
|
|
115
|
-
[0.1.2]: https://github.com/firelzrd/rbtree-ruby/releases/tag/v0.1.2
|
data/lib/rbtree/version.rb
CHANGED
data/lib/rbtree.rb
CHANGED
|
@@ -331,28 +331,20 @@ class RBTree
|
|
|
331
331
|
# @param key [Object] the upper bound (exclusive)
|
|
332
332
|
# @param reverse [Boolean] if true, iterate in descending order (default: false)
|
|
333
333
|
# @yield [key, value] each matching key-value pair (if block given)
|
|
334
|
-
# @return [
|
|
334
|
+
# @return [Enumerator, RBTree] Enumerator if no block given, self otherwise
|
|
335
335
|
# @example
|
|
336
336
|
# tree = RBTree.new({1 => 'one', 2 => 'two', 3 => 'three', 4 => 'four'})
|
|
337
|
-
# tree.lt(3) # => [[1, "one"], [2, "two"]]
|
|
338
|
-
# tree.lt(3, reverse: true) # => [
|
|
337
|
+
# tree.lt(3).to_a # => [[1, "one"], [2, "two"]]
|
|
338
|
+
# tree.lt(3, reverse: true).first # => [2, "two"]
|
|
339
|
+
# tree.lt(3) { |k, v| puts k } # prints keys, returns self
|
|
339
340
|
def lt(key, reverse: false, &block)
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
else
|
|
344
|
-
traverse_lt(@root, key, &block)
|
|
345
|
-
end
|
|
346
|
-
self
|
|
341
|
+
return enum_for(:lt, key, reverse: reverse) unless block_given?
|
|
342
|
+
if reverse
|
|
343
|
+
traverse_lt_desc(@root, key, &block)
|
|
347
344
|
else
|
|
348
|
-
|
|
349
|
-
if reverse
|
|
350
|
-
traverse_lt_desc(@root, key) { |k, v| res << [k, v] }
|
|
351
|
-
else
|
|
352
|
-
traverse_lt(@root, key) { |k, v| res << [k, v] }
|
|
353
|
-
end
|
|
354
|
-
res
|
|
345
|
+
traverse_lt(@root, key, &block)
|
|
355
346
|
end
|
|
347
|
+
self
|
|
356
348
|
end
|
|
357
349
|
|
|
358
350
|
# Retrieves all key-value pairs with keys less than or equal to the specified key.
|
|
@@ -360,28 +352,19 @@ class RBTree
|
|
|
360
352
|
# @param key [Object] the upper bound (inclusive)
|
|
361
353
|
# @param reverse [Boolean] if true, iterate in descending order (default: false)
|
|
362
354
|
# @yield [key, value] each matching key-value pair (if block given)
|
|
363
|
-
# @return [
|
|
355
|
+
# @return [Enumerator, RBTree] Enumerator if no block given, self otherwise
|
|
364
356
|
# @example
|
|
365
357
|
# tree = RBTree.new({1 => 'one', 2 => 'two', 3 => 'three', 4 => 'four'})
|
|
366
|
-
# tree.lte(3) # => [[1, "one"], [2, "two"], [3, "three"]]
|
|
367
|
-
# tree.lte(3, reverse: true) # => [
|
|
358
|
+
# tree.lte(3).to_a # => [[1, "one"], [2, "two"], [3, "three"]]
|
|
359
|
+
# tree.lte(3, reverse: true).first # => [3, "three"]
|
|
368
360
|
def lte(key, reverse: false, &block)
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
else
|
|
373
|
-
traverse_lte(@root, key, &block)
|
|
374
|
-
end
|
|
375
|
-
self
|
|
361
|
+
return enum_for(:lte, key, reverse: reverse) unless block_given?
|
|
362
|
+
if reverse
|
|
363
|
+
traverse_lte_desc(@root, key, &block)
|
|
376
364
|
else
|
|
377
|
-
|
|
378
|
-
if reverse
|
|
379
|
-
traverse_lte_desc(@root, key) { |k, v| res << [k, v] }
|
|
380
|
-
else
|
|
381
|
-
traverse_lte(@root, key) { |k, v| res << [k, v] }
|
|
382
|
-
end
|
|
383
|
-
res
|
|
365
|
+
traverse_lte(@root, key, &block)
|
|
384
366
|
end
|
|
367
|
+
self
|
|
385
368
|
end
|
|
386
369
|
|
|
387
370
|
# Retrieves all key-value pairs with keys greater than the specified key.
|
|
@@ -389,28 +372,19 @@ class RBTree
|
|
|
389
372
|
# @param key [Object] the lower bound (exclusive)
|
|
390
373
|
# @param reverse [Boolean] if true, iterate in descending order (default: false)
|
|
391
374
|
# @yield [key, value] each matching key-value pair (if block given)
|
|
392
|
-
# @return [
|
|
375
|
+
# @return [Enumerator, RBTree] Enumerator if no block given, self otherwise
|
|
393
376
|
# @example
|
|
394
377
|
# tree = RBTree.new({1 => 'one', 2 => 'two', 3 => 'three', 4 => 'four'})
|
|
395
|
-
# tree.gt(2) # => [[3, "three"], [4, "four"]]
|
|
396
|
-
# tree.gt(2, reverse: true) # => [
|
|
378
|
+
# tree.gt(2).to_a # => [[3, "three"], [4, "four"]]
|
|
379
|
+
# tree.gt(2, reverse: true).first # => [4, "four"]
|
|
397
380
|
def gt(key, reverse: false, &block)
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
else
|
|
402
|
-
traverse_gt(@root, key, &block)
|
|
403
|
-
end
|
|
404
|
-
self
|
|
381
|
+
return enum_for(:gt, key, reverse: reverse) unless block_given?
|
|
382
|
+
if reverse
|
|
383
|
+
traverse_gt_desc(@root, key, &block)
|
|
405
384
|
else
|
|
406
|
-
|
|
407
|
-
if reverse
|
|
408
|
-
traverse_gt_desc(@root, key) { |k, v| res << [k, v] }
|
|
409
|
-
else
|
|
410
|
-
traverse_gt(@root, key) { |k, v| res << [k, v] }
|
|
411
|
-
end
|
|
412
|
-
res
|
|
385
|
+
traverse_gt(@root, key, &block)
|
|
413
386
|
end
|
|
387
|
+
self
|
|
414
388
|
end
|
|
415
389
|
|
|
416
390
|
# Retrieves all key-value pairs with keys greater than or equal to the specified key.
|
|
@@ -418,28 +392,19 @@ class RBTree
|
|
|
418
392
|
# @param key [Object] the lower bound (inclusive)
|
|
419
393
|
# @param reverse [Boolean] if true, iterate in descending order (default: false)
|
|
420
394
|
# @yield [key, value] each matching key-value pair (if block given)
|
|
421
|
-
# @return [
|
|
395
|
+
# @return [Enumerator, RBTree] Enumerator if no block given, self otherwise
|
|
422
396
|
# @example
|
|
423
397
|
# tree = RBTree.new({1 => 'one', 2 => 'two', 3 => 'three', 4 => 'four'})
|
|
424
|
-
# tree.gte(2) # => [[2, "two"], [3, "three"], [4, "four"]]
|
|
425
|
-
# tree.gte(2, reverse: true) # => [
|
|
398
|
+
# tree.gte(2).to_a # => [[2, "two"], [3, "three"], [4, "four"]]
|
|
399
|
+
# tree.gte(2, reverse: true).first # => [4, "four"]
|
|
426
400
|
def gte(key, reverse: false, &block)
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
else
|
|
431
|
-
traverse_gte(@root, key, &block)
|
|
432
|
-
end
|
|
433
|
-
self
|
|
401
|
+
return enum_for(:gte, key, reverse: reverse) unless block_given?
|
|
402
|
+
if reverse
|
|
403
|
+
traverse_gte_desc(@root, key, &block)
|
|
434
404
|
else
|
|
435
|
-
|
|
436
|
-
if reverse
|
|
437
|
-
traverse_gte_desc(@root, key) { |k, v| res << [k, v] }
|
|
438
|
-
else
|
|
439
|
-
traverse_gte(@root, key) { |k, v| res << [k, v] }
|
|
440
|
-
end
|
|
441
|
-
res
|
|
405
|
+
traverse_gte(@root, key, &block)
|
|
442
406
|
end
|
|
407
|
+
self
|
|
443
408
|
end
|
|
444
409
|
|
|
445
410
|
# Retrieves all key-value pairs with keys within the specified range.
|
|
@@ -450,29 +415,19 @@ class RBTree
|
|
|
450
415
|
# @param include_max [Boolean] whether to include the upper bound (default: true)
|
|
451
416
|
# @param reverse [Boolean] if true, iterate in descending order (default: false)
|
|
452
417
|
# @yield [key, value] each matching key-value pair (if block given)
|
|
453
|
-
# @return [
|
|
418
|
+
# @return [Enumerator, RBTree] Enumerator if no block given, self otherwise
|
|
454
419
|
# @example
|
|
455
420
|
# tree = RBTree.new({1 => 'one', 2 => 'two', 3 => 'three', 4 => 'four', 5 => 'five'})
|
|
456
|
-
# tree.between(2, 4) # => [[2, "two"], [3, "three"], [4, "four"]]
|
|
457
|
-
# tree.between(2, 4,
|
|
458
|
-
# tree.between(2, 4, reverse: true) # => [[4, "four"], [3, "three"], [2, "two"]]
|
|
421
|
+
# tree.between(2, 4).to_a # => [[2, "two"], [3, "three"], [4, "four"]]
|
|
422
|
+
# tree.between(2, 4, reverse: true).first # => [4, "four"]
|
|
459
423
|
def between(min, max, include_min: true, include_max: true, reverse: false, &block)
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
else
|
|
464
|
-
traverse_between(@root, min, max, include_min, include_max, &block)
|
|
465
|
-
end
|
|
466
|
-
self
|
|
424
|
+
return enum_for(:between, min, max, include_min: include_min, include_max: include_max, reverse: reverse) unless block_given?
|
|
425
|
+
if reverse
|
|
426
|
+
traverse_between_desc(@root, min, max, include_min, include_max, &block)
|
|
467
427
|
else
|
|
468
|
-
|
|
469
|
-
if reverse
|
|
470
|
-
traverse_between_desc(@root, min, max, include_min, include_max) { |k, v| res << [k, v] }
|
|
471
|
-
else
|
|
472
|
-
traverse_between(@root, min, max, include_min, include_max) { |k, v| res << [k, v] }
|
|
473
|
-
end
|
|
474
|
-
res
|
|
428
|
+
traverse_between(@root, min, max, include_min, include_max, &block)
|
|
475
429
|
end
|
|
430
|
+
self
|
|
476
431
|
end
|
|
477
432
|
|
|
478
433
|
# Returns the key-value pair with the key closest to the given key.
|