    {-# LANGUAGE BangPatterns #-}
    {-# LANGUAGE CPP          #-}
    module Data.Aeson.Internal.Text (
        unsafeDecodeASCII,
    ) where

    import           Data.ByteString                (ByteString)
    import qualified Data.Text                      as T

    #if MIN_VERSION_text(2,0,0)
    import           Data.Text.Array                (Array (..))
    import qualified Data.Text.Internal             as T (Text (..))

    import qualified Data.ByteString.Short.Internal as SBS

    import           Data.Aeson.Internal.ByteString

    #else
    import qualified Data.Text.Encoding             as TE

    #endif

    -- | The input is assumed to contain only 7bit ASCII characters (i.e. @< 0x80@).
    --   We use TE.decodeLatin1 here because TE.decodeASCII is currently (text-1.2.4.0)
    --   deprecated and equal to TE.decodeUtf8, which is slower than TE.decodeLatin1.
    unsafeDecodeASCII :: ByteString -> T.Text

    #if MIN_VERSION_text(2,0,0)
    unsafeDecodeASCII :: ByteString -> Text
    unsafeDecodeASCII ByteString
    bs = ByteString -> (ForeignPtr Word8 -> Int -> Text) -> Text
    forall r. ByteString -> (ForeignPtr Word8 -> Int -> r) -> r
    withBS ByteString
    bs ((ForeignPtr Word8 -> Int -> Text) -> Text)
    -> (ForeignPtr Word8 -> Int -> Text) -> Text
    forall a b. (a -> b) -> a -> b
    $ \ForeignPtr Word8
    _fp Int
    len -> if Int
    len Int -> Int -> Bool
    forall a. Eq a => a -> a -> Bool
    == Int
    0 then Text
    T.empty else
      let !(SBS.SBS ByteArray#
    arr) = ByteString -> ShortByteString
    SBS.toShort ByteString
    bs in Array -> Int -> Int -> Text
    T.Text (ByteArray# -> Array
    ByteArray ByteArray#
    arr) Int
    0 Int
    len

    #else
    unsafeDecodeASCII = TE.decodeLatin1
    #endif