packages feed

hoogle-4.1: src/Recipe/General.hs

module Recipe.General(convert, combine) where

import Recipe.Type
import Hoogle
import General.Base
import General.System
import System.Console.CmdArgs.Verbosity


-- convert a single database
convert :: ([Name] -> IO ()) -> Name -> IO ()
convert make x = do
    b <- doesFileExist $ x <.> "txt"
    if not b then
        putError $ "Error: " ++ x ++ " couldn't be converted, no input file found"
     else do
        (deps,src) <- readInput x
        make deps
        let deps2 = map hoo deps
        deps3 <- filterM doesFileExist deps2
        when (deps2 /= deps3) $ putError $ "Error: " ++ x ++ " doesn't know about dependencies on " ++ unwords (deps2 \\ deps3)
        dbs <- mapM loadDatabase deps3
        let (err,db) = createDatabase Haskell dbs src
        unless (null err) $ outStrLn $ "Skipped " ++ show (length err) ++ " errors in " ++ x
        whenLoud $ outStr $ unlines $ map show err
        outStr $ "Converting " ++ x ++ "... "
        performGC
        saveDatabase (hoo x) db
        outStrLn "done"


readInput :: Name -> IO ([Name], String)
readInput x = do
    src <- readFile $ x <.> "txt"
    let (a,b) = span ("@depends " `isPrefixOf`) $ lines src
    return (map (drop 9) a, unlines b)



-- combine multiple databases
combine :: ([Name] -> IO ()) -> Name -> [Name] -> Bool -> IO ()
combine make x deps force = do
    make deps
    dbs <- mapM (loadDatabase . hoo) deps
    outStr $ "Creating " ++ x ++ " from " ++ show (length deps) ++ " databases... "
    performGC
    saveDatabase (hoo x) $ mconcat dbs
    outStrLn "done"