-- | Pure counterpart for binary search.

module Numeric.Search.Combinator.Pure
       (
         -- * Evidence
         M.Evidence(..),
         -- * Search Range
         M.Range,
         M.InitializesSearch,
         -- * Splitters
         M.splitForever, M.splitTill,

         -- * Search
         search,
         -- * Postprocess
         M.smallest, M.largest
       )where

import           Data.Functor.Identity
import qualified Numeric.Search.Combinator.Monadic as M


-- | Perform search over pure predicates. The monadic version of this is 'M.searchM' .
search :: (M.InitializesSearch a init, Eq b) =>
           init -> M.Splitter a -> (a -> b) -> [M.Range b a]
search init0 split0 pred0 = runIdentity $ M.searchM init0 split0 (Identity . pred0)