{-# LANGUAGE LambdaCase #-}
module System.IO.Utf8.Internal
( EncodingAction (..)
, chooseBestEncPure
, chooseBestEnc
) where
import Data.List (isSuffixOf)
import GHC.IO.Encoding (TextEncoding, textEncodingName, utf8)
import qualified System.IO as IO
data EncodingAction
= Keep
| ChangeFromTo TextEncoding String
chooseBestEncPure
:: Bool
-> Maybe String
-> Maybe String
chooseBestEncPure :: Bool -> Maybe String -> Maybe String
chooseBestEncPure Bool
_ Maybe String
Nothing = forall a. Maybe a
Nothing
chooseBestEncPure Bool
_ (Just String
"UTF-8") = forall a. Maybe a
Nothing
chooseBestEncPure Bool
False Maybe String
_ = forall a. a -> Maybe a
Just String
"UTF-8"
chooseBestEncPure Bool
True (Just String
name)
| String
"//TRANSLIT" forall a. Eq a => [a] -> [a] -> Bool
`isSuffixOf` String
name = forall a. Maybe a
Nothing
| Bool
otherwise = forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ String
name forall a. [a] -> [a] -> [a]
++ String
"//TRANSLIT"
chooseBestEnc
:: IO.Handle
-> (IO.Handle -> IO Bool)
-> Maybe TextEncoding
-> IO EncodingAction
chooseBestEnc :: Handle
-> (Handle -> IO Bool) -> Maybe TextEncoding -> IO EncodingAction
chooseBestEnc Handle
_ Handle -> IO Bool
_ Maybe TextEncoding
Nothing = forall (f :: * -> *) a. Applicative f => a -> f a
pure EncodingAction
Keep
chooseBestEnc Handle
h Handle -> IO Bool
hIsTerm (Just TextEncoding
enc) = case TextEncoding -> String
textEncodingName TextEncoding
enc of
String
"UTF-8" -> forall (f :: * -> *) a. Applicative f => a -> f a
pure EncodingAction
Keep
String
name
| String
"//TRANSLIT" forall a. Eq a => [a] -> [a] -> Bool
`isSuffixOf` String
name -> forall (f :: * -> *) a. Applicative f => a -> f a
pure EncodingAction
Keep
| Bool
otherwise -> Handle -> IO Bool
hIsTerm Handle
h forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
Bool
False -> forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ TextEncoding -> String -> EncodingAction
ChangeFromTo TextEncoding
enc (TextEncoding -> String
textEncodingName TextEncoding
utf8)
Bool
True -> forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ TextEncoding -> String -> EncodingAction
ChangeFromTo TextEncoding
enc (String
name forall a. [a] -> [a] -> [a]
++ String
"//TRANSLIT")