    {- |

    This module exposes the console Unicode API which is used by the functions
    in "System.Console.Haskeline".  On POSIX systems, it uses @iconv@ plus the
    console\'s locale; on Windows it uses the console's current code page.

    Characters or bytes which cannot be encoded/decoded (for example, not belonging
    to the output range) will be ignored.
    -}

    module System.Console.Haskeline.Encoding (
                                        encode,
                                        decode,
                                        getEncoder,
                                        getDecoder
                                        ) where

    import System.Console.Haskeline.InputT
    import System.Console.Haskeline.Term
    import System.Console.Haskeline.Monads
    import Data.ByteString (ByteString)

    -- | Encode a Unicode 'String' into a 'ByteString' suitable for the current
    -- console.
    encode :: MonadIO m => String -> InputT m ByteString
    encode str = do
        encoder <- asks encodeForTerm
        liftIO $ encoder str

    -- | Convert a 'ByteString' from the console's encoding into a Unicode 'String'.
    decode :: MonadIO m => ByteString -> InputT m String
    decode str = do
        decoder <- asks decodeForTerm
        liftIO $ decoder str

    getEncoder :: Monad m => InputT m (String -> IO ByteString)
    getEncoder = asks encodeForTerm

    getDecoder :: Monad m => InputT m (ByteString -> IO String)
    getDecoder = asks decodeForTerm