Skip to content

Commit 6f6e8ee

Browse files
committed
📚 Various SequenceSet rdoc improvements
* Links back to "Ordered and Normalized Sets". * Small updates to `*` description. * Small updates to `min`, `max`, `minmax` summary. * Added more "related" links. * Added more "Set identities" sections to set operators.
1 parent c6e2520 commit 6f6e8ee

File tree

1 file changed

+81
-27
lines changed

1 file changed

+81
-27
lines changed

lib/net/imap/sequence_set.rb

Lines changed: 81 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -108,11 +108,15 @@ class IMAP
108108
# When a set includes <tt>*</tt>, some methods may have surprising behavior.
109109
#
110110
# For example, #complement treats <tt>*</tt> as its own number. This way,
111-
# the #intersection of a set and its #complement will always be empty.
112-
# This is not how an \IMAP server interprets the set: it will convert
113-
# <tt>*</tt> to either the number of messages in the mailbox or +UIDNEXT+,
114-
# as appropriate. And there _will_ be overlap between a set and its
115-
# complement after #limit is applied to each:
111+
# the #intersection of a set and its #complement will always be empty. And
112+
# <tt>*</tt> is sorted as greater than any other number in the set. This is
113+
# not how an \IMAP server interprets the set: it will convert <tt>*</tt> to
114+
# the number of messages in the mailbox, the +UID+ of the last message in
115+
# the mailbox, or +UIDNEXT+, as appropriate. Several methods have an
116+
# argument for how <tt>*</tt> should be interpreted.
117+
#
118+
# But, for example, this means that there may be overlap between a set and
119+
# its complement after #limit is applied to each:
116120
#
117121
# ~Net::IMAP::SequenceSet["*"] == Net::IMAP::SequenceSet[1..(2**32-1)]
118122
# ~Net::IMAP::SequenceSet[1..5] == Net::IMAP::SequenceSet["6:*"]
@@ -179,9 +183,9 @@ class IMAP
179183
# - #include_star?: Returns whether the set contains <tt>*</tt>.
180184
#
181185
# <i>Minimum and maximum value elements:</i>
182-
# - #min: Returns one or more minimum numbers in the set.
183-
# - #max: Returns one or more maximum numbers in the set.
184-
# - #minmax: Returns the minimum and maximum numbers in the set.
186+
# - #min: Returns one or more of the lowest numbers in the set.
187+
# - #max: Returns one or more of the highest numbers in the set.
188+
# - #minmax: Returns the lowest and highest numbers in the set.
185189
#
186190
# <i>Accessing value by offset in sorted set:</i>
187191
# - #[] (aliased as #slice): Returns the number or consecutive subset at a
@@ -643,7 +647,14 @@ def full?; @tuples == [[1, STAR_INT]] end
643647
# Net::IMAP::SequenceSet["1:5"] | 2 | [4..6, 99]
644648
# #=> Net::IMAP::SequenceSet["1:6,99"]
645649
#
646-
# Related: #add, #merge
650+
# Related: #add, #merge, #&, #-, #^, #~
651+
#
652+
# ==== Set identities
653+
#
654+
# <tt>lhs | rhs</tt> is equivalent to:
655+
# * <tt>rhs | lhs</tt> (commutative)
656+
# * <tt>~(~lhs & ~rhs)</tt> (De Morgan's Law)
657+
# * <tt>(lhs & rhs) ^ (lhs ^ rhs)</tt>
647658
def |(other) remain_frozen dup.merge other end
648659
alias :+ :|
649660
alias union :|
@@ -662,7 +673,17 @@ def |(other) remain_frozen dup.merge other end
662673
# Net::IMAP::SequenceSet[1..5] - 2 - 4 - 6
663674
# #=> Net::IMAP::SequenceSet["1,3,5"]
664675
#
665-
# Related: #subtract
676+
# Related: #subtract, #|, #&, #^, #~
677+
#
678+
# ==== Set identities
679+
#
680+
# <tt>lhs - rhs</tt> is equivalent to:
681+
# * <tt>~r - ~l</tt>
682+
# * <tt>lhs & ~rhs</tt>
683+
# * <tt>~(~lhs | rhs)</tt>
684+
# * <tt>lhs & (lhs ^ rhs)</tt>
685+
# * <tt>lhs ^ (lhs & rhs)</tt>
686+
# * <tt>rhs ^ (lhs | rhs)</tt>
666687
def -(other) remain_frozen dup.subtract other end
667688
alias difference :-
668689

