byline-0.1.0.0: src/System/Console/Byline/Internal/Completion.hs
{-# OPTIONS_HADDOCK hide #-}
{-
This file is part of the package byline. It is subject to the license
terms in the LICENSE file found in the top-level directory of this
distribution and at git://pmade.com/byline/LICENSE. No part of the
byline package, including this file, may be copied, modified,
propagated, or distributed except according to the terms contained in
the LICENSE file.
-}
--------------------------------------------------------------------------------
-- | Internal completion operations.
module System.Console.Byline.Internal.Completion
( CompletionFunc
, Completion (..)
, runCompletionFunction
) where
--------------------------------------------------------------------------------
-- Library imports:
import Data.IORef
import qualified Data.Text as Text
import qualified System.Console.Haskeline.Completion as H
--------------------------------------------------------------------------------
-- Byline imports:
import System.Console.Byline.Completion
--------------------------------------------------------------------------------
-- | Convert a Byline completion result into a Haskeline completion result.
convertCompletion :: Completion -> H.Completion
convertCompletion (Completion r d i) =
H.Completion { H.replacement = Text.unpack r
, H.display = Text.unpack d
, H.isFinished = i
}
--------------------------------------------------------------------------------
-- | Helper function that allows Byline to swap out the completion function.
runCompletionFunction :: IORef (Maybe CompletionFunc) -> H.CompletionFunc IO
runCompletionFunction compref (left, right) = do
comp <- readIORef compref
case comp of
Nothing -> H.completeFilename (left, right)
Just f -> do
(output, completions) <-
f (Text.reverse $ Text.pack left, Text.pack right)
return (Text.unpack $ Text.reverse output,
map convertCompletion completions)