packages feed

text-builder-1: library/TextBuilder/Domains/ByteString.hs

{-# LANGUAGE CPP #-}

module TextBuilder.Domains.ByteString where

import qualified Data.ByteString as ByteString
import qualified Data.Text.Array as TextArray
import TextBuilder.Prelude
import TextBuilderCore

#if !MIN_VERSION_text(2,0,0)
import qualified Data.Text.Encoding as TextEncoding
#endif

-- | UTF-8 bytestring. You can use it for converting ASCII values as well.
--
-- __Warning:__ It's your responsibility to ensure that the bytestring is properly encoded.
--
-- >>> unsafeUtf8ByteString "abc"
-- "abc"
--
-- >>> import Data.Text.Encoding (encodeUtf8)
-- >>> unsafeUtf8ByteString (encodeUtf8 "фывапролдж") == "фывапролдж"
-- True
{-# INLINEABLE unsafeUtf8ByteString #-}
unsafeUtf8ByteString :: ByteString -> TextBuilder
#if MIN_VERSION_text(2,0,0)
unsafeUtf8ByteString byteString =
  TextBuilder
    (ByteString.length byteString)
    ( \array ->
        -- TODO: Optimize to use memcpy or something similar.
        let step byte next index = do
              TextArray.unsafeWrite array index byte
              next (succ index)
         in ByteString.foldr step return byteString
    )
#else
-- Using a suboptimal solution here since the older version of \"text\" is becoming less important with time.
unsafeUtf8ByteString =
  text . TextEncoding.decodeUtf8
#endif