content: import Data.Array (Array, Ix, (!), listArray, bounds)
  
  -- BINARY SEARCH --------------------------------------------------------------
  bSearch
    :: Integral a
    => (a -> Ordering) -> (a, a) -> Maybe a
  bSearch p (low, high)
    | high < low = Nothing
    | otherwise =
      let mid = (low + high) `div` 2
      in case p mid of
           LT -> bSearch p (low, mid - 1)
           GT -> bSearch p (mid + 1, high)
           EQ -> Just mid
  
  -- Application to an array:
  bSearchArray
    :: (Ix i, Integral i, Ord e)
    => Array i e -> e -> Maybe i
  bSearchArray a x = bSearch (compare x . (a !)) (bounds a)
  
  -- TEST -----------------------------------------------------------------------
  axs
    :: (Num i, Ix i)
    => Array i String
  axs =
    listArray
      (0, 11)
      [ "alpha"
      , "beta"
      , "delta"
      , "epsilon"
      , "eta"
      , "gamma"
      , "iota"
      , "kappa"
      , "lambda"
      , "mu"
      , "theta"
      , "zeta"
      ]
  
  main :: IO ()
  main =
    let e = "mu"
        found = bSearchArray axs e
    in putStrLn $
       '\'' :
       e ++
       case found of
         Nothing -> "' Not found"
         Just x -> "' found at index " ++ show x
  