module HaskellWorks.Data.Search
    ( binarySearch
    ) where

binarySearch :: (Ord a, Integral n) => a -> (n -> a) -> n -> n -> n
binarySearch w f p q = if p + 1 >= q
  then p
  else let m = p + q `div` 2 in
    if w <= f m
      then binarySearch w f p m
      else binarySearch w f m q
{-# INLINABLE binarySearch #-}