import HaltaVista.Types
import HaltaVista.TypeInference
import HaltaVista.Hoogle
import HaltaVista.Match
import Control.Monad(filterM, when)
suffix = reverse . takeWhile (/= '.') . reverse
search :: [([Input], Output)] -> IO [Answer]
search ios = do
mty <- infer ios
case mty of
Left e -> error (show e)
Right ty -> do
--putStrLn ("ty = " ++ (suffix ty))
hoogle (suffix ty)
split xs = split' [] xs
where split' acc [x] = (reverse acc,x)
split' acc (x:xs) = split' (x:acc) xs
parse :: String -> [([Input], Output)]
parse = map split . map words . lines
pretty :: Answer -> String
pretty (x,y) = x ++ " " ++ y
main = do
ios <- parse `fmap` getContents
candidates <- search ios
let pp cand = do ok <- matches cand ios
when ok $ putStrLn $ pretty cand
mapM_ pp candidates