{-# 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