packages feed

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