module Main.Utf8
( withUtf8
, withStdTerminalHandles
) where
import Control.Exception.Safe (MonadMask, bracket)
import Control.Monad.IO.Class (MonadIO, liftIO)
import GHC.IO.Encoding (getLocaleEncoding, setLocaleEncoding, utf8)
import System.IO (stderr, stdin, stdout)
import System.IO.Utf8 (withTerminalHandle)
withUtf8 :: (MonadIO m, MonadMask m) => m r -> m r
withUtf8 :: forall (m :: * -> *) r. (MonadIO m, MonadMask m) => m r -> m r
withUtf8 m r
act = m r -> m r
forall (m :: * -> *) r. (MonadIO m, MonadMask m) => m r -> m r
withStdTerminalHandles (m r -> m r) -> m r -> m r
forall a b. (a -> b) -> a -> b
$
m TextEncoding
-> (TextEncoding -> m ()) -> (TextEncoding -> m r) -> m r
forall (m :: * -> *) a b c.
(HasCallStack, MonadMask m) =>
m a -> (a -> m b) -> (a -> m c) -> m c
bracket
(IO TextEncoding -> m TextEncoding
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO TextEncoding -> m TextEncoding)
-> IO TextEncoding -> m TextEncoding
forall a b. (a -> b) -> a -> b
$ IO TextEncoding
getLocaleEncoding IO TextEncoding -> IO () -> IO TextEncoding
forall a b. IO a -> IO b -> IO a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* TextEncoding -> IO ()
setLocaleEncoding TextEncoding
utf8)
(IO () -> m ()
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> m ()) -> (TextEncoding -> IO ()) -> TextEncoding -> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TextEncoding -> IO ()
setLocaleEncoding)
(m r -> TextEncoding -> m r
forall a b. a -> b -> a
const m r
act)
withStdTerminalHandles :: (MonadIO m, MonadMask m) => m r -> m r
withStdTerminalHandles :: forall (m :: * -> *) r. (MonadIO m, MonadMask m) => m r -> m r
withStdTerminalHandles
= Handle -> m r -> m r
forall (m :: * -> *) r.
(MonadIO m, MonadMask m) =>
Handle -> m r -> m r
withTerminalHandle Handle
stdin
(m r -> m r) -> (m r -> m r) -> m r -> m r
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Handle -> m r -> m r
forall (m :: * -> *) r.
(MonadIO m, MonadMask m) =>
Handle -> m r -> m r
withTerminalHandle Handle
stdout
(m r -> m r) -> (m r -> m r) -> m r -> m r
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Handle -> m r -> m r
forall (m :: * -> *) r.
(MonadIO m, MonadMask m) =>
Handle -> m r -> m r
withTerminalHandle Handle
stderr