@@ -17,8 +17,8 @@
1717module Data.Text.Lazy.Encoding
1818 (
1919 -- * Decoding ByteStrings to Text
20− -- decodeASCII
21− decodeUtf8
20+ decodeASCII
21+ , decodeUtf8
2222 , decodeUtf8With
2323 --, decodeUtf16LE
2424 --, decodeUtf16BE
@@ -27,29 +27,55 @@ module Data.Text.Lazy.Encoding
2727
2828 -- * Encoding Text to ByteStrings
2929 , encodeUtf8
30− --, encodeUtf16LE
31− --, encodeUtf16BE
32− --, encodeUtf32LE
33− --, encodeUtf32BE
30+ , encodeUtf16LE
31+ , encodeUtf16BE
32+ , encodeUtf32LE
33+ , encodeUtf32BE
3434 ) where
3535
36−import Data.ByteString.Lazy (ByteString)
36+import qualified Data.ByteString.Lazy as B
3737import Data.Text.Encoding.Error (OnDecodeError, strictDecode)
38−import Data.Text.Lazy (Text)
38+import qualified Data.Text.Encoding as TE
3939import qualified Data.Text.Lazy.Fusion as F
40+import Data.Text.Lazy.Internal (Text(..), chunk, foldrChunks)
4041import qualified Data.Text.Lazy.Encoding.Fusion as E
4142
43+-- | Decode a 'ByteString' containing 7-bit ASCII encoded text.
44+decodeASCII :: B.ByteString -> Text
45+decodeASCII bs = foldr (chunk . TE.decodeASCII) Empty (B.toChunks bs)
46+{-# INLINE decodeASCII #-}
47+
4248-- | Decode a 'ByteString' containing UTF-8 encoded text.
43−decodeUtf8With :: OnDecodeError -> ByteString -> Text
49+decodeUtf8With :: OnDecodeError -> B.ByteString -> Text
4450decodeUtf8With onErr bs = F.unstream (E.streamUtf8 onErr bs)
4551{-# INLINE decodeUtf8With #-}
4652
4753-- | Decode a 'ByteString' containing UTF-8 encoded text.
48−decodeUtf8 :: ByteString -> Text
54+decodeUtf8 :: B.ByteString -> Text
4955decodeUtf8 = decodeUtf8With strictDecode
5056{-# INLINE decodeUtf8 #-}
5157
5258-- | Encode text using UTF-8 encoding.
53−encodeUtf8 :: Text -> ByteString
59+encodeUtf8 :: Text -> B.ByteString
5460encodeUtf8 txt = E.unstream (E.restreamUtf8 (F.stream txt))
5561{-# INLINE encodeUtf8 #-}
62+
63+-- | Encode text using little endian UTF-16 encoding.
64+encodeUtf16LE :: Text -> B.ByteString
65+encodeUtf16LE txt = B.fromChunks (foldrChunks ((:) . TE.encodeUtf16LE) [] txt)
66+{-# INLINE encodeUtf16LE #-}
67+
68+-- | Encode text using big endian UTF-16 encoding.
69+encodeUtf16BE :: Text -> B.ByteString
70+encodeUtf16BE txt = B.fromChunks (foldrChunks ((:) . TE.encodeUtf16BE) [] txt)
71+{-# INLINE encodeUtf16BE #-}
72+
73+-- | Encode text using little endian UTF-32 encoding.
74+encodeUtf32LE :: Text -> B.ByteString
75+encodeUtf32LE txt = B.fromChunks (foldrChunks ((:) . TE.encodeUtf32LE) [] txt)
76+{-# INLINE encodeUtf32LE #-}
77+
78+-- | Encode text using big endian UTF-32 encoding.
79+encodeUtf32BE :: Text -> B.ByteString
80+encodeUtf32BE txt = B.fromChunks (foldrChunks ((:) . TE.encodeUtf32BE) [] txt)
81+{-# INLINE encodeUtf32BE #-}