-- | Unlifted versions of all FFI methods.
module Linenoise.Unlift
  ( InputResult (..)
  , addHistory
  , clearScreen
  , getInputLine
  , historyLoad
  , historySave
  , printKeycodes
  , setCompletion
  , setMultiline
  , stifleHistory
  ) where

import Control.Monad.IO.Class (MonadIO, liftIO)
import Control.Monad.IO.Unlift (MonadUnliftIO, withRunInIO)
import Data.Text (Text)
import Data.Text.Encoding (decodeUtf8, encodeUtf8)
import Linenoise.FFI (InputResult (..))
import qualified Linenoise.FFI as FFI

-- | Add to current history.
addHistory :: MonadIO m => Text -> m ()
addHistory = liftIO . FFI.addHistory . encodeUtf8

-- | Clear the screen.
clearScreen :: MonadIO m => m ()
clearScreen = liftIO FFI.clearScreen

-- | Run the prompt, yielding a string.
getInputLine :: MonadIO m => Text -> m (InputResult Text)
getInputLine = liftIO . fmap (fmap decodeUtf8) . FFI.getInputLine . encodeUtf8

-- | Load history from a file.
historyLoad :: MonadIO m => FilePath -> m ()
historyLoad = liftIO . FFI.historyLoad

-- | Save history to a file.
historySave :: MonadIO m => FilePath -> m ()
historySave = liftIO . FFI.historySave

-- | Print keycodes.
printKeycodes :: MonadIO m => m ()
printKeycodes = liftIO FFI.printKeycodes

-- | Set the current completion function.
setCompletion :: MonadUnliftIO m => (Text -> m [Text]) -> m ()
setCompletion f =
  let g = fmap (fmap encodeUtf8) . f . decodeUtf8
  in withRunInIO (\runInIO -> FFI.setCompletion (runInIO . g))

-- | Enable/Disable multiline input.
setMultiline :: MonadIO m => Bool -> m ()
setMultiline = liftIO . FFI.setMultiline

-- | Limit the maximum history length.
stifleHistory :: MonadIO m => Int -> m ()
stifleHistory = liftIO . FFI.stifleHistory