module System.Console.Haskeline.Backend.Posix.Encoder (
ExternalHandle(eH),
externalHandle,
withCodingMode,
openInCodingMode,
) where
import System.IO
import System.Console.Haskeline.Monads
import GHC.IO.Encoding (initLocaleEncoding)
import System.Console.Haskeline.Recover
data ExternalHandle = ExternalHandle
{ ExternalHandle -> ExternalMode
externalMode :: ExternalMode
, ExternalHandle -> Handle
eH :: Handle
}
data ExternalMode = CodingMode | OtherMode
externalHandle :: Handle -> ExternalHandle
externalHandle :: Handle -> ExternalHandle
externalHandle = ExternalMode -> Handle -> ExternalHandle
ExternalHandle ExternalMode
OtherMode
withCodingMode :: ExternalHandle -> IO a -> IO a
withCodingMode :: ExternalHandle -> IO a -> IO a
withCodingMode ExternalHandle {externalMode :: ExternalHandle -> ExternalMode
externalMode=ExternalMode
CodingMode} act :: IO a
act = IO a
act
withCodingMode (ExternalHandle OtherMode h :: Handle
h) act :: IO a
act = do
IO (Maybe TextEncoding)
-> (Maybe TextEncoding -> IO ())
-> (Maybe TextEncoding -> IO a)
-> IO a
forall (m :: * -> *) a b c.
MonadException m =>
m a -> (a -> m b) -> (a -> m c) -> m c
bracket (IO (Maybe TextEncoding) -> IO (Maybe TextEncoding)
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (Maybe TextEncoding) -> IO (Maybe TextEncoding))
-> IO (Maybe TextEncoding) -> IO (Maybe TextEncoding)
forall a b. (a -> b) -> a -> b
$ Handle -> IO (Maybe TextEncoding)
hGetEncoding Handle
h)
(IO () -> IO ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> IO ())
-> (Maybe TextEncoding -> IO ()) -> Maybe TextEncoding -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Handle -> Maybe TextEncoding -> IO ()
hSetBinOrEncoding Handle
h)
((Maybe TextEncoding -> IO a) -> IO a)
-> (Maybe TextEncoding -> IO a) -> IO a
forall a b. (a -> b) -> a -> b
$ IO a -> Maybe TextEncoding -> IO a
forall a b. a -> b -> a
const (IO a -> Maybe TextEncoding -> IO a)
-> IO a -> Maybe TextEncoding -> IO a
forall a b. (a -> b) -> a -> b
$ do
Handle -> TextEncoding -> IO ()
hSetEncoding Handle
h TextEncoding
haskelineEncoding
IO a
act
hSetBinOrEncoding :: Handle -> Maybe TextEncoding -> IO ()
hSetBinOrEncoding :: Handle -> Maybe TextEncoding -> IO ()
hSetBinOrEncoding h :: Handle
h Nothing = Handle -> Bool -> IO ()
hSetBinaryMode Handle
h Bool
True
hSetBinOrEncoding h :: Handle
h (Just enc :: TextEncoding
enc) = Handle -> TextEncoding -> IO ()
hSetEncoding Handle
h TextEncoding
enc
haskelineEncoding :: TextEncoding
haskelineEncoding :: TextEncoding
haskelineEncoding = TextEncoding -> TextEncoding
transliterateFailure TextEncoding
initLocaleEncoding
openInCodingMode :: FilePath -> IOMode -> IO ExternalHandle
openInCodingMode :: FilePath -> IOMode -> IO ExternalHandle
openInCodingMode path :: FilePath
path iomode :: IOMode
iomode = do
Handle
h <- FilePath -> IOMode -> IO Handle
openFile FilePath
path IOMode
iomode
Handle -> TextEncoding -> IO ()
hSetEncoding Handle
h TextEncoding
haskelineEncoding
ExternalHandle -> IO ExternalHandle
forall (m :: * -> *) a. Monad m => a -> m a
return (ExternalHandle -> IO ExternalHandle)
-> ExternalHandle -> IO ExternalHandle
forall a b. (a -> b) -> a -> b
$ ExternalMode -> Handle -> ExternalHandle
ExternalHandle ExternalMode
CodingMode Handle
h