-- | Conversions from lazy 'Data.Text.Lazy.Text'.
module Unwitch.Convert.LazyText
  ( toText
  , toString
  , fromString
#ifdef __GLASGOW_HASKELL__
  , toLazyByteStringUtf8
  , toLazyByteStringUtf16LE
  , toLazyByteStringUtf16BE
  , toLazyByteStringUtf32LE
  , toLazyByteStringUtf32BE
  , toLazyByteStringLatin1
#endif
  )
where

import Data.Text (Text)
import Data.Text.Lazy qualified as LT
#ifdef __GLASGOW_HASKELL__
import Data.ByteString.Lazy qualified as LBS
import Data.ByteString.Lazy.Char8 qualified as LBSC8
import Data.Text.Lazy.Encoding qualified as LTE
#endif

toText :: LT.Text -> Text
toText :: Text -> Text
toText = Text -> Text
LT.toStrict

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

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

#ifdef __GLASGOW_HASKELL__
toLazyByteStringUtf8 :: LT.Text -> LBS.ByteString
toLazyByteStringUtf8 :: Text -> ByteString
toLazyByteStringUtf8 = Text -> ByteString
LTE.encodeUtf8

toLazyByteStringUtf16LE :: LT.Text -> LBS.ByteString
toLazyByteStringUtf16LE :: Text -> ByteString
toLazyByteStringUtf16LE = Text -> ByteString
LTE.encodeUtf16LE

toLazyByteStringUtf16BE :: LT.Text -> LBS.ByteString
toLazyByteStringUtf16BE :: Text -> ByteString
toLazyByteStringUtf16BE = Text -> ByteString
LTE.encodeUtf16BE

toLazyByteStringUtf32LE :: LT.Text -> LBS.ByteString
toLazyByteStringUtf32LE :: Text -> ByteString
toLazyByteStringUtf32LE = Text -> ByteString
LTE.encodeUtf32LE

toLazyByteStringUtf32BE :: LT.Text -> LBS.ByteString
toLazyByteStringUtf32BE :: Text -> ByteString
toLazyByteStringUtf32BE = Text -> ByteString
LTE.encodeUtf32BE

-- | Returns 'Nothing' if any character exceeds @\xFF@.
toLazyByteStringLatin1 :: LT.Text -> Maybe LBS.ByteString
toLazyByteStringLatin1 :: Text -> Maybe ByteString
toLazyByteStringLatin1 Text
t = if (Char -> Bool) -> Text -> Bool
LT.all Char -> Bool
isLatin1 Text
t
  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
LBSC8.pack (Text -> String
LT.unpack Text
t)
  else Maybe ByteString
forall a. Maybe a
Nothing

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