{-# LANGUAGE DeriveDataTypeable #-}

module Hoogle.Query.Type where

import Data.Maybe
import Data.Data
import Hoogle.Type.All


-- | A query, representing a user input.
data Query = Query
    {names :: [String]
    ,typeSig :: Maybe TypeSig
    ,scope :: [Scope]
    }
    deriving (Data,Typeable,Show,Eq)


-- | Test if a query will result in a search being performed. A query which lists only scopes
--   (e.g. @+base@) will still be reported is blank.
isBlankQuery :: Query -> Bool
isBlankQuery query = null (names query) && isNothing (typeSig query)

blankQuery :: Query
blankQuery = Query [] Nothing []


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

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