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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8aa1d883925f6b7f608108f1f916598aa04be013aee415c06dfc7bda35d6986c
4
- data.tar.gz: e935f213100c933b42a3cf0d709809d5ca8d536db56d6e27a6b3de9681847ad9
3
+ metadata.gz: ad4ff4e15079d2034a111e0180f1abbf5f433283de5c125f45569f9b69f558fc
4
+ data.tar.gz: 7355e1ae3964e79aa8d110c52e38672641c8d67ac1cb4cfbbd974fe6298f07f7
5
5
  SHA512:
6
- metadata.gz: 419f0270137b6a6ae39bd73d5ea0c4cc25ff0769c288619ee795d172e724040c6032c09c952745b9bb871ff082861c00ae879fa6a98a571414bad87c2534cb9a
7
- data.tar.gz: e403cc18d16ff9661a341fb326b3aadebc5d1a83b69ed03395b318cf6666d8de9dca24e88da2a9c231395aa7780ce57ed89902717ad1266bd1551e384872719f
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
@@ -2,5 +2,5 @@
2
2
 
3
3
  class RBTree
4
4
  # The version of the rbtree-ruby gem
5
- VERSION = "0.1.7"
5
+ VERSION = "0.1.8"
6
6
  end
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 [Array<Array(Object, Object)>, RBTree] array of [key, value] pairs if no block, self otherwise
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) # => [[2, "two"], [1, "one"]]
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
- if block_given?
341
- if reverse
342
- traverse_lt_desc(@root, key, &block)
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
- res = []
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 [Array<Array(Object, Object)>, RBTree] array of [key, value] pairs if no block, self otherwise
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) # => [[3, "three"], [2, "two"], [1, "one"]]
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
- if block_given?
370
- if reverse
371
- traverse_lte_desc(@root, key, &block)
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
- res = []
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 [Array<Array(Object, Object)>, RBTree] array of [key, value] pairs if no block, self otherwise
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) # => [[4, "four"], [3, "three"]]
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
- if block_given?
399
- if reverse
400
- traverse_gt_desc(@root, key, &block)
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
- res = []
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 [Array<Array(Object, Object)>, RBTree] array of [key, value] pairs if no block, self otherwise
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) # => [[4, "four"], [3, "three"], [2, "two"]]
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
- if block_given?
428
- if reverse
429
- traverse_gte_desc(@root, key, &block)
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
- res = []
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 [Array<Array(Object, Object)>, RBTree] array of [key, value] pairs if no block, self otherwise
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, include_min: false) # => [[3, "three"], [4, "four"]]
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
- if block_given?
461
- if reverse
462
- traverse_between_desc(@root, min, max, include_min, include_max, &block)
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
- res = []
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.
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rbtree-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.7
4
+ version: 0.1.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Masahito Suzuki