@@ -115,7 +115,32 @@ fromText t@(Text arr off l)
115115 | S.null t = empty
116116 | l <= copyLimit = writeN l $ \marr o -> unsafeCopy arr off marr o l
117117 | otherwise = flush `append` mapBuilder (t :)
118−{-# INLINE fromText #-}
118+{-# INLINE [1] fromText #-}
119+
120+{-# RULES
121+"fromText/pack" forall s .
122+ fromText (S.pack s) = fromString s
123+ #-}
124+
125+-- | /O(1)./ A Builder taking a 'String', satisfying
126+--
127+-- * @'toLazyText' ('fromString' s) = 'L.fromChunks' [S.pack s]@
128+--
129+fromString :: String -> Builder
130+fromString str = Builder $ \k (Buffer p0 o0 u0 l0) ->
131+ let loop marr !o !u !l [] = k (Buffer marr o u l)
132+ loop marr o u l s@(c:cs)
133+ | l <= 1 = do
134+ arr <- A.unsafeFreeze marr
135+ let !t = Text arr o u
136+ marr' <- A.unsafeNew defaultChunkSize
137+ ts <- inlineInterleaveST (loop marr' 0 0 defaultChunkSize s)
138+ return $ t : ts
139+ | otherwise = do
140+ n <- unsafeWrite marr (o+u) c
141+ loop marr o (u+n) (l-n) cs
142+ in loop p0 o0 u0 l0 str
143+{-# INLINE fromString #-}
119144
120145-- | /O(1)./ A Builder taking a lazy 'L.Text', satisfying
121146--
@@ -236,6 +261,25 @@ unsafeCopy src sidx dest didx count =
236261 copy_loop (i+1) (j+1) (c+1)
237262{-# INLINE unsafeCopy #-}
238263
264+-- Write a character to the array, starting at the specified offset
265+-- @i@. Returns the number of elements written.
266+unsafeWrite :: A.MArray s Word16 -> Int -> Char -> ST s Int
267+unsafeWrite marr i c
268+ | n < 0x10000 = do
269+ assert (i >= 0) . assert (i < A.length marr) $
270+ A.unsafeWrite marr i (fromIntegral n)
271+ return 1
272+ | otherwise = do
273+ assert (i >= 0) . assert (i < A.length marr - 1) $
274+ A.unsafeWrite marr i lo
275+ A.unsafeWrite marr (i+1) hi
276+ return 2
277+ where n = ord c
278+ m = n - 0x10000
279+ lo = fromIntegral $ (m `shiftR` 10) + 0xD800
280+ hi = fromIntegral $ (m .&. 0x3FF) + 0xDC00
281+{-# INLINE unsafeWrite #-}
282+
239283------------------------------------------------------------------------
240284-- Some nice rules for Builder
241285