@@ -680,7 +701,17 @@ def -(other) remain_frozen dup.subtract other end
680701
# Net::IMAP::SequenceSet[1..5] & [2, 4, 6]
681702
# #=> Net::IMAP::SequenceSet["2,4"]
682703
#
683-
# <tt>(seqset & other)</tt> is equivalent to <tt>(seqset - ~other)</tt>.
704+
# Related: #intersect?, #|, #-, #^, #~
705+
#
706+
# ==== Set identities
707+
#
708+
# <tt>lhs & rhs</tt> is equivalent to:
709+
# * <tt>rhs & lhs</tt> (commutative)
710+
# * <tt>~(~lhs | ~rhs)</tt> (De Morgan's Law)
711+
# * <tt>lhs - ~rhs</tt>
712+
# * <tt>lhs - (lhs - rhs)</tt>
713+
# * <tt>lhs - (lhs ^ rhs)</tt>
714+
# * <tt>lhs ^ (lhs - rhs)</tt>
684715
def &(other)
685716
remain_frozen dup.subtract SequenceSet.new(other).complement!
686717
end
@@ -700,8 +731,16 @@ def &(other)
700731
# Net::IMAP::SequenceSet[1..5] ^ [2, 4, 6]
701732
# #=> Net::IMAP::SequenceSet["1,3,5:6"]
702733
#
703-
# <tt>(seqset ^ other)</tt> is equivalent to <tt>((seqset | other) -
704-
# (seqset & other))</tt>.
734+
# Related: #|, #&, #-, #~
735+
#
736+
# ==== Set identities
737+
#
738+
# <tt>lhs ^ rhs</tt> is equivalent to:
739+
# * <tt>rhs ^ lhs</tt> (commutative)
740+
# * <tt>~lhs ^ ~rhs</tt>
741+
# * <tt>(lhs | rhs) - (lhs & rhs)</tt>
742+
# * <tt>(lhs - rhs) | (rhs - lhs)</tt>
743+
# * <tt>(lhs ^ other) ^ (other ^ rhs)</tt>
705744
def ^(other) remain_frozen (dup | other).subtract(self & other) end
706745
alias xor :^
707746

@@ -719,7 +758,12 @@ def ^(other) remain_frozen (dup | other).subtract(self & other) end
719758
# ~Net::IMAP::SequenceSet["6:99,223:*"]
720759
# #=> Net::IMAP::SequenceSet["1:5,100:222"]
721760
#
722-
# Related: #complement!
761+
# Related: #complement!, #|, #&, #-, #^
762+
#
763+
# ==== Set identities
764+
#
765+
# <tt>~set</tt> is equivalent to:
766+
# * <tt>full - set</tt>, where "full" is Net::IMAP::SequenceSet.full
723767
def ~; remain_frozen dup.complement! end
724768
alias complement :~
725769

@@ -731,7 +775,10 @@ def ~; remain_frozen dup.complement! end
731775
#
732776
# #string will be regenerated. Use #merge to add many elements at once.
733777
#
734-
# Related: #add?, #merge, #union
778+
# Use #append to append new elements to #string. See
779+
# Net::IMAP@Ordered+and+Normalized+Sets.
780+
#
781+
# Related: #add?, #merge, #union, #append
735782
def add(element)
736783
tuple_add input_to_tuple element
737784
normalize!
@@ -742,6 +789,10 @@ def add(element)
742789
#
743790
# Unlike #add, #merge, or #union, the new value is appended to #string.
744791
# This may result in a #string which has duplicates or is out-of-order.
792+
#
793+
# See Net::IMAP@Ordered+and+Normalized+Sets.
794+
#
795+
# Related: #add, #merge, #union
745796
def append(entry)
746797
modifying!
747798
tuple = input_to_tuple entry
@@ -890,21 +941,21 @@ def subtract(*sets)
890941
# This is useful when the given order is significant, for example in a
891942
# ESEARCH response to IMAP#sort.
892943
#
944+
# See Net::IMAP@Ordered+and+Normalized+Sets.
945+
#
893946
# Related: #each_entry, #elements
894947
def entries; each_entry.to_a end
895948

