pub fn binary_search<X, A, B, F>(
    low: (X, A),
    high: (X, B),
    f: F
) -> ((X, A), (X, B))where
    X: Betweenable,
    F: Fn(X) -> Direction<A, B>,