{-# LANGUAGE DeriveDataTypeable #-}

module Hoogle.DataBase.Type(module Hoogle.DataBase.Type, module X) where

import Hoogle.DataBase.Items           as X
import Hoogle.DataBase.Suggest         as X
import Hoogle.DataBase.Aliases         as X
import Hoogle.DataBase.Instances       as X
import Hoogle.DataBase.SubstrSearch    as X
import Hoogle.DataBase.TypeSearch.All  as X
import Hoogle.Store.All
import Hoogle.Type.All
import General.Base


-- suggest, aliases and instances are used for linking with packages
-- that depend on this database
data DataBase = DataBase
    {items :: Items
    ,nameSearch :: SubstrSearch (Once Entry)
    ,typeSearch :: TypeSearch
    ,suggest :: Suggest
    ,aliases :: Aliases
    ,instances :: Instances
    }
    deriving Typeable

instance NFData DataBase where
    rnf (DataBase a b c d e f) = rnf (a,b,c,d,e,f)

instance Store DataBase where
    put (DataBase a b c d e f) = put6 a b c d e f
    get = get6 DataBase


instance Show DataBase where
    show = concatMap snd . showDataBaseParts


showDataBaseParts :: DataBase -> [(String,String)]
showDataBaseParts (DataBase a b c d e f) =
    let name * val = (name, "= " ++ name ++ " =\n\n" ++ show val ++ "\n") in
    ["Items" * a,"NameSearch" * b, "TypeSearch" * c
    ,"Suggest" * d, "Aliases" * e, "Instances" * f]


showDataBase :: String -> DataBase -> String
showDataBase "" d = show d
showDataBase x d | null r = "Error: Unknown database part, " ++ x
                 | length r > 1 = "Error: Ambiguous database part, " ++ x
                 | otherwise = head r
    where r = [b | (a,b) <- showDataBaseParts d, lower x `isPrefixOf` lower a]