    module Hoogle.Query.Render(renderQuery) where

    import General.Base
    import Data.Generics.Uniplate
    import Hoogle.Query.Type
    import Hoogle.Type.All

    -- | Render a query, in particular using 'TagColor' for any type signature argument positions.
    renderQuery :: Query -> TagStr
    renderQuery x = Tags $ namesig ++ [Str " " | namesig /= [] && scp /= []] ++ scp
        where
            namesig = case (null (names x), isNothing (typeSig x)) of
                          (True, True) -> []
                          (True, False) -> [Str ":: " | namelike] ++ showType
                          (False, True) -> showName
                          _ -> showName ++ [Str " :: "] ++ showType
                where namelike = and [isAlpha y || isSpace y | Str xs <- universe $ Tags showType
                                                             , y:ys <- [dropWhile isSpace xs]]

            showName = intersperse (Str " ") $ map (TagBold . Str) (names x)
            showType = [renderTypeSig $ fromJust $ typeSig x]

            scp = [Str $ unwords $ map f $ scope x | scope x /= []]
            f (Scope b _ x) = (if b then "+" else "-") ++ x

    renderTypeSig :: TypeSig -> TagStr
    renderTypeSig (TypeSig con args) = Tags $
        Str (showConstraint con) :
        intersperse (Str " -> ")
           (zipWith TagColor [1..] (map (Str . showFun) finit) ++
            [TagColor 0 $ Str $ showFun flast])
        where
            (finit, flast) = (init funcs, last funcs)
            funcs = splitFun args