-- | Conversions from 'Data.Text.Text'.
module Unwitch.Convert.Text
  ( toLazyText
  , toString
  , fromString
  , toByteStringUtf8
  , toByteStringUtf16LE
  , toByteStringUtf16BE
  , toByteStringUtf32LE
  , toByteStringUtf32BE
  , toByteStringLatin1
  )
where

import Data.ByteString (ByteString)
import Data.ByteString.Char8 qualified as BSC8
import Data.Text (Text)
import Data.Text qualified as T
import Data.Text.Encoding qualified as TE
import Data.Text.Lazy qualified as LT

toLazyText :: Text -> LT.Text
#ifdef __GLASGOW_HASKELL__
toLazyText :: Text -> Text
toLazyText = Text -> Text
LT.fromStrict
#else
toLazyText = LT.toLazy
#endif

toString :: Text -> String
toString :: Text -> String
toString = Text -> String
T.unpack

fromString :: String -> Text
fromString :: String -> Text
fromString = String -> Text
T.pack

toByteStringUtf8 :: Text -> ByteString
toByteStringUtf8 :: Text -> ByteString
toByteStringUtf8 = Text -> ByteString
TE.encodeUtf8

toByteStringUtf16LE :: Text -> ByteString
toByteStringUtf16LE :: Text -> ByteString
toByteStringUtf16LE = Text -> ByteString
TE.encodeUtf16LE

toByteStringUtf16BE :: Text -> ByteString
toByteStringUtf16BE :: Text -> ByteString
toByteStringUtf16BE = Text -> ByteString
TE.encodeUtf16BE

toByteStringUtf32LE :: Text -> ByteString
toByteStringUtf32LE :: Text -> ByteString
toByteStringUtf32LE = Text -> ByteString
TE.encodeUtf32LE

toByteStringUtf32BE :: Text -> ByteString
toByteStringUtf32BE :: Text -> ByteString
toByteStringUtf32BE = Text -> ByteString
TE.encodeUtf32BE

-- | Returns 'Nothing' if any character exceeds @\xFF@.
toByteStringLatin1 :: Text -> Maybe ByteString
toByteStringLatin1 :: Text -> Maybe ByteString
toByteStringLatin1 Text
t = if (Char -> Bool) -> String -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all Char -> Bool
isLatin1 String
str
  then ByteString -> Maybe ByteString
forall a. a -> Maybe a
Just (ByteString -> Maybe ByteString) -> ByteString -> Maybe ByteString
forall a b. (a -> b) -> a -> b
$ String -> ByteString
BSC8.pack String
str
  else Maybe ByteString
forall a. Maybe a
Nothing
  where str :: String
str = Text -> String
T.unpack Text
t

isLatin1 :: Char -> Bool
isLatin1 :: Char -> Bool
isLatin1 Char
c = Char
c Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
<= Char
'\xFF'