module Haskell.Docs
(module Haskell.Docs
,Identifier(..)
,PackageName(..)
,searchAndPrintModules
,searchAndPrintDoc)
where
import Haskell.Docs.Formatting
import Haskell.Docs.Haddock
import Haskell.Docs.Index
import Haskell.Docs.Types
import Control.Exception
import Control.Monad
import qualified Data.HashMap.Strict as M
import Data.List
import Data.Ord
import Data.Text (pack,unpack)
import qualified Data.Text.IO as T
import GHC hiding (verbosity)
import MonadUtils
searchAndPrintDoc
:: [String]
-> Bool
-> Bool
-> Maybe PackageName
-> Maybe ModuleName
-> Identifier
-> Ghc ()
searchAndPrintDoc gs ms ss pname mname ident =
do (result,printPkg,printModule) <- search
case result of
Left err ->
throw err
Right (sortBy (comparing identDocPackageName) -> docs) ->
if ss
then printSexp (nub docs)
else mapM_ (\(i,doc') ->
do when (not ms && i > 0)
(liftIO (putStrLn ""))
printIdentDoc ms printPkg printModule doc')
(zip [0::Int ..] (nub docs))
where search =
case (pname,mname) of
(Just p,Just m) -> fmap (,False,False) (searchPackageModuleIdent Nothing p m ident)
(Nothing,Just m) -> fmap (,True,False) (searchModuleIdent Nothing m ident)
_ -> fmap (,True,True) (searchIdent gs Nothing ident)
searchAndPrintModules :: [String] -> Identifier -> IO ()
searchAndPrintModules flags ident =
do result <- lookupIdent flags (pack (unIdentifier ident))
case result of
Nothing ->
throw NoFindModule
Just packages ->
forM_ (nub (concat (map snd (M.toList packages))))
T.putStrLn