{-# LANGUAGE PatternGuards, ViewPatterns, RecordWildCards #-}
{-# LANGUAGE OverloadedStrings #-}
{-# OPTIONS_GHC -O0 #-} -- otherwise it takes a lot of memory to compile on the haskell.org server

module Query(
    Query(..), isQueryName, isQueryType, isQueryScope,
    parseQuery, renderQuery,
    query_test
    ) where

import Data.List
import Language.Haskell.Exts
import Data.Char
import Text.Blaze
import qualified Text.Blaze.XHtml5 as H
import Data.List.Extra
import Data.Generics.Uniplate.Data
import General.Util
import Data.Maybe
import Data.Monoid
import Control.Applicative
import Prelude

---------------------------------------------------------------------
-- DATA TYPE

data Query
    = QueryName {Query -> String
fromQueryName :: String}
    | QueryType {Query -> Type ()
fromQueryType :: Type ()}
    | QueryScope {Query -> Bool
scopeInclude :: Bool, Query -> String
scopeCategory :: String, Query -> String
scopeValue :: String}
    | QueryNone String -- part of the query that is ignored
      deriving (Int -> Query -> ShowS
[Query] -> ShowS
Query -> String
(Int -> Query -> ShowS)
-> (Query -> String) -> ([Query] -> ShowS) -> Show Query
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Query] -> ShowS
$cshowList :: [Query] -> ShowS
show :: Query -> String
$cshow :: Query -> String
showsPrec :: Int -> Query -> ShowS
$cshowsPrec :: Int -> Query -> ShowS
Show,Query -> Query -> Bool
(Query -> Query -> Bool) -> (Query -> Query -> Bool) -> Eq Query
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Query -> Query -> Bool
$c/= :: Query -> Query -> Bool
== :: Query -> Query -> Bool
$c== :: Query -> Query -> Bool
Eq)

isQueryName, isQueryType, isQueryScope :: Query -> Bool
isQueryName :: Query -> Bool
isQueryName QueryName{} = Bool
True; isQueryName _ = Bool
False
isQueryType :: Query -> Bool
isQueryType QueryType{} = Bool
True; isQueryType _ = Bool
False
isQueryScope :: Query -> Bool
isQueryScope QueryScope{} = Bool
True; isQueryScope _ = Bool
False

renderQuery :: [Query] -> Markup
renderQuery :: [Query] -> Markup
renderQuery [] = Markup -> Markup
H.i "No query"
renderQuery xs :: [Query]
xs = do
    String -> Markup
string (String -> Markup) -> String -> Markup
forall a b. (a -> b) -> a -> b
$ [String] -> String
unwords ([String] -> String) -> [String] -> String
forall a b. (a -> b) -> a -> b
$
        [String
x | QueryName x :: String
x <- [Query]
xs] [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++
        [":: " String -> ShowS
forall a. [a] -> [a] -> [a]
++ Type () -> String
forall a. Pretty a => a -> String
pretty Type ()
x | QueryType x :: Type ()
x <- [Query]
xs] [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++
        [['-' | Bool -> Bool
not Bool
scopeInclude] String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
scopeCategory String -> ShowS
forall a. [a] -> [a] -> [a]
++ ":" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
scopeValue | QueryScope{..} <- [Query]
xs]
    [Markup] -> Markup
forall a. Monoid a => [a] -> a
mconcat [" " Markup -> Markup -> Markup
forall a. Semigroup a => a -> a -> a
<> Markup -> Markup
H.del (String -> Markup
string String
x) | QueryNone x :: String
x <- [Query]
xs]


---------------------------------------------------------------------
-- PARSER

parseQuery :: String -> [Query]
parseQuery :: String -> [Query]
parseQuery x :: String
x = (String -> Query) -> [String] -> [Query]
forall a b. (a -> b) -> [a] -> [b]
map String -> Query
QueryName [String]
nam [Query] -> [Query] -> [Query]
forall a. [a] -> [a] -> [a]
++ (Type () -> Query) -> [Type ()] -> [Query]
forall a b. (a -> b) -> [a] -> [b]
map Type () -> Query
QueryType (Maybe (Type ()) -> [Type ()]
forall a. Maybe a -> [a]
maybeToList Maybe (Type ())
typ) [Query] -> [Query] -> [Query]
forall a. [a] -> [a] -> [a]
++ [Query]
scp
    where
        (scp :: [Query]
scp,rest :: [String]
rest) = [String] -> ([Query], [String])
scope_ ([String] -> ([Query], [String]))
-> [String] -> ([Query], [String])
forall a b. (a -> b) -> a -> b
$ String -> [String]
lexer String
x
        (nam :: [String]
nam,typ :: Maybe (Type ())
typ) = [String] -> ([String], Maybe (Type ()))
divide [String]
rest


openBrackets :: [String]
openBrackets = ["(#","[:","(","["]
shutBrackets :: [String]
shutBrackets = ["#)",":]",")","]"]

isBracket :: String -> Bool
isBracket x :: String
x = String
x String -> [String] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` ([String]
openBrackets [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ [String]
shutBrackets)
isBracketPair :: String -> Bool
isBracketPair x :: String
x = String
x String -> [String] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` (String -> ShowS) -> [String] -> [String] -> [String]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith String -> ShowS
forall a. [a] -> [a] -> [a]
(++) [String]
openBrackets [String]
shutBrackets

isSym :: Char -> Bool
isSym x :: Char
x = ((Char -> Bool
isSymbol Char
x Bool -> Bool -> Bool
|| Char -> Bool
isPunctuation Char
x) Bool -> Bool -> Bool
&& Char
x Char -> String -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`notElem` String
special) Bool -> Bool -> Bool
|| Char
x Char -> String -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` String
ascSymbol
    where special :: String
special = "(),;[]`{}\"'" :: String
          ascSymbol :: String
ascSymbol = "!#$%&*+./<=>?@\\^|-~" :: String

isSyms :: String -> Bool
isSyms xs :: String
xs | String -> Bool
isBracket String
xs Bool -> Bool -> Bool
|| String -> Bool
isBracketPair String
xs = Bool
False
isSyms (x:xs) = Char -> Bool
isSym Char
x
isSyms [] = Bool
False

-- | Split into small lexical chunks.
--
-- > "Data.Map.(!)" ==> ["Data",".","Map",".","(","!",")"]
lexer :: String -> [String]
lexer :: String -> [String]
lexer ('(':',':xs :: String
xs) | (a :: String
a,')':b :: String
b) <- (Char -> Bool) -> String -> (String, String)
forall a. (a -> Bool) -> [a] -> ([a], [a])
span (Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== ',') String
xs = ("(," String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
a String -> ShowS
forall a. [a] -> [a] -> [a]
++ ")") String -> [String] -> [String]
forall a. a -> [a] -> [a]
: String -> [String]
lexer String
b
lexer x :: String
x | Just s :: String
s <- ([String]
bs [String] -> Int -> String
forall a. [a] -> Int -> a
!!) (Int -> String) -> Maybe Int -> Maybe String
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (String -> Bool) -> [String] -> Maybe Int
forall a. (a -> Bool) -> [a] -> Maybe Int
findIndex (String -> String -> Bool
forall a. Eq a => [a] -> [a] -> Bool
`isPrefixOf` String
x) [String]
bs = String
s String -> [String] -> [String]
forall a. a -> [a] -> [a]
: String -> [String]
lexer (Int -> ShowS
forall a. Int -> [a] -> [a]
drop (String -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length String
s) String
x)
    where bs :: [String]
bs = (String -> ShowS) -> [String] -> [String] -> [String]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith String -> ShowS
forall a. [a] -> [a] -> [a]
(++) [String]
openBrackets [String]
shutBrackets [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ [String]
openBrackets [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ [String]
shutBrackets
lexer (x :: Char
x:xs :: String
xs)
    | Char -> Bool
isSpace Char
x = " " String -> [String] -> [String]
forall a. a -> [a] -> [a]
: String -> [String]
lexer (ShowS
trimStart String
xs)
    | Char -> Bool
isAlpha Char
x Bool -> Bool -> Bool
|| Char
x Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== '_' =
        let (a :: String
a,b :: String
b) = (Char -> Bool) -> String -> (String, String)
forall a. (a -> Bool) -> [a] -> ([a], [a])
span (\x :: Char
x -> Char -> Bool
isAlphaNum Char
x Bool -> Bool -> Bool
|| Char
x Char -> String -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` ("_'#-" :: String)) String
xs
            (a1 :: String
a1,a2 :: String
a2) = (Char -> Bool) -> String -> (String, String)
forall a. (a -> Bool) -> [a] -> ([a], [a])
spanEnd (Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== '-') String
a
        in (Char
xChar -> ShowS
forall a. a -> [a] -> [a]
:String
a1) String -> [String] -> [String]
forall a. a -> [a] -> [a]
: String -> [String]
lexer (String
a2 String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
b)
    | Char -> Bool
isSym Char
x = let (a :: String
a,b :: String
b) = (Char -> Bool) -> String -> (String, String)
forall a. (a -> Bool) -> [a] -> ([a], [a])
span Char -> Bool
isSym String
xs in (Char
xChar -> ShowS
forall a. a -> [a] -> [a]
:String
a) String -> [String] -> [String]
forall a. a -> [a] -> [a]
: String -> [String]
lexer String
b
    | Char
x Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== ',' = "," String -> [String] -> [String]
forall a. a -> [a] -> [a]
: String -> [String]
lexer String
xs
    | Bool
otherwise = String -> [String]
lexer String
xs -- drop invalid bits
lexer [] = []


-- | Find and extract the scope annotations.
--
-- > +package
-- > +module
-- > name.bar
-- > name.++ name.(++) (name.++)
-- > +foo -foo
-- > +scope:foo -scope:foo scope:foo
scope_ :: [String] -> ([Query], [String])
scope_ :: [String] -> ([Query], [String])
scope_ xs :: [String]
xs = case [String]
xs of
    (String -> Maybe Bool
forall a. (Eq a, IsString a) => a -> Maybe Bool
readPM -> Just pm :: Bool
pm):(String -> Maybe String
readCat -> Just cat :: String
cat):":":([String] -> Maybe (String, [String])
readMod -> Just (mod :: String
mod,rest :: [String]
rest)) -> Bool -> String -> String -> [String] -> ([Query], [String])
add Bool
pm String
cat String
mod [String]
rest
    (String -> Maybe Bool
forall a. (Eq a, IsString a) => a -> Maybe Bool
readPM -> Just pm :: Bool
pm):(String -> Maybe String
readCat -> Just cat :: String
cat):":-":([String] -> Maybe (String, [String])
readMod -> Just (mod :: String
mod,rest :: [String]
rest)) -> Bool -> String -> String -> [String] -> ([Query], [String])
add Bool
False String
cat String
mod [String]
rest
    (String -> Maybe Bool
forall a. (Eq a, IsString a) => a -> Maybe Bool
readPM -> Just pm :: Bool
pm):([String] -> Maybe (String, [String])
readMod -> Just (mod :: String
mod,rest :: [String]
rest)) -> Bool -> String -> [String] -> ([Query], [String])
add_ Bool
pm String
mod [String]
rest
    (String -> Maybe String
readCat -> Just cat :: String
cat):":":([String] -> Maybe (String, [String])
readMod -> Just (mod :: String
mod,rest :: [String]
rest)) -> Bool -> String -> String -> [String] -> ([Query], [String])
add Bool
True String
cat String
mod [String]
rest
    (String -> Maybe String
readCat -> Just cat :: String
cat):":.":([String] -> Maybe (String, [String])
readMod -> Just (mod :: String
mod,rest :: [String]
rest)) -> Bool -> String -> String -> [String] -> ([Query], [String])
add Bool
True String
cat ('.'Char -> ShowS
forall a. a -> [a] -> [a]
:String
mod) [String]
rest
    (String -> Maybe String
readCat -> Just cat :: String
cat):":-":([String] -> Maybe (String, [String])
readMod -> Just (mod :: String
mod,rest :: [String]
rest)) -> Bool -> String -> String -> [String] -> ([Query], [String])
add Bool
False String
cat String
mod [String]
rest
    (String -> Maybe String
readCat -> Just cat :: String
cat):":-.":([String] -> Maybe (String, [String])
readMod -> Just (mod :: String
mod,rest :: [String]
rest)) -> Bool -> String -> String -> [String] -> ([Query], [String])
add Bool
False String
cat ('.'Char -> ShowS
forall a. a -> [a] -> [a]
:String
mod) [String]
rest
    "(":([String] -> Maybe (String, [String])
readDots -> Just (scp :: String
scp,x :: String
x:")":rest :: [String]
rest)) -> [String] -> ([Query], [String]) -> ([Query], [String])
forall a a. [a] -> (a, [a]) -> (a, [a])
out ["(",String
x,")"] (([Query], [String]) -> ([Query], [String]))
-> ([Query], [String]) -> ([Query], [String])
forall a b. (a -> b) -> a -> b
$ Bool -> String -> [String] -> ([Query], [String])
add_ Bool
True String
scp [String]
rest
    ([String] -> Maybe (String, [String])
readDots -> Just (scp :: String
scp,rest :: [String]
rest)) -> Bool -> String -> [String] -> ([Query], [String])
add_ Bool
True String
scp [String]
rest
    "(":".":([String] -> Maybe (String, [String])
readDots -> Just (scp :: String
scp,x :: String
x:")":rest :: [String]
rest)) -> [String] -> ([Query], [String]) -> ([Query], [String])
forall a a. [a] -> (a, [a]) -> (a, [a])
out ["(",String
x,")"] (([Query], [String]) -> ([Query], [String]))
-> ([Query], [String]) -> ([Query], [String])
forall a b. (a -> b) -> a -> b
$ Bool -> String -> [String] -> ([Query], [String])
add_ Bool
True ('.'Char -> ShowS
forall a. a -> [a] -> [a]
:String
scp) [String]
rest
    ".":([String] -> Maybe (String, [String])
readDots -> Just (scp :: String
scp,rest :: [String]
rest)) -> Bool -> String -> [String] -> ([Query], [String])
add_ Bool
True ('.'Char -> ShowS
forall a. a -> [a] -> [a]
:String
scp) [String]
rest
    x :: String
x:xs :: [String]
xs -> [String] -> ([Query], [String]) -> ([Query], [String])
forall a a. [a] -> (a, [a]) -> (a, [a])
out [String
x] (([Query], [String]) -> ([Query], [String]))
-> ([Query], [String]) -> ([Query], [String])
forall a b. (a -> b) -> a -> b
$ [String] -> ([Query], [String])
scope_ [String]
xs
    [] -> ([], [])
    where
        out :: [a] -> (a, [a]) -> (a, [a])
out xs :: [a]
xs (a :: a
a,b :: [a]
b) = (a
a,[a]
xs[a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
++[a]
b)
        add :: Bool -> String -> String -> [String] -> ([Query], [String])
add a :: Bool
a b :: String
b c :: String
c rest :: [String]
rest = let (x :: [Query]
x,y :: [String]
y) = [String] -> ([Query], [String])
scope_ [String]
rest in (Bool -> String -> String -> Query
QueryScope Bool
a String
b String
c Query -> [Query] -> [Query]
forall a. a -> [a] -> [a]
: [Query]
x, [String]
y)
        add_ :: Bool -> String -> [String] -> ([Query], [String])
add_ a :: Bool
a c :: String
c rest :: [String]
rest = Bool -> String -> String -> [String] -> ([Query], [String])
add Bool
a String
b String
c [String]
rest
            where b :: String
b = if '.' Char -> String -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` String
c Bool -> Bool -> Bool
|| (Char -> Bool) -> String -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any Char -> Bool
isUpper (Int -> ShowS
forall a. Int -> [a] -> [a]
take 1 String
c) then "module" else "package"

        readPM :: a -> Maybe Bool
readPM x :: a
x = case a
x of "+" -> Bool -> Maybe Bool
forall a. a -> Maybe a
Just Bool
True; "-" -> Bool -> Maybe Bool
forall a. a -> Maybe a
Just Bool
False; _ -> Maybe Bool
forall a. Maybe a
Nothing

        readCat :: String -> Maybe String
readCat x :: String
x | String -> Bool
isAlpha1 String
x = String -> Maybe String
forall a. a -> Maybe a
Just String
x
                  | Bool
otherwise = Maybe String
forall a. Maybe a
Nothing

        readMod :: [String] -> Maybe (String, [String])
readMod (x :: String
x:xs :: [String]
xs) | String -> Bool
isAlpha1 String
x = (String, [String]) -> Maybe (String, [String])
forall a. a -> Maybe a
Just ((String, [String]) -> Maybe (String, [String]))
-> (String, [String]) -> Maybe (String, [String])
forall a b. (a -> b) -> a -> b
$ case [String]
xs of
            ".":ys :: [String]
ys | Just (a :: String
a,b :: [String]
b) <- [String] -> Maybe (String, [String])
readMod [String]
ys -> (String
x String -> ShowS
forall a. [a] -> [a] -> [a]
++ "." String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
a, [String]
b)
            ".":[] -> (String
x String -> ShowS
forall a. [a] -> [a] -> [a]
++ ".",[])
            ".":" ":ys :: [String]
ys -> (String
x String -> ShowS
forall a. [a] -> [a] -> [a]
++ "."," "String -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String]
ys)
            _ -> (String
x,[String]
xs)
        readMod _ = Maybe (String, [String])
forall a. Maybe a
Nothing

        readDots :: [String] -> Maybe (String, [String])
readDots (x :: String
x:xs :: [String]
xs) | String -> Bool
isAlpha1 String
x = case [String]
xs of
            ".":ys :: [String]
ys | Just (a :: String
a,b :: [String]
b) <- [String] -> Maybe (String, [String])
readDots [String]
ys -> (String, [String]) -> Maybe (String, [String])
forall a. a -> Maybe a
Just (String
x String -> ShowS
forall a. [a] -> [a] -> [a]
++ "." String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
a, [String]
b)
            ('.':y :: String
y):ys :: [String]
ys -> (String, [String]) -> Maybe (String, [String])
forall a. a -> Maybe a
Just (String
x, [String
y | String
y String -> String -> Bool
forall a. Eq a => a -> a -> Bool
/= ""] [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ [String]
ys)
            _ -> Maybe (String, [String])
forall a. Maybe a
Nothing
        readDots _ = Maybe (String, [String])
forall a. Maybe a
Nothing


-- | If everything is a name, or everything is a symbol, then you only have names.
divide :: [String] -> ([String], Maybe (Type ()))
divide :: [String] -> ([String], Maybe (Type ()))
divide xs :: [String]
xs | (String -> Bool) -> [String] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all String -> Bool
isAlpha1 [String]
ns = ([String]
ns, Maybe (Type ())
forall a. Maybe a
Nothing)
          | (String -> Bool) -> [String] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all String -> Bool
isSyms [String]
ns = ([String]
ns, Maybe (Type ())
forall a. Maybe a
Nothing)
          | [String] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [String]
ns Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== 1 = ([String]
ns, Maybe (Type ())
forall a. Maybe a
Nothing)
          | Bool
otherwise = case (String -> Bool) -> [String] -> ([String], [String])
forall a. (a -> Bool) -> [a] -> ([a], [a])
break (String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== "::") [String]
xs of
                (nam :: [String]
nam, _:rest :: [String]
rest) -> ([String] -> [String]
names_ [String]
nam, [String] -> Maybe (Type ())
typeSig_ [String]
rest)
                _ -> ([], [String] -> Maybe (Type ())
typeSig_ [String]
xs)
    where ns :: [String]
ns = [String] -> [String]
names_ [String]
xs


-- | Ignore brackets around symbols, and try to deal with tuple names.
names_ :: [String] -> [String]
names_ :: [String] -> [String]
names_ ("(":x :: String
x:")":xs :: [String]
xs) = [String
x | String
x String -> String -> Bool
forall a. Eq a => a -> a -> Bool
/= " "] [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ [String] -> [String]
names_ [String]
xs
names_ ["(",x :: String
x] = [String
x]
names_ (x :: String
x:xs :: [String]
xs) = [String
x | String
x String -> String -> Bool
forall a. Eq a => a -> a -> Bool
/= " "] [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ [String] -> [String]
names_ [String]
xs
names_ [] = []

typeSig_ :: [String] -> Maybe (Type ())
typeSig_ :: [String] -> Maybe (Type ())
typeSig_ xs :: [String]
xs = case ParseMode -> String -> ParseResult (Type SrcSpanInfo)
parseTypeWithMode ParseMode
parseMode (String -> ParseResult (Type SrcSpanInfo))
-> String -> ParseResult (Type SrcSpanInfo)
forall a b. (a -> b) -> a -> b
$ [String] -> String
unwords ([String] -> String) -> [String] -> String
forall a b. (a -> b) -> a -> b
$ [String] -> [String]
fixup ([String] -> [String]) -> [String] -> [String]
forall a b. (a -> b) -> a -> b
$ (String -> Bool) -> [String] -> [String]
forall a. (a -> Bool) -> [a] -> [a]
filter (Bool -> Bool
not (Bool -> Bool) -> (String -> Bool) -> String -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Char -> Bool) -> String -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all Char -> Bool
isSpace) [String]
xs of
    ParseOk x :: Type SrcSpanInfo
x -> Type () -> Maybe (Type ())
forall a. a -> Maybe a
Just (Type () -> Maybe (Type ())) -> Type () -> Maybe (Type ())
forall a b. (a -> b) -> a -> b
$ (Name () -> Name ()) -> Type () -> Type ()
forall from to. Biplate from to => (to -> to) -> from -> from
transformBi (\v :: Name ()
v -> if Name ()
v Name () -> Name () -> Bool
forall a. Eq a => a -> a -> Bool
== () -> String -> Name ()
forall l. l -> String -> Name l
Ident () "__" then () -> String -> Name ()
forall l. l -> String -> Name l
Ident () "_" else Name ()
v) (Type () -> Type ()) -> Type () -> Type ()
forall a b. (a -> b) -> a -> b
$ (SrcSpanInfo -> ()) -> Type SrcSpanInfo -> Type ()
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (() -> SrcSpanInfo -> ()
forall a b. a -> b -> a
const ()) Type SrcSpanInfo
x
    _ -> Maybe (Type ())
forall a. Maybe a
Nothing
    where
        fixup :: [String] -> [String]
fixup = [String] -> [String]
underscore ([String] -> [String])
-> ([String] -> [String]) -> [String] -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [String] -> [String]
closeBracket ([String] -> [String])
-> ([String] -> [String]) -> [String] -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [String] -> [String]
forall a. (Eq a, IsString a) => [a] -> [a]
completeFunc ([String] -> [String])
-> ([String] -> [String]) -> [String] -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [String] -> [String]
completeArrow

        completeArrow :: [String] -> [String]
completeArrow ([String] -> Maybe ([String], String)
forall a. [a] -> Maybe ([a], a)
unsnoc -> Just (a :: [String]
a,b :: String
b)) | String
b String -> [String] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` ["-","="] = [String] -> String -> [String]
forall a. [a] -> a -> [a]
snoc [String]
a (String
b String -> ShowS
forall a. [a] -> [a] -> [a]
++ ">")
        completeArrow x :: [String]
x = [String]
x

        completeFunc :: [a] -> [a]
completeFunc ([a] -> Maybe ([a], a)
forall a. [a] -> Maybe ([a], a)
unsnoc -> Just (a :: [a]
a,b :: a
b)) | a
b a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` ["->","=>"] = [a]
a [a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
++ [a
b,"_"]
        completeFunc x :: [a]
x = [a]
x

        closeBracket :: [String] -> [String]
closeBracket xs :: [String]
xs = [String]
xs [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ ([String] -> String -> [String])
-> [String] -> [String] -> [String]
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl [String] -> String -> [String]
f [] [String]
xs
            where f :: [String] -> String -> [String]
f stack :: [String]
stack x :: String
x | Just c :: String
c <- String -> [(String, String)] -> Maybe String
forall a b. Eq a => a -> [(a, b)] -> Maybe b
lookup String
x ([String] -> [String] -> [(String, String)]
forall a b. [a] -> [b] -> [(a, b)]
zip [String]
openBrackets [String]
shutBrackets) = String
cString -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String]
stack
                  f (s :: String
s:tack :: [String]
tack) x :: String
x | String
x String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
s = [String]
tack
                  f stack :: [String]
stack x :: String
x = [String]
stack

        underscore :: [String] -> [String]
underscore = [String] -> [String] -> [String] -> [String]
forall a. (Partial, Eq a) => [a] -> [a] -> [a] -> [a]
replace ["_"] ["__"]


query_test :: IO ()
query_test :: IO ()
query_test = String -> IO () -> IO ()
testing "Query.parseQuery" (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$ do
    let want :: String -> (a -> Bool) -> (a, [a]) -> ([String], [a])
want s :: String
s p :: a -> Bool
p (bad :: a
bad,q :: [a]
q) = (["missing " String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
s | Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ (a -> Bool) -> [a] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any a -> Bool
p [a]
q], (a -> Bool) -> [a] -> [a]
forall a. (a -> Bool) -> [a] -> [a]
filter (Bool -> Bool
not (Bool -> Bool) -> (a -> Bool) -> a -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Bool
p) [a]
q)
        wantEq :: a -> (a, [a]) -> ([String], [a])
wantEq v :: a
v = String -> (a -> Bool) -> (a, [a]) -> ([String], [a])
forall a a. String -> (a -> Bool) -> (a, [a]) -> ([String], [a])
want (a -> String
forall a. Show a => a -> String
show a
v) (a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
v)
        name :: String -> (a, [Query]) -> ([String], [Query])
name = Query -> (a, [Query]) -> ([String], [Query])
forall a a. (Show a, Eq a) => a -> (a, [a]) -> ([String], [a])
wantEq (Query -> (a, [Query]) -> ([String], [Query]))
-> (String -> Query)
-> String
-> (a, [Query])
-> ([String], [Query])
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Query
QueryName
        scope :: Bool -> String -> String -> (a, [Query]) -> ([String], [Query])
scope b :: Bool
b c :: String
c v :: String
v = Query -> (a, [Query]) -> ([String], [Query])
forall a a. (Show a, Eq a) => a -> (a, [a]) -> ([String], [a])
wantEq (Query -> (a, [Query]) -> ([String], [Query]))
-> Query -> (a, [Query]) -> ([String], [Query])
forall a b. (a -> b) -> a -> b
$ Bool -> String -> String -> Query
QueryScope Bool
b String
c String
v
        typ :: String -> (a, [Query]) -> ([String], [Query])
typ = Query -> (a, [Query]) -> ([String], [Query])
forall a a. (Show a, Eq a) => a -> (a, [a]) -> ([String], [a])
wantEq (Query -> (a, [Query]) -> ([String], [Query]))
-> (String -> Query)
-> String
-> (a, [Query])
-> ([String], [Query])
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Type () -> Query
QueryType (Type () -> Query) -> (String -> Type ()) -> String -> Query
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (SrcSpanInfo -> ()) -> Type SrcSpanInfo -> Type ()
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (() -> SrcSpanInfo -> ()
forall a b. a -> b -> a
const ()) (Type SrcSpanInfo -> Type ())
-> (String -> Type SrcSpanInfo) -> String -> Type ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ParseResult (Type SrcSpanInfo) -> Type SrcSpanInfo
forall a. ParseResult a -> a
fromParseResult (ParseResult (Type SrcSpanInfo) -> Type SrcSpanInfo)
-> (String -> ParseResult (Type SrcSpanInfo))
-> String
-> Type SrcSpanInfo
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ParseMode -> String -> ParseResult (Type SrcSpanInfo)
parseTypeWithMode ParseMode
parseMode
        typpp :: String -> (a, [Query]) -> ([String], [Query])
typpp x :: String
x = String -> (Query -> Bool) -> (a, [Query]) -> ([String], [Query])
forall a a. String -> (a -> Bool) -> (a, [a]) -> ([String], [a])
want ("type " String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
x) (\v :: Query
v -> case Query
v of QueryType s :: Type ()
s -> Type () -> String
forall a. Pretty a => a -> String
pretty Type ()
s String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
x; _ -> Bool
False)
    let infixl 0 ===
        a :: String
a === :: String -> (([a], [Query]) -> ([String], b)) -> IO ()
=== f :: ([a], [Query]) -> ([String], b)
f | bad :: [String]
bad@(_:_) <- ([String], b) -> [String]
forall a b. (a, b) -> a
fst (([String], b) -> [String]) -> ([String], b) -> [String]
forall a b. (a -> b) -> a -> b
$ ([a], [Query]) -> ([String], b)
f ([], [Query]
q) = String -> IO ()
forall a. Partial => String -> a
error (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ (String, [Query], [String]) -> String
forall a. Show a => a -> String
show (String
a,[Query]
q,[String]
bad :: [String])
                | Bool
otherwise = Char -> IO ()
putChar '.'
            where q :: [Query]
q = String -> [Query]
parseQuery String
a

    "" String -> (([String], [Query]) -> ([String], [Query])) -> IO ()
forall a b. String -> (([a], [Query]) -> ([String], b)) -> IO ()
=== ([String], [Query]) -> ([String], [Query])
forall a. a -> a
id
    "map" String -> (([Any], [Query]) -> ([String], [Query])) -> IO ()
forall a b. String -> (([a], [Query]) -> ([String], b)) -> IO ()
=== String -> ([Any], [Query]) -> ([String], [Query])
forall a. String -> (a, [Query]) -> ([String], [Query])
name "map"
    "#" String -> (([Any], [Query]) -> ([String], [Query])) -> IO ()
forall a b. String -> (([a], [Query]) -> ([String], b)) -> IO ()
=== String -> ([Any], [Query]) -> ([String], [Query])
forall a. String -> (a, [Query]) -> ([String], [Query])
name "#"
    "c#" String -> (([Any], [Query]) -> ([String], [Query])) -> IO ()
forall a b. String -> (([a], [Query]) -> ([String], b)) -> IO ()
=== String -> ([Any], [Query]) -> ([String], [Query])
forall a. String -> (a, [Query]) -> ([String], [Query])
name "c#"
    "-" String -> (([Any], [Query]) -> ([String], [Query])) -> IO ()
forall a b. String -> (([a], [Query]) -> ([String], b)) -> IO ()
=== String -> ([Any], [Query]) -> ([String], [Query])
forall a. String -> (a, [Query]) -> ([String], [Query])
name "-"
    "/" String -> (([Any], [Query]) -> ([String], [Query])) -> IO ()
forall a b. String -> (([a], [Query]) -> ([String], b)) -> IO ()
=== String -> ([Any], [Query]) -> ([String], [Query])
forall a. String -> (a, [Query]) -> ([String], [Query])
name "/"
    "->" String -> (([Any], [Query]) -> ([String], [Query])) -> IO ()
forall a b. String -> (([a], [Query]) -> ([String], b)) -> IO ()
=== String -> ([Any], [Query]) -> ([String], [Query])
forall a. String -> (a, [Query]) -> ([String], [Query])
name "->"
    "foldl'" String -> (([Any], [Query]) -> ([String], [Query])) -> IO ()
forall a b. String -> (([a], [Query]) -> ([String], b)) -> IO ()
=== String -> ([Any], [Query]) -> ([String], [Query])
forall a. String -> (a, [Query]) -> ([String], [Query])
name "foldl'"
    "fold'l" String -> (([Any], [Query]) -> ([String], [Query])) -> IO ()
forall a b. String -> (([a], [Query]) -> ([String], b)) -> IO ()
=== String -> ([Any], [Query]) -> ([String], [Query])
forall a. String -> (a, [Query]) -> ([String], [Query])
name "fold'l"
    "Int#" String -> (([Any], [Query]) -> ([String], [Query])) -> IO ()
forall a b. String -> (([a], [Query]) -> ([String], b)) -> IO ()
=== String -> ([Any], [Query]) -> ([String], [Query])
forall a. String -> (a, [Query]) -> ([String], [Query])
name "Int#"
    "concat map" String -> (([Any], [Query]) -> ([String], [Query])) -> IO ()
forall a b. String -> (([a], [Query]) -> ([String], b)) -> IO ()
=== String -> ([String], [Query]) -> ([String], [Query])
forall a. String -> (a, [Query]) -> ([String], [Query])
name "concat" (([String], [Query]) -> ([String], [Query]))
-> (([Any], [Query]) -> ([String], [Query]))
-> ([Any], [Query])
-> ([String], [Query])
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ([Any], [Query]) -> ([String], [Query])
forall a. String -> (a, [Query]) -> ([String], [Query])
name "map"
    "a -> b" String -> (([Any], [Query]) -> ([String], [Query])) -> IO ()
forall a b. String -> (([a], [Query]) -> ([String], b)) -> IO ()
=== String -> ([Any], [Query]) -> ([String], [Query])
forall a. String -> (a, [Query]) -> ([String], [Query])
typ "a -> b"
    "a->b" String -> (([Any], [Query]) -> ([String], [Query])) -> IO ()
forall a b. String -> (([a], [Query]) -> ([String], b)) -> IO ()
=== String -> ([Any], [Query]) -> ([String], [Query])
forall a. String -> (a, [Query]) -> ([String], [Query])
typ "a -> b"
    "(a b)" String -> (([Any], [Query]) -> ([String], [Query])) -> IO ()
forall a b. String -> (([a], [Query]) -> ([String], b)) -> IO ()
=== String -> ([Any], [Query]) -> ([String], [Query])
forall a. String -> (a, [Query]) -> ([String], [Query])
typ "(a b)"
    "map :: a -> b" String -> (([Any], [Query]) -> ([String], [Query])) -> IO ()
forall a b. String -> (([a], [Query]) -> ([String], b)) -> IO ()
=== String -> ([Any], [Query]) -> ([String], [Query])
forall a. String -> (a, [Query]) -> ([String], [Query])
typ "a -> b"
    "+Data.Map map" String -> (([Any], [Query]) -> ([String], [Query])) -> IO ()
forall a b. String -> (([a], [Query]) -> ([String], b)) -> IO ()
=== Bool
-> String -> String -> ([String], [Query]) -> ([String], [Query])
forall a.
Bool -> String -> String -> (a, [Query]) -> ([String], [Query])
scope Bool
True "module" "Data.Map" (([String], [Query]) -> ([String], [Query]))
-> (([Any], [Query]) -> ([String], [Query]))
-> ([Any], [Query])
-> ([String], [Query])
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ([Any], [Query]) -> ([String], [Query])
forall a. String -> (a, [Query]) -> ([String], [Query])
name "map"
    "a -> b package:foo" String -> (([Any], [Query]) -> ([String], [Query])) -> IO ()
forall a b. String -> (([a], [Query]) -> ([String], b)) -> IO ()
=== Bool
-> String -> String -> ([String], [Query]) -> ([String], [Query])
forall a.
Bool -> String -> String -> (a, [Query]) -> ([String], [Query])
scope Bool
True "package" "foo" (([String], [Query]) -> ([String], [Query]))
-> (([Any], [Query]) -> ([String], [Query]))
-> ([Any], [Query])
-> ([String], [Query])
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ([Any], [Query]) -> ([String], [Query])
forall a. String -> (a, [Query]) -> ([String], [Query])
typ "a -> b"
    "a -> b package:foo-bar" String -> (([Any], [Query]) -> ([String], [Query])) -> IO ()
forall a b. String -> (([a], [Query]) -> ([String], b)) -> IO ()
=== Bool
-> String -> String -> ([String], [Query]) -> ([String], [Query])
forall a.
Bool -> String -> String -> (a, [Query]) -> ([String], [Query])
scope Bool
True "package" "foo-bar" (([String], [Query]) -> ([String], [Query]))
-> (([Any], [Query]) -> ([String], [Query]))
-> ([Any], [Query])
-> ([String], [Query])
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ([Any], [Query]) -> ([String], [Query])
forall a. String -> (a, [Query]) -> ([String], [Query])
typ "a -> b"
    "Data.Map.map" String -> (([Any], [Query]) -> ([String], [Query])) -> IO ()
forall a b. String -> (([a], [Query]) -> ([String], b)) -> IO ()
=== Bool
-> String -> String -> ([String], [Query]) -> ([String], [Query])
forall a.
Bool -> String -> String -> (a, [Query]) -> ([String], [Query])
scope Bool
True "module" "Data.Map" (([String], [Query]) -> ([String], [Query]))
-> (([Any], [Query]) -> ([String], [Query]))
-> ([Any], [Query])
-> ([String], [Query])
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ([Any], [Query]) -> ([String], [Query])
forall a. String -> (a, [Query]) -> ([String], [Query])
name "map"
    "[a]" String -> (([Any], [Query]) -> ([String], [Query])) -> IO ()
forall a b. String -> (([a], [Query]) -> ([String], b)) -> IO ()
=== String -> ([Any], [Query]) -> ([String], [Query])
forall a. String -> (a, [Query]) -> ([String], [Query])
typ "[a]"
    "++" String -> (([Any], [Query]) -> ([String], [Query])) -> IO ()
forall a b. String -> (([a], [Query]) -> ([String], b)) -> IO ()
=== String -> ([Any], [Query]) -> ([String], [Query])
forall a. String -> (a, [Query]) -> ([String], [Query])
name "++"
    "(++)" String -> (([Any], [Query]) -> ([String], [Query])) -> IO ()
forall a b. String -> (([a], [Query]) -> ([String], b)) -> IO ()
=== String -> ([Any], [Query]) -> ([String], [Query])
forall a. String -> (a, [Query]) -> ([String], [Query])
name "++"
    ":+:" String -> (([Any], [Query]) -> ([String], [Query])) -> IO ()
forall a b. String -> (([a], [Query]) -> ([String], b)) -> IO ()
=== String -> ([Any], [Query]) -> ([String], [Query])
forall a. String -> (a, [Query]) -> ([String], [Query])
name ":+:"
    "bytestring-cvs +hackage" String -> (([Any], [Query]) -> ([String], [Query])) -> IO ()
forall a b. String -> (([a], [Query]) -> ([String], b)) -> IO ()
=== Bool
-> String -> String -> ([String], [Query]) -> ([String], [Query])
forall a.
Bool -> String -> String -> (a, [Query]) -> ([String], [Query])
scope Bool
True "package" "hackage" (([String], [Query]) -> ([String], [Query]))
-> (([Any], [Query]) -> ([String], [Query]))
-> ([Any], [Query])
-> ([String], [Query])
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ([Any], [Query]) -> ([String], [Query])
forall a. String -> (a, [Query]) -> ([String], [Query])
name "bytestring-cvs"
    "m => c" String -> (([Any], [Query]) -> ([String], [Query])) -> IO ()
forall a b. String -> (([a], [Query]) -> ([String], b)) -> IO ()
=== String -> ([Any], [Query]) -> ([String], [Query])
forall a. String -> (a, [Query]) -> ([String], [Query])
typ "m => c"
    "[b ()" String -> (([Any], [Query]) -> ([String], [Query])) -> IO ()
forall a b. String -> (([a], [Query]) -> ([String], b)) -> IO ()
=== String -> ([Any], [Query]) -> ([String], [Query])
forall a. String -> (a, [Query]) -> ([String], [Query])
typ "[b ()]"
    "[b (" String -> (([Any], [Query]) -> ([String], [Query])) -> IO ()
forall a b. String -> (([a], [Query]) -> ([String], b)) -> IO ()
=== String -> ([Any], [Query]) -> ([String], [Query])
forall a. String -> (a, [Query]) -> ([String], [Query])
typ "[b ()]"
    "_ -> a" String -> (([Any], [Query]) -> ([String], [Query])) -> IO ()
forall a b. String -> (([a], [Query]) -> ([String], b)) -> IO ()
=== String -> ([Any], [Query]) -> ([String], [Query])
forall a. String -> (a, [Query]) -> ([String], [Query])
typpp "_ -> a"
    "(a -> b) ->" String -> (([Any], [Query]) -> ([String], [Query])) -> IO ()
forall a b. String -> (([a], [Query]) -> ([String], b)) -> IO ()
=== String -> ([Any], [Query]) -> ([String], [Query])
forall a. String -> (a, [Query]) -> ([String], [Query])
typpp "(a -> b) -> _"
    "(a -> b) -" String -> (([Any], [Query]) -> ([String], [Query])) -> IO ()
forall a b. String -> (([a], [Query]) -> ([String], b)) -> IO ()
=== String -> ([Any], [Query]) -> ([String], [Query])
forall a. String -> (a, [Query]) -> ([String], [Query])
typpp "(a -> b) -> _"
    "Monad m => " String -> (([Any], [Query]) -> ([String], [Query])) -> IO ()
forall a b. String -> (([a], [Query]) -> ([String], b)) -> IO ()
=== String -> ([Any], [Query]) -> ([String], [Query])
forall a. String -> (a, [Query]) -> ([String], [Query])
typpp "Monad m => _"
    "map is:exact" String -> (([Any], [Query]) -> ([String], [Query])) -> IO ()
forall a b. String -> (([a], [Query]) -> ([String], b)) -> IO ()
=== String -> ([String], [Query]) -> ([String], [Query])
forall a. String -> (a, [Query]) -> ([String], [Query])
name "map" (([String], [Query]) -> ([String], [Query]))
-> (([Any], [Query]) -> ([String], [Query]))
-> ([Any], [Query])
-> ([String], [Query])
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Bool -> String -> String -> ([Any], [Query]) -> ([String], [Query])
forall a.
Bool -> String -> String -> (a, [Query]) -> ([String], [Query])
scope Bool
True "is" "exact"
    "sort set:hackage" String -> (([Any], [Query]) -> ([String], [Query])) -> IO ()
forall a b. String -> (([a], [Query]) -> ([String], b)) -> IO ()
=== String -> ([String], [Query]) -> ([String], [Query])
forall a. String -> (a, [Query]) -> ([String], [Query])
name "sort" (([String], [Query]) -> ([String], [Query]))
-> (([Any], [Query]) -> ([String], [Query]))
-> ([Any], [Query])
-> ([String], [Query])
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Bool -> String -> String -> ([Any], [Query]) -> ([String], [Query])
forall a.
Bool -> String -> String -> (a, [Query]) -> ([String], [Query])
scope Bool
True "set" "hackage"
    "sort -set:hackage" String -> (([Any], [Query]) -> ([String], [Query])) -> IO ()
forall a b. String -> (([a], [Query]) -> ([String], b)) -> IO ()
=== String -> ([String], [Query]) -> ([String], [Query])
forall a. String -> (a, [Query]) -> ([String], [Query])
name "sort" (([String], [Query]) -> ([String], [Query]))
-> (([Any], [Query]) -> ([String], [Query]))
-> ([Any], [Query])
-> ([String], [Query])
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Bool -> String -> String -> ([Any], [Query]) -> ([String], [Query])
forall a.
Bool -> String -> String -> (a, [Query]) -> ([String], [Query])
scope Bool
False "set" "hackage"
    "sort set:-hackage" String -> (([Any], [Query]) -> ([String], [Query])) -> IO ()
forall a b. String -> (([a], [Query]) -> ([String], b)) -> IO ()
=== String -> ([String], [Query]) -> ([String], [Query])
forall a. String -> (a, [Query]) -> ([String], [Query])
name "sort" (([String], [Query]) -> ([String], [Query]))
-> (([Any], [Query]) -> ([String], [Query]))
-> ([Any], [Query])
-> ([String], [Query])
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Bool -> String -> String -> ([Any], [Query]) -> ([String], [Query])
forall a.
Bool -> String -> String -> (a, [Query]) -> ([String], [Query])
scope Bool
False "set" "hackage"
    "sort -set:-hackage" String -> (([Any], [Query]) -> ([String], [Query])) -> IO ()
forall a b. String -> (([a], [Query]) -> ([String], b)) -> IO ()
=== String -> ([String], [Query]) -> ([String], [Query])
forall a. String -> (a, [Query]) -> ([String], [Query])
name "sort" (([String], [Query]) -> ([String], [Query]))
-> (([Any], [Query]) -> ([String], [Query]))
-> ([Any], [Query])
-> ([String], [Query])
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Bool -> String -> String -> ([Any], [Query]) -> ([String], [Query])
forall a.
Bool -> String -> String -> (a, [Query]) -> ([String], [Query])
scope Bool
False "set" "hackage"
    "package:bytestring-csv" String -> (([Any], [Query]) -> ([String], [Query])) -> IO ()
forall a b. String -> (([a], [Query]) -> ([String], b)) -> IO ()
=== Bool -> String -> String -> ([Any], [Query]) -> ([String], [Query])
forall a.
Bool -> String -> String -> (a, [Query]) -> ([String], [Query])
scope Bool
True "package" "bytestring-csv"
    "(>>=)" String -> (([Any], [Query]) -> ([String], [Query])) -> IO ()
forall a b. String -> (([a], [Query]) -> ([String], b)) -> IO ()
=== String -> ([Any], [Query]) -> ([String], [Query])
forall a. String -> (a, [Query]) -> ([String], [Query])
name ">>="
    "(>>=" String -> (([Any], [Query]) -> ([String], [Query])) -> IO ()
forall a b. String -> (([a], [Query]) -> ([String], b)) -> IO ()
=== String -> ([Any], [Query]) -> ([String], [Query])
forall a. String -> (a, [Query]) -> ([String], [Query])
name ">>="
    ">>=" String -> (([Any], [Query]) -> ([String], [Query])) -> IO ()
forall a b. String -> (([a], [Query]) -> ([String], b)) -> IO ()
=== String -> ([Any], [Query]) -> ([String], [Query])
forall a. String -> (a, [Query]) -> ([String], [Query])
name ">>="
    "Control.Monad.mplus" String -> (([Any], [Query]) -> ([String], [Query])) -> IO ()
forall a b. String -> (([a], [Query]) -> ([String], b)) -> IO ()
=== String -> ([String], [Query]) -> ([String], [Query])
forall a. String -> (a, [Query]) -> ([String], [Query])
name "mplus" (([String], [Query]) -> ([String], [Query]))
-> (([Any], [Query]) -> ([String], [Query]))
-> ([Any], [Query])
-> ([String], [Query])
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Bool -> String -> String -> ([Any], [Query]) -> ([String], [Query])
forall a.
Bool -> String -> String -> (a, [Query]) -> ([String], [Query])
scope Bool
True "module" "Control.Monad"
    "Control.Monad.>>=" String -> (([Any], [Query]) -> ([String], [Query])) -> IO ()
forall a b. String -> (([a], [Query]) -> ([String], b)) -> IO ()
=== String -> ([String], [Query]) -> ([String], [Query])
forall a. String -> (a, [Query]) -> ([String], [Query])
name ">>=" (([String], [Query]) -> ([String], [Query]))
-> (([Any], [Query]) -> ([String], [Query]))
-> ([Any], [Query])
-> ([String], [Query])
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Bool -> String -> String -> ([Any], [Query]) -> ([String], [Query])
forall a.
Bool -> String -> String -> (a, [Query]) -> ([String], [Query])
scope Bool
True "module" "Control.Monad"
    "Control.Monad.(>>=)" String -> (([Any], [Query]) -> ([String], [Query])) -> IO ()
forall a b. String -> (([a], [Query]) -> ([String], b)) -> IO ()
=== String -> ([String], [Query]) -> ([String], [Query])
forall a. String -> (a, [Query]) -> ([String], [Query])
name ">>=" (([String], [Query]) -> ([String], [Query]))
-> (([Any], [Query]) -> ([String], [Query]))
-> ([Any], [Query])
-> ([String], [Query])
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Bool -> String -> String -> ([Any], [Query]) -> ([String], [Query])
forall a.
Bool -> String -> String -> (a, [Query]) -> ([String], [Query])
scope Bool
True "module" "Control.Monad"
    "(Control.Monad.>>=)" String -> (([Any], [Query]) -> ([String], [Query])) -> IO ()
forall a b. String -> (([a], [Query]) -> ([String], b)) -> IO ()
=== String -> ([String], [Query]) -> ([String], [Query])
forall a. String -> (a, [Query]) -> ([String], [Query])
name ">>=" (([String], [Query]) -> ([String], [Query]))
-> (([Any], [Query]) -> ([String], [Query]))
-> ([Any], [Query])
-> ([String], [Query])
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Bool -> String -> String -> ([Any], [Query]) -> ([String], [Query])
forall a.
Bool -> String -> String -> (a, [Query]) -> ([String], [Query])
scope Bool
True "module" "Control.Monad"
    "Control.Monad.(>>=" String -> (([Any], [Query]) -> ([String], [Query])) -> IO ()
forall a b. String -> (([a], [Query]) -> ([String], b)) -> IO ()
=== String -> ([String], [Query]) -> ([String], [Query])
forall a. String -> (a, [Query]) -> ([String], [Query])
name ">>=" (([String], [Query]) -> ([String], [Query]))
-> (([Any], [Query]) -> ([String], [Query]))
-> ([Any], [Query])
-> ([String], [Query])
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Bool -> String -> String -> ([Any], [Query]) -> ([String], [Query])
forall a.
Bool -> String -> String -> (a, [Query]) -> ([String], [Query])
scope Bool
True "module" "Control.Monad"
    "(Control.Monad.>>=" String -> (([Any], [Query]) -> ([String], [Query])) -> IO ()
forall a b. String -> (([a], [Query]) -> ([String], b)) -> IO ()
=== String -> ([String], [Query]) -> ([String], [Query])
forall a. String -> (a, [Query]) -> ([String], [Query])
name ">>=" (([String], [Query]) -> ([String], [Query]))
-> (([Any], [Query]) -> ([String], [Query]))
-> ([Any], [Query])
-> ([String], [Query])
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Bool -> String -> String -> ([Any], [Query]) -> ([String], [Query])
forall a.
Bool -> String -> String -> (a, [Query]) -> ([String], [Query])
scope Bool
True "module" "Control.Monad"
    "foo.bar" String -> (([Any], [Query]) -> ([String], [Query])) -> IO ()
forall a b. String -> (([a], [Query]) -> ([String], b)) -> IO ()
=== String -> ([String], [Query]) -> ([String], [Query])
forall a. String -> (a, [Query]) -> ([String], [Query])
name "bar" (([String], [Query]) -> ([String], [Query]))
-> (([Any], [Query]) -> ([String], [Query]))
-> ([Any], [Query])
-> ([String], [Query])
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Bool -> String -> String -> ([Any], [Query]) -> ([String], [Query])
forall a.
Bool -> String -> String -> (a, [Query]) -> ([String], [Query])
scope Bool
True "package" "foo"
    "insert module:.Map" String -> (([Any], [Query]) -> ([String], [Query])) -> IO ()
forall a b. String -> (([a], [Query]) -> ([String], b)) -> IO ()
=== String -> ([String], [Query]) -> ([String], [Query])
forall a. String -> (a, [Query]) -> ([String], [Query])
name "insert" (([String], [Query]) -> ([String], [Query]))
-> (([Any], [Query]) -> ([String], [Query]))
-> ([Any], [Query])
-> ([String], [Query])
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Bool -> String -> String -> ([Any], [Query]) -> ([String], [Query])
forall a.
Bool -> String -> String -> (a, [Query]) -> ([String], [Query])
scope Bool
True "module" ".Map"
    "insert module:Map." String -> (([Any], [Query]) -> ([String], [Query])) -> IO ()
forall a b. String -> (([a], [Query]) -> ([String], b)) -> IO ()
=== String -> ([String], [Query]) -> ([String], [Query])
forall a. String -> (a, [Query]) -> ([String], [Query])
name "insert" (([String], [Query]) -> ([String], [Query]))
-> (([Any], [Query]) -> ([String], [Query]))
-> ([Any], [Query])
-> ([String], [Query])
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Bool -> String -> String -> ([Any], [Query]) -> ([String], [Query])
forall a.
Bool -> String -> String -> (a, [Query]) -> ([String], [Query])
scope Bool
True "module" "Map."
    "insert module:.Map." String -> (([Any], [Query]) -> ([String], [Query])) -> IO ()
forall a b. String -> (([a], [Query]) -> ([String], b)) -> IO ()
=== String -> ([String], [Query]) -> ([String], [Query])
forall a. String -> (a, [Query]) -> ([String], [Query])
name "insert" (([String], [Query]) -> ([String], [Query]))
-> (([Any], [Query]) -> ([String], [Query]))
-> ([Any], [Query])
-> ([String], [Query])
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Bool -> String -> String -> ([Any], [Query]) -> ([String], [Query])
forall a.
Bool -> String -> String -> (a, [Query]) -> ([String], [Query])
scope Bool
True "module" ".Map."
    ".Map.insert" String -> (([Any], [Query]) -> ([String], [Query])) -> IO ()
forall a b. String -> (([a], [Query]) -> ([String], b)) -> IO ()
=== String -> ([String], [Query]) -> ([String], [Query])
forall a. String -> (a, [Query]) -> ([String], [Query])
name "insert" (([String], [Query]) -> ([String], [Query]))
-> (([Any], [Query]) -> ([String], [Query]))
-> ([Any], [Query])
-> ([String], [Query])
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Bool -> String -> String -> ([Any], [Query]) -> ([String], [Query])
forall a.
Bool -> String -> String -> (a, [Query]) -> ([String], [Query])
scope Bool
True "module" ".Map"
    ".Map." String -> (([Any], [Query]) -> ([String], [Query])) -> IO ()
forall a b. String -> (([a], [Query]) -> ([String], b)) -> IO ()
=== Bool -> String -> String -> ([Any], [Query]) -> ([String], [Query])
forall a.
Bool -> String -> String -> (a, [Query]) -> ([String], [Query])
scope Bool
True "module" ".Map"
--  FIXME: ".Map" === scope True "module" ".Map" -- probably should work, but really needs to rewrite a fair bit
    "(.Monad.>>=" String -> (([Any], [Query]) -> ([String], [Query])) -> IO ()
forall a b. String -> (([a], [Query]) -> ([String], b)) -> IO ()
=== String -> ([String], [Query]) -> ([String], [Query])
forall a. String -> (a, [Query]) -> ([String], [Query])
name ">>=" (([String], [Query]) -> ([String], [Query]))
-> (([Any], [Query]) -> ([String], [Query]))
-> ([Any], [Query])
-> ([String], [Query])
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Bool -> String -> String -> ([Any], [Query]) -> ([String], [Query])
forall a.
Bool -> String -> String -> (a, [Query]) -> ([String], [Query])
scope Bool
True "module" ".Monad"
--  FIXME: "author:Taylor-M.-Hedberg" === scope True "author" "Taylor-M.-Hedberg"
    "author:Bryan-O'Sullivan" String -> (([Any], [Query]) -> ([String], [Query])) -> IO ()
forall a b. String -> (([a], [Query]) -> ([String], b)) -> IO ()
=== Bool -> String -> String -> ([Any], [Query]) -> ([String], [Query])
forall a.
Bool -> String -> String -> (a, [Query]) -> ([String], [Query])
scope Bool
True "author" "Bryan-O'Sullivan"
    "\8801" String -> (([Any], [Query]) -> ([String], [Query])) -> IO ()
forall a b. String -> (([a], [Query]) -> ([String], b)) -> IO ()
=== String -> ([Any], [Query]) -> ([String], [Query])
forall a. String -> (a, [Query]) -> ([String], [Query])
name "\8801"
    "( )" String -> (([String], [Query]) -> ([String], [Query])) -> IO ()
forall a b. String -> (([a], [Query]) -> ([String], b)) -> IO ()
=== ([String], [Query]) -> ([String], [Query])
forall a. a -> a
id -- FIXME: Should probably be ()