#626: intbitset: harmonise pop() behaviour
-------------------------+-----------------
 Reporter:  simko        |      Owner:
     Type:  enhancement  |     Status:  new
 Priority:  minor        |  Milestone:
Component:  MiscUtil     |    Version:
 Keywords:               |
-------------------------+-----------------
 As mentioned in ticket:621, we may want to improve a little bit the
 description and/or behaviour of intbitset's `pop()`.  Notably, people
 may be using search engine's API functions returning intbitsets that
 look like lists.  Here, `pop()` has ordered meaning for lists, while
 for sets it pops any random element:

 {{{
 In [2]: from invenio.intbitset import intbitset

 In [3]: l = [1, 10, 2, 20]

 In [4]: s = set(l)

 In [5]: i = intbitset(l)

 In [6]: l, s, i
 Out[6]: ([1, 10, 2, 20], set([1, 10, 20, 2]), intbitset([1, 2, 10, 20]))

 In [7]: xl, xs, xi = l.pop(), s.pop(), i.pop()

 In [8]: l, s, i
 Out[8]: ([1, 10, 2], set([10, 20, 2]), intbitset([2, 10, 20]))

 In [9]: xl, xs, xi
 Out[9]: (20, 1, 1)
 }}}

 The difference between lists and intbitsets is strictly taken OK,
 because intbitsets emulate the API of sets, so `pop()` removes an
 arbitrary set element.  However, behind the scenes intbitset's `pop()`
 calls `intBitSetGetNext()` that does an ordered removal, not an
 "arbitrary" removal; so we can document this better for end users.

 More to the point, intbitset has a native notion of element order,
 being a set of increasing integers; it does resemble ordered lists of
 integers in this respect.  intbitset can be considered as a kind of
 ordered set of increasing integers that emulates set API, so having
 some facets of lists and some facets of sets, as it were.

 Therefore we may want to improve the docstring of intbitset's `pop()`
 in order to reflect this mixed nature of intbitsets: (i) at least by
 documenting the non-arbitrary parts, but (ii) more to the point, we
 may want to alter perhaps the meaning of what `pop()` returns, so that
 intbitset would resemble lists more (i.e. returning last, not first
 element).  It will still be an "arbitrary" removal from the set API
 point of view, but it will resemble more to what people may be used to
 from the list API point of view, if they think of intbitsets as of
 lists of increasing integers.

 P.S. Not thinking here about list-specific calls like `pop(n)`.

-- 
Ticket URL: <https://invenio-software.org/ticket/626>
Invenio <http://invenio-software.org>

Reply via email to