module Hoogle.DataBase.Items(Items, createItems, entriesItems) where
import Data.Binary.Defer.Index
import General.Base
import General.Util
import General.Web
import Hoogle.Type.All
import qualified Data.Map as Map
import Data.Binary.Defer hiding (get,put)
import qualified Data.Binary.Defer as D
newtype Items = Items (Index Entry)
entriesItems :: Items -> [Link Entry]
entriesItems (Items x) = indexLinks x
instance BinaryDefer Items where
put (Items a) = put1 a
get = get1 Items
instance Show Items where
show (Items x) = "== Entries ==\n\n" ++ show x
instance Monoid Items where
mempty = mergeItems []
mappend x y = mergeItems [x,y]
mconcat = mergeItems
createItems :: [TextItem] -> Items
createItems xs = mergeItems [Items $ newIndex $ fs Nothing Nothing $ zip [0..] xs]
where
fs pkg mod [] = []
fs pkg mod ((i,x):xs) = r : fs pkg2 mod2 xs
where r = f pkg2 mod2 x
pkg2 = if itemLevel x == 0 then Just $ newLink i r else pkg
mod2 = if itemLevel x == 1 then Just $ newLink i r else mod
f pkg mod TextItem{..} = Entry pkg mod itemName itemDisp
(htmlDocumentation itemDocs) url itemPriority itemKey itemType
where url | Just pkg <- pkg, itemLevel == 1 || (itemLevel > 1 && isNothing mod) = entryURL (fromLink pkg) `combineURL` itemURL
| Just mod <- mod, itemLevel > 1 = entryURL (fromLink mod) `combineURL` itemURL
| otherwise = itemURL
mergeItems :: [Items] -> Items
mergeItems xs = Items $ newIndex $ map ren ijv
where
mp = Map.fromList [(ij, newLink n v) | (n,(ij,v)) <- zip [0..] ijv]
ijv = sortOn (entryScore . snd) [((i,linkKey jv),fromLink jv) | (i,Items vs) <- zip [0..] xs, jv <- indexLinks vs]
ren (ij,v) = v{entryPackage = f ij $ entryPackage v, entryModule = f ij $ entryModule v}
f _ Nothing = Nothing
f (i,j) (Just e) = Just $ mp Map.! (i,linkKey e)