    module Hoogle.Search.All(search) where

    import Data.List (sortBy)
    import Data.Maybe
    import Data.Ord (comparing)
    import Hoogle.DataBase.All
    import Hoogle.Query.All
    import Hoogle.Search.Results
    import Hoogle.Type.All
    import Hoogle.Store.All

    -- return all the results, lazily
    search :: [DataBase] -> Query -> [Result]
    search databases query = getResults query databases

    getResults :: Query -> [DataBase] -> [Result]
    getResults query = sortBy ((if invertResults query then flip else id)
                               $ comparing resultScore) .
                       mergeDataBaseResults . map (mergeQueryResults query . f)
        where
            f d = [ typeSearch d q
                  | Just q <- [typeSig query], isNothing (exactSearch query) ] ++
                  map (nameSearch d (exactSearch query)) (names query)

    nameSearch :: DataBase -> Maybe ItemKind -> String -> [Result]
    nameSearch db kind query =
        [ Result (fromOnce e) [v] s
        | (e,v,s) <- (maybe searchName searchExactName kind) db query ]

    typeSearch :: DataBase -> TypeSig -> [Result]
    typeSearch db query = [Result (fromOnce e) v s
                          | (e,v,s) <- searchType db query]