packages feed

hoogle-3.1: src/Hoogle/Search.hs

module Hoogle.Search(Search(..), SearchMode(..), parseSearch) where


import Hoogle.TypeSig
import Hoogle.TextUtil
import Hoogle.Parser
import Data.Char
import Data.List


data Search = Search String SearchMode
              deriving Show


data SearchMode = SearchName String
                | SearchType ConType
                | SearchError String
                deriving Show


parseSearch :: String -> Search
parseSearch x = Search x $
                if not (null x3) && isHaskellName x3
                then SearchName x3
                else case parseConType x2 of
                         Right x -> SearchError x
                         Left x -> SearchType x
    where
        x2 = trim x
        x3 = trimBrackets x2


trimBrackets =
    (\x -> if "(" `isPrefixOf` x then tail x else x) .
    (\x -> if ")" `isSuffixOf` x then init x else x)


isHaskellName :: String -> Bool
isHaskellName (x:xs) | isAlpha x && all (\a -> isAlphaNum a || a `elem` "_'") xs = True
isHaskellName xs = all (`elem` "!#$%&*+./<>=?@/^|-~") xs