@@ -72,6 +72,9 @@ module Streamly.Internal.Unicode.Stream
72 , decodeUtf8ArraysD'
72 , decodeUtf8ArraysD'
73 , decodeUtf8ArraysD_
73 , decodeUtf8ArraysD_
75+ -- * Decoding String Literals
75 -- * Deprecations
78 -- * Deprecations
76 , decodeUtf8Lax
79 , decodeUtf8Lax
77 , encodeLatin1Lax
80 , encodeLatin1Lax
@@ -94,6 +97,7 @@ import Foreign.Marshal.Alloc (mallocBytes)
94import Foreign.Storable (Storable(..))
97import Foreign.Storable (Storable(..))
95import Fusion.Plugin.Types (Fuse(..))
98import Fusion.Plugin.Types (Fuse(..))
96import GHC.Base (assert, unsafeChr)
99import GHC.Base (assert, unsafeChr)
100+import GHC.Exts (Addr#)
97import GHC.IO.Encoding.Failure (isSurrogate)
101import GHC.IO.Encoding.Failure (isSurrogate)
98import GHC.Ptr (Ptr (..), plusPtr)
102import GHC.Ptr (Ptr (..), plusPtr)
99import System.IO.Unsafe (unsafePerformIO)
103import System.IO.Unsafe (unsafePerformIO)
@@ -114,6 +118,7 @@ import qualified Streamly.Internal.Data.Fold as Fold
114import qualified Streamly.Internal.Data.Unfold as Unfold
118import qualified Streamly.Internal.Data.Unfold as Unfold
115import qualified Streamly.Internal.Data.Parser as Parser
119import qualified Streamly.Internal.Data.Parser as Parser
116import qualified Streamly.Internal.Data.Parser.ParserD as ParserD
120import qualified Streamly.Internal.Data.Parser.ParserD as ParserD
121+import qualified Streamly.Internal.Data.Stream as Stream
117import qualified Streamly.Internal.Data.Stream.Serial as Serial
122import qualified Streamly.Internal.Data.Stream.Serial as Serial
118import qualified Streamly.Internal.Data.Array.Unboxed as Array
123import qualified Streamly.Internal.Data.Array.Unboxed as Array
119import qualified Streamly.Internal.Data.Array.Unboxed.Type as A
124import qualified Streamly.Internal.Data.Array.Unboxed.Type as A
@@ -124,9 +129,11 @@ import Prelude hiding (lines, words, unlines, unwords)
132+-- >>> :set -XMagicHash
127-- >>> import Prelude hiding (lines, words, unlines, unwords)
133-- >>> import Prelude hiding (lines, words, unlines, unwords)
128-- >>> import qualified Streamly.Prelude as Stream
134-- >>> import qualified Streamly.Prelude as Stream
129-- >>> import qualified Streamly.Data.Fold as Fold
135-- >>> import qualified Streamly.Data.Fold as Fold
136+-- >>> import qualified Streamly.Internal.Unicode.Stream as Unicode
130-- >>> import Streamly.Internal.Unicode.Stream
137-- >>> import Streamly.Internal.Unicode.Stream
132-------------------------------------------------------------------------------
139-------------------------------------------------------------------------------
@@ -980,6 +987,25 @@ encodeUtf8_ = fromStreamD . encodeUtf8D_ . toStreamD
980encodeUtf8Lax :: (IsStream t, Monad m) => t m Char -> t m Word8
987encodeUtf8Lax :: (IsStream t, Monad m) => t m Char -> t m Word8
981encodeUtf8Lax = encodeUtf8
988encodeUtf8Lax = encodeUtf8
990+-------------------------------------------------------------------------------
991+-- Decoding string literals
992+-------------------------------------------------------------------------------
994+-- | Read UTF-8 encoded bytes as chars from an 'Addr#' until a 0 byte is
995+-- encountered, the 0 byte is not included in the stream.
997+-- /Unsafe:/ The caller is responsible for safe addressing.
999+-- Note that this is completely safe when reading from Haskell string
1000+-- literals because they are guaranteed to be NULL terminated:
1002+-- >>> Stream.fold Fold.toList (Unicode.fromStr# "Haskell"#)
1005+{-# INLINE fromStr# #-}
1006+fromStr# :: MonadIO m => Addr# -> SerialT m Char
1007+fromStr# addr = decodeUtf8 $ Stream.fromByteStr# addr
983-------------------------------------------------------------------------------
1009-------------------------------------------------------------------------------
984-- Encode streams of containers
1010-- Encode streams of containers
985-------------------------------------------------------------------------------
1011-------------------------------------------------------------------------------