elm-repl-0.3: src/Completion.hs
{-# LANGUAGE OverloadedStrings #-}
module Completion (complete) where
import Control.Monad.State (get)
import qualified Data.ByteString.Char8 as BS
import qualified Data.Trie as Trie
import System.Console.Haskeline.Completion (Completion(Completion), CompletionFunc, completeWord)
import qualified Environment as Env
import qualified Eval.Command as Eval
complete :: CompletionFunc Eval.Command
complete =
completeWord Nothing " \t" lookupCompletions
lookupCompletions :: String -> Eval.Command [Completion]
lookupCompletions string =
do env <- get
let defs = adjustDefs (Env.defs env)
return (completions string defs)
where
adjustDefs defs =
Trie.unionL cmds $
Trie.delete Env.firstVar $
Trie.delete Env.lastVar defs
cmds =
Trie.fromList
[ (":exit", "")
, (":reset", "")
, (":help", "")
, (":flags", "")
]
completions :: String -> Trie.Trie a -> [Completion]
completions string =
Trie.lookupBy go (BS.pack string)
where
go :: Maybe a -> Trie.Trie a -> [Completion]
go isElem suffixesTrie =
maybeCurrent ++ suffixCompletions
where
maybeCurrent =
case isElem of
Nothing -> []
Just _ -> [ Completion string string True ]
suffixCompletions =
map (suffixCompletion . BS.unpack) (Trie.keys suffixesTrie)
suffixCompletion suffix =
let full = string ++ suffix in
Completion full full False