packages feed

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