unwitch-3.1.0: src/Unwitch/Convert/Text.hs
-- | Conversions from 'Data.Text.Text'.
module Unwitch.Convert.Text
( toLazyText
, toString
, fromString
, toByteStringUtf8
, toByteStringUtf16LE
, toByteStringUtf16BE
, toByteStringUtf32LE
, toByteStringUtf32BE
, toByteStringLatin1
#ifdef __GLASGOW_HASKELL__
, toLazyByteStringUtf8
, toByteStringBuilderUtf8
, toTextBuilder
, toShortByteStringUtf8
, toPosixString
, toWindowsString
, toOsString
#endif
)
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
#ifdef __GLASGOW_HASKELL__
import Data.ByteString.Lazy qualified as LBS
import Data.ByteString.Builder qualified as BB
import Data.ByteString.Short qualified as SBS
import Data.ByteString.Short (ShortByteString)
import Data.Coerce (coerce)
import Data.Text.Lazy.Builder qualified as TLB
import System.OsString qualified as OS
import System.OsString.Internal.Types qualified as OSIT
import System.OsString.Posix qualified as OSP
#endif
toLazyText :: Text -> LT.Text
#ifdef __GLASGOW_HASKELL__
toLazyText = LT.fromStrict
#else
toLazyText = LT.toLazy
#endif
toString :: Text -> String
toString = T.unpack
fromString :: String -> Text
fromString = T.pack
toByteStringUtf8 :: Text -> ByteString
toByteStringUtf8 = TE.encodeUtf8
toByteStringUtf16LE :: Text -> ByteString
toByteStringUtf16LE = TE.encodeUtf16LE
toByteStringUtf16BE :: Text -> ByteString
toByteStringUtf16BE = TE.encodeUtf16BE
toByteStringUtf32LE :: Text -> ByteString
toByteStringUtf32LE = TE.encodeUtf32LE
toByteStringUtf32BE :: Text -> ByteString
toByteStringUtf32BE = TE.encodeUtf32BE
-- | Returns 'Nothing' if any character exceeds @\xFF@.
toByteStringLatin1 :: Text -> Maybe ByteString
toByteStringLatin1 t = if all isLatin1 str
then Just $ BSC8.pack str
else Nothing
where str = T.unpack t
isLatin1 :: Char -> Bool
isLatin1 c = c <= '\xFF'
#ifdef __GLASGOW_HASKELL__
-- | Encode as UTF-8 lazy 'LBS.ByteString'.
toLazyByteStringUtf8 :: Text -> LBS.ByteString
toLazyByteStringUtf8 = LBS.fromStrict . TE.encodeUtf8
-- | Encode as UTF-8 'BB.Builder'.
toByteStringBuilderUtf8 :: Text -> BB.Builder
toByteStringBuilderUtf8 = TE.encodeUtf8Builder
-- | Convert to a lazy 'TLB.Builder'.
toTextBuilder :: Text -> TLB.Builder
toTextBuilder = TLB.fromText
-- | Encode as UTF-8 'ShortByteString'.
toShortByteStringUtf8 :: Text -> ShortByteString
toShortByteStringUtf8 = SBS.toShort . TE.encodeUtf8
-- | Encode as UTF-8 'OSP.PosixString'.
toPosixString :: Text -> OSP.PosixString
toPosixString = coerce . SBS.toShort . TE.encodeUtf8
-- | Encode as UTF-16 LE 'OSIT.WindowsString'.
toWindowsString :: Text -> OSIT.WindowsString
toWindowsString = coerce . SBS.toShort . TE.encodeUtf16LE
-- | Encode to the platform's native 'OS.OsString'.
-- UTF-16 LE on Windows, UTF-8 on POSIX.
toOsString :: Text -> OS.OsString
toOsString = case OS.coercionToPlatformTypes of
Left{} -> coerce . toWindowsString
Right{} -> coerce . toPosixString
#endif