elm-repl-0.2.1: src/Completion.hs
module Completion (complete)
where
import Data.Functor ((<$>))
import Data.Trie (Trie)
import Control.Monad.State (get)
import System.Console.Haskeline.Completion
import qualified Data.ByteString.Char8 as BS
import qualified Data.Trie as Trie
import Monad (ReplM)
import qualified Environment as Env
complete, completeIdentifier :: CompletionFunc ReplM
complete = completeQuotedWord Nothing "\"\'" (const $ return [] ) completeIdentifier
completeIdentifier = completeWord Nothing " \t" lookupCompletions
lookupCompletions :: String -> ReplM [Completion]
lookupCompletions s = completions s . removeReserveds . Env.defs <$> get
where removeReserveds = Trie.delete Env.firstVar . Trie.delete Env.lastVar
completions :: String -> Trie a -> [Completion]
completions s = Trie.lookupBy go (BS.pack s)
where go :: Maybe a -> Trie a -> [Completion]
go isElem suffixesTrie = maybeCurrent ++ suffixCompletions
where maybeCurrent = case isElem of
Nothing -> []
Just _ -> [current]
current = Completion s s True
suffixCompletions = map (suffixCompletion . BS.unpack) . Trie.keys $ suffixesTrie
suffixCompletion suf = Completion full full False
where full = s ++ suf