import display

# Binary search function

def binarySearch( value, arr ):
    # search range is [low..high], in other words, arr[low:high-1]

    # start search with the max possible range
    low = 0
    high = len(arr)-1

    # Start info:
    print( 'Search for:', value )
    display.display3( arr, low, high+1 )

    while low < high:    # while length of search range is at least 2

        # middle position in the search range
        mid = (low + high) // 2

        # limit search range to only the left or only the right half
        # of the search range:
        if arr[mid] < value: low  = mid+1
        else:                high = mid
        display.display3( arr, low, high+1 )

        # end of while

    # now search range contains just one item, check it:
    if arr[low] == value:
       return low           # found or
    return -1               # not found



def indexOfClosestBiggerValueTo( value, arr ):
    # search range is [low..high], in other words, arr[low:high-1]

    # start search with the max possible range
    low = 0
    high = len(arr)-1

    while low < high:    # while length of search range is at least 2

        # middle position in the search range
        mid = (low + high) // 2

        # limit search range to only the left or only the right half
        # of the search range:
        if arr[mid] <= value: low  = mid+1  # CHANGE: '<=' cut off the unpromissing left part
        else:                 high = mid

        # end of while

    # now search range contains just one item, check it:
    if arr[low] > value:                   # CHANGE: '>' accept only a bigger value
       return low           # found or
    return -1               # not found




# ----------------- END OF MODULE ----------------------------------------------


# ==============================================================================
# anything to run when NOT used as a library module

if __name__ == '__main__':
    a = [ 2, 2, 4, 6, 7, 10, 11, 11, 11, 12, 12, 14, 20, 20 ]
    # a = [ 2, 2, 4, 6, 7, 10, 11, 11, 11, 12, 12, 14, 20, 20, 23, 24, 26, 29, 31, 31, 31, 64, 69, 70, 71, 73, 73, 74 ]
    # success
    display.cellWidth = 6
    print( binarySearch ( 2, a ) )
    print( binarySearch ( 4, a ) )
    print( binarySearch ( 10, a ) )
    print( binarySearch ( 20, a ) )
    # fail
    print( binarySearch ( -1, a ) )
    print( binarySearch ( 3, a ) )
    print( binarySearch ( 13, a ) )
    print( binarySearch ( 21, a ) )


    # success
    print()
    print(a)
    for x in range( -1, a[-1] ):
        indexOfx = indexOfClosestBiggerValueTo( x, a )
        print( "value", x, " closest bigger value is'", a[indexOfx], "at index",  indexOfx )
    # fail
    print( indexOfClosestBiggerValueTo ( 20, a ) )
    print( indexOfClosestBiggerValueTo ( 21, a ) )
    print( indexOfClosestBiggerValueTo ( 33, a ) )





