# binary_search.py
"""Module to test out binary search code from CS1110 Lecture 21"""

def bin_search(b, h, k, v):
    """(see previous)"""
    i = h; j = k+1
    # inv: b[h..i-1] < v, b[j..k] >=v, i <= j
    while i < j:
        mid = (i + j)/2
        if b[mid] < v:
            i = mid + 1  # may skip vast section of b
        else: 
            j = mid      # may skip vast section of b
    return i if i <= k and b[i] == v else -1
    # post: b[n] = v and v not in b[h..n-1], or, n = -1 and v not in b[h..k]

if __name__ == '__main__':
    x = [1,3,5,6,6,8,9]
    assert bin_search(x, 0, 6, 5) == 2
    assert bin_search(x, 0, 6, 1) == 0
    assert bin_search(x, 0, 6, 9) == 6
    assert bin_search(x, 0, 6, 6) == 3
    assert bin_search(x, 0, 6, -1) == -1
    assert bin_search(x, 0, 6, 7) == -1
    assert bin_search(x, 0, 6, 10) == -1
    assert bin_search(x, 4, 3, 6) == -1