module Debug.Hoed.ReadLine where
import System.IO
import Data.List

noBuffering :: IO ()
noBuffering = do
  hSetBuffering stdin NoBuffering
  hSetBuffering stdout NoBuffering

readLine :: String -> [String] -> IO String
readLine ps completions = do
  putStr ps
  loop ""
  where
  loop curLine = do 
    c <- getChar
    case c of
      '\n'   -> return curLine
      '\DEL' -> do putStr "\b\b\b   \b\b\b"
                   loop (case curLine of [] -> []; _ -> init curLine)
      '\t'   -> case filter (isPrefixOf curLine) completions of
                  [cmd] -> do
                    putStr $ drop (length curLine) cmd
                    loop cmd
                  completions' -> do
                    putStr $ "\b\n" ++ unlines completions' ++ ps ++ curLine
                    loop curLine
      _      -> loop $ curLine ++ [c]