mirror of
https://github.com/XRPLF/rippled.git
synced 2025-11-04 19:25:51 +00:00
* Retrieve and process summary or full ledgers. * Search using arbitrary criteria (any Python function). * Search using arbitrary formats (any Python function). * Caches ledgers as .gz files to avoid repeated server requests. * Handles ledger numbers, ranges, and special names like validated or closed.
47 lines
1.3 KiB
Python
47 lines
1.3 KiB
Python
from __future__ import absolute_import, division, print_function, unicode_literals
|
|
|
|
FIRST, LAST = range(2)
|
|
|
|
def binary_search(begin, end, condition, location=FIRST):
|
|
"""Search for an i in the interval [begin, end] where condition(i) is true.
|
|
If location is FIRST, return the first such i.
|
|
If location is LAST, return the last such i.
|
|
If there is no such i, then throw an exception.
|
|
"""
|
|
b = condition(begin)
|
|
e = condition(end)
|
|
if b and e:
|
|
return begin if location == FIRST else end
|
|
|
|
if not (b or e):
|
|
raise ValueError('%d/%d' % (begin, end))
|
|
|
|
if b and location is FIRST:
|
|
return begin
|
|
|
|
if e and location is LAST:
|
|
return end
|
|
|
|
width = end - begin + 1
|
|
if width == 1:
|
|
if not b:
|
|
raise ValueError('%d/%d' % (begin, end))
|
|
return begin
|
|
if width == 2:
|
|
return begin if b else end
|
|
|
|
mid = (begin + end) // 2
|
|
m = condition(mid)
|
|
|
|
if m == b:
|
|
return binary_search(mid, end, condition, location)
|
|
else:
|
|
return binary_search(begin, mid, condition, location)
|
|
|
|
def linear_search(items, condition):
|
|
"""Yields each i in the interval [begin, end] where condition(i) is true.
|
|
"""
|
|
for i in items:
|
|
if condition(i):
|
|
yield i
|