Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

✨ Improve SequenceSet with Set, Range, Enumerable methods #239

Merged
merged 1 commit into from
Dec 11, 2023

Commits on Dec 11, 2023

  1. ✨ Add Set/Range/Enum/etc methods to SequenceSet

    The version of SequenceSet in net-imap prior to this commit was merely a
    placeholder, needed in order to complete `tagged-ext` for ruby#225.
    
    This updates it with a full API, inspired by Set, Range, and Array.
    This allows it to be more broadly useful, e.g. for storing and working
    with mailbox state.
    
    In addition to Integer, Range, and enumerables, any object with
    `#to_sequence_set` can now be used to create a sequence set.  For
    compatibility with MessageSet, `ThreadMember#to_sequence_set` collects
    all child seqno into a SequenceSet.
    
    Because mailbox state can be _very_ large, inputs are stored in an
    internal sorted array of ranges.  These are stored as `[start, stop]`
    tuples, not Range objects, for simpler manipulation.  A future
    optimization could convert all tuples to a flat one-dimensional Array
    (to reduce object allocations).  Storing the data in sorted range tuples
    allows many of the important operations to be `O(lg n)`.
    
    Although updates do use `Array#insert` and `Array#slice!`—which are
    technically `O(n)`—they tend to be fast until the number of elements is
    very large.  Count and index-based methods are also `O(n)`.  A future
    optimization could cache the count and compose larger sets from a sorted
    tree of smaller sets, to preserve `O(lg n)` for most operations.
    
    SequenceSet can be used to replace MessageSet (which is used internally
    to validate, format, and send certain command args).  Some notable
    differences between the two:
    * Most validation is done up-front, when initializing or adding values.
    * A ThreadMember to `sequence-set` bug has been fixed.
    * The generated string is sorted and adjacent ranges are combined.
    
    TODO in future PRs:
    * #index_lte => get the index of a number in the set, or if the number
      isn't in the set, the number before it.
    * Replace or supplement the UID set implementation in UIDPlusData.
    * fully replace MessageSet (probably not before v0.5.0)
    nevans committed Dec 11, 2023
    Configuration menu
    Copy the full SHA
    23b2a7d View commit details
    Browse the repository at this point in the history