    -- | High level Hoogle API
    module Hoogle(
        Database, withDatabase, searchDatabase, defaultDatabaseLocation,
        Target(..), URL,
        hoogle,
        targetInfo,
        targetResultDisplay
        ) where

    import Control.DeepSeq (NFData)

    import Query
    import Input.Item
    import General.Util
    import General.Store

    import Action.CmdLine
    import Action.Generate
    import Action.Search
    import Action.Server
    import Action.Test

    -- | Database containing Hoogle search data.
    newtype Database = Database StoreRead

    -- | Load a database from a file.
    withDatabase :: NFData a => FilePath -> (Database -> IO a) -> IO a
    withDatabase file act = storeReadFile file $ act . Database

    -- | The default location of a database
    defaultDatabaseLocation :: IO FilePath
    defaultDatabaseLocation = defaultDatabaseLang Haskell

    -- | Search a database, given a query string, produces a list of results.
    searchDatabase :: Database -> String -> [Target]
    searchDatabase (Database db) query = snd $ search db $ parseQuery query

    -- | Run a command line Hoogle operation.
    hoogle :: [String] -> IO ()
    hoogle args = do
        args <- getCmdLine args
        case args of
            Search{} -> actionSearch args
            Generate{} -> actionGenerate args
            Server{} -> actionServer args
            Test{} -> actionTest args
            Replay{} -> actionReplay args