content: module Unused.TermSearch
      ( SearchResults(..)
      , SearchBackend(..)
      , SearchTerm
      , search
      ) where
  
  import qualified Data.Maybe as M
  import GHC.IO.Exception (ExitCode(ExitSuccess))
  import qualified System.Process as P
  import Unused.TermSearch.Internal
         (commandLineOptions, parseSearchResult)
  import Unused.TermSearch.Types
         (SearchBackend(..), SearchResults(..))
  import Unused.Types (SearchTerm, searchTermToString)
  
  search :: SearchBackend -> SearchTerm -> IO SearchResults
  search backend t =
      SearchResults . M.mapMaybe (parseSearchResult backend t) <$>
      (lines <$> performSearch backend (searchTermToString t))
  
  performSearch :: SearchBackend -> String -> IO String
  performSearch b t = extractSearchResults b <$> searchOutcome
    where
      searchOutcome = P.readProcessWithExitCode (backendToCommand b) (commandLineOptions b t) ""
      backendToCommand Rg = "rg"
      backendToCommand Ag = "ag"
  
  extractSearchResults :: SearchBackend -> (ExitCode, String, String) -> String
  extractSearchResults Rg (ExitSuccess, stdout, _) = stdout
  extractSearchResults Rg (_, _, stderr) = stderr
  extractSearchResults Ag (_, stdout, _) = stdout
  