@@ -560,6 +560,14 @@ def up_to(item, &block)
560
560
end
561
561
end
562
562
563
+ def between ( from , to , &block )
564
+ if block_given?
565
+ @node . each_between ( from , to , @comparator , &block )
566
+ else
567
+ self . class . alloc ( @node . between ( from , to , @comparator ) , @comparator )
568
+ end
569
+ end
570
+
563
571
# Return a randomly chosen item from this set. If the set is empty, return `nil`.
564
572
#
565
573
# @return [Object]
@@ -778,6 +786,18 @@ def suffix(item, comparator, inclusive)
778
786
end
779
787
end
780
788
789
+ def between ( from , to , comparator )
790
+ if direction ( from , comparator ) > 0 # all on the right
791
+ @right . between ( from , to , comparator )
792
+ elsif direction ( to , comparator ) < 0 # all on the left
793
+ @left . between ( from , to , comparator )
794
+ else
795
+ left = @left . suffix ( from , comparator , true )
796
+ right = @right . prefix ( to , comparator , true )
797
+ rebalance ( left , right )
798
+ end
799
+ end
800
+
781
801
def each_less ( item , comparator , inclusive , &block )
782
802
dir = direction ( item , comparator )
783
803
if dir > 0 || ( inclusive && dir == 0 )
@@ -800,6 +820,18 @@ def each_greater(item, comparator, inclusive, &block)
800
820
end
801
821
end
802
822
823
+ def each_between ( from , to , comparator , &block )
824
+ if direction ( from , comparator ) > 0 # all on the right
825
+ @right . each_between ( from , to , comparator , &block )
826
+ elsif direction ( to , comparator ) < 0 # all on the left
827
+ @left . each_between ( from , to , comparator , &block )
828
+ else
829
+ @left . each_greater ( from , comparator , true , &block )
830
+ yield @item
831
+ @right . each_less ( to , comparator , true , &block )
832
+ end
833
+ end
834
+
803
835
def each ( &block )
804
836
@left . each ( &block )
805
837
yield @item
@@ -942,8 +974,10 @@ def e.delete(item, comparator); self; end
942
974
def e . include? ( item , comparator ) ; false ; end
943
975
def e . prefix ( item , comparator , inclusive ) ; self ; end
944
976
def e . suffix ( item , comparator , inclusive ) ; self ; end
977
+ def e . between ( from , to , comparator ) ; self ; end
945
978
def e . each_greater ( item , comparator , inclusive ) ; end
946
979
def e . each_less ( item , comparator , inclusive ) ; end
980
+ def e . each_between ( item , comparator , inclusive ) ; end
947
981
def e . empty? ; true ; end
948
982
def e . slice ( from , length ) ; self ; end
949
983
end . freeze
0 commit comments