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]