-- TODO: Aliases and Instances from imported packages should be
-- used when searching.

module Hoogle.DataBase.TypeSearch.All(
    createTypeSearch, TypeSearch,
    searchTypeSearch, TypeScore
    ) where

import Hoogle.DataBase.TypeSearch.Graphs
import Hoogle.DataBase.TypeSearch.TypeScore
import Hoogle.DataBase.Instances
import Hoogle.DataBase.Aliases
import Data.Binary.Defer
import Data.Binary.Defer.Index
import Hoogle.TextBase.All
import Hoogle.TypeSig.All
import Hoogle.Item.All


newtype TypeSearch = TypeSearch Graphs

instance Show TypeSearch where
    show (TypeSearch x) = show x

instance BinaryDefer TypeSearch where
    put (TypeSearch x) = put x
    get = get1 TypeSearch


---------------------------------------------------------------------
-- CREATION

createTypeSearch :: Aliases -> Instances -> [Link Entry] -> TypeSearch
createTypeSearch aliases instances xs = TypeSearch $ newGraphs aliases instances types
    where types = [(x, fromDefer sig) | x <- xs, Just sig <- [entryTypesig $ fromLink x]]


---------------------------------------------------------------------
-- SEARCHING

searchTypeSearch :: Aliases -> Instances -> TypeSearch -> TypeSig -> [(Link Entry,[EntryView],TypeScore)]
searchTypeSearch as is (TypeSearch g) t =
    [(a, b, c) | (a,b,c) <- graphsSearch as is g t]