binsearch :: (a -> Ordering) -> [a] -> Maybe a
binsearch cmp [] = Nothing
binsearch cmp list = case cmp (list !! i) of
LT -> binsearch cmp (take i list)
EQ -> Just (list !! i)
GT -> binsearch cmp (drop (i+1) list)
where i = length list `div` 2
binsearchIndex :: (a -> Ordering) -> [a] -> Maybe Int
binsearchIndex cmp [] = Nothing
binsearchIndex cmp list = case cmp (list !! i) of
LT -> binsearchIndex cmp (take i list)
EQ -> Just i
GT -> i + 1 + binsearchIndex cmp (drop (i+1) list)
where i = length list `div` 2