module Hoogle.Query.Type where

import Data.Maybe
import Data.Char
import Data.Generics.UniplateOn

import General.Code
import Hoogle.TypeSig.All


usefulQuery query = not (null (names query)) || isJust (typeSig query)


blankQuery = Query [] [] Nothing []

data Query = Query {
        scope :: [Scope],
        names :: [String],
        typeSig :: Maybe TypeSig,
        flags :: [Flag]
    }
    deriving Show


instance Eq Query where
    (Query a1 b1 c1 d1) == (Query a2 b2 c2 d2) =
        and [a1 `setEq` a2, b1 `setEq` b2, c1 == c2, d1 `setEq` d2]


data Scope = PlusPackage  String
           | MinusPackage String
           | PlusModule  [String]
           | MinusModule [String]
           deriving (Eq, Show, Read)

isPlusModule  (PlusModule  _) = True; isPlusModule  _ = False
isMinusModule (MinusModule _) = True; isMinusModule _ = False


-- primarily for consoles, but some work on the web search
-- first is the name, second is optional data
data Flag = Flag String String
            deriving (Eq, Show, Read)


transformQueryType :: (Type -> Type) -> Query -> Query
transformQueryType f q = q{typeSig = maybe Nothing (Just . transformOn onTypeSig f) (typeSig q)}

universeQueryType :: Query -> [Type]
universeQueryType = maybe [] (universeOn onTypeSig) . typeSig