896949
# Returns an array of ranges and integers and <tt>:*</tt>.
897950
#
898951
# The returned elements are sorted and coalesced, even when the input
899-
# #string is not. <tt>*</tt> will sort last. See #normalize.
952+
# #string is not. <tt>*</tt> will sort last. See #normalize,
953+
# Net::IMAP@Ordered+and+Normalized+Sets.
900954
#
901955
# By itself, <tt>*</tt> translates to <tt>:*</tt>. A range containing
902956
# <tt>*</tt> translates to an endless range. Use #limit to translate both
903957
# cases to a maximum value.
904958
#
905-
# The returned elements will be sorted and coalesced, even when the input
906-
# #string is not. <tt>*</tt> will sort last. See #normalize.
907-
#
908959
# Net::IMAP::SequenceSet["2,5:9,6,*,12:11"].elements
909960
# #=> [2, 5..9, 11..12, :*]
910961
#
@@ -915,15 +966,13 @@ def elements; each_element.to_a end
915966
# Returns an array of ranges
916967
#
917968
# The returned elements are sorted and coalesced, even when the input
918-
# #string is not. <tt>*</tt> will sort last. See #normalize.
969+
# #string is not. <tt>*</tt> will sort last. See #normalize,
970+
# Net::IMAP@Ordered+and+Normalized+Sets.
919971
#
920972
# <tt>*</tt> translates to an endless range. By itself, <tt>*</tt>
921973
# translates to <tt>:*..</tt>. Use #limit to set <tt>*</tt> to a maximum
922974
# value.
923975
#
924-
# The returned ranges will be sorted and coalesced, even when the input
925-
# #string is not. <tt>*</tt> will sort last. See #normalize.
926-
#
927976
# Net::IMAP::SequenceSet["2,5:9,6,*,12:11"].ranges
928977
# #=> [2..2, 5..9, 11..12, :*..]
929978
# Net::IMAP::SequenceSet["123,999:*,456:789"].ranges
@@ -935,7 +984,7 @@ def ranges; each_range.to_a end
935984
# Returns a sorted array of all of the number values in the sequence set.
936985
#
937986
# The returned numbers are sorted and de-duplicated, even when the input
938-
# #string is not. See #normalize.
987+
# #string is not. See #normalize, Net::IMAP@Ordered+and+Normalized+Sets.
939988
#
940989
# Net::IMAP::SequenceSet["2,5:9,6,12:11"].numbers
941990
# #=> [2, 5, 6, 7, 8, 9, 11, 12]
@@ -967,6 +1016,8 @@ def numbers; each_number.to_a end
9671016
# no sorting, deduplication, or coalescing. When #string is in its
9681017
# normalized form, this will yield the same values as #each_element.
9691018
#
1019+
# See Net::IMAP@Ordered+and+Normalized+Sets.
1020+
#
9701021
# Related: #entries, #each_element
9711022
def each_entry(&block) # :yields: integer or range or :*
9721023
return to_enum(__method__) unless block_given?
@@ -977,7 +1028,7 @@ def each_entry(&block) # :yields: integer or range or :*
9771028
# and returns self. Returns an enumerator when called without a block.
9781029
#
9791030
# The returned numbers are sorted and de-duplicated, even when the input
980-
# #string is not. See #normalize.
1031+
# #string is not. See #normalize, Net::IMAP@Ordered+and+Normalized+Sets.
9811032
#
9821033
# Related: #elements, #each_entry
9831034
def each_element # :yields: integer or range or :*
@@ -1400,6 +1451,7 @@ def complement!
14001451
#
14011452
# The returned set's #string is sorted and deduplicated. Adjacent or
14021453
# overlapping elements will be merged into a single larger range.
1454+
# See Net::IMAP@Ordered+and+Normalized+Sets.
14031455
#
14041456
# Net::IMAP::SequenceSet["1:5,3:7,10:9,10:11"].normalize
14051457
# #=> Net::IMAP::SequenceSet["1:7,9:11"]
@@ -1412,7 +1464,7 @@ def normalize
14121464
end
14131465

14141466
# Resets #string to be sorted, deduplicated, and coalesced. Returns
1415-
# +self+.
1467+
# +self+. See Net::IMAP@Ordered+and+Normalized+Sets.
14161468
#
14171469
# Related: #normalize, #normalized_string
14181470
def normalize!
@@ -1422,11 +1474,13 @@ def normalize!
14221474

14231475
# Returns a normalized +sequence-set+ string representation, sorted
14241476
# and deduplicated. Adjacent or overlapping elements will be merged into
1425-
# a single larger range. Returns +nil+ when the set is empty.
1477+
# a single larger range. See Net::IMAP@Ordered+and+Normalized+Sets.
14261478
#
14271479
# Net::IMAP::SequenceSet["1:5,3:7,10:9,10:11"].normalized_string
14281480
# #=> "1:7,9:11"
14291481
#
1482+
# Returns +nil+ when the set is empty.
1483+
#
14301484
# Related: #normalize!, #normalize
14311485
def normalized_string
14321486
@tuples.empty? ? nil : -@tuples.map { tuple_to_str _1 }.join(",")

0 commit comments

Comments
 (0)