假设我想写这样的东西:
-- | Decode a 'ByteString' containing Code Page 437 encoded text.
decodeCP437 :: ByteString -> Text
decodeCP437 = undefined
(我知道encoding
包,但它的依赖列表是支付这个单一的荒谬价格,我相信相当简单的功能。)
我的问题是如何以合理的效率从Text
构建ByteString
,特别是不使用列表。在我看来,Data.Text.Encoding
应该是一个很好的灵感来源,但乍一看它使用withForeignPtr
,我想这对我的用例来说太低了。
应如何处理问题?简而言之,我想我需要不断从Word8
获取字节(ByteString
),将每个字节转换为相应的Char
,并以某种方式从它们有效地构建Text
。 Data.Text
Text
Text
中basic building functions的复杂性并不令人惊讶地表明逐个追加字符不是最佳选择,但我看不到更好的工具。
更新:我想创建严格的Text
。似乎唯一的选择是创建构建器,然后从中获取惰性Text
(O(n)),然后转换为严格id
(O(n))。
答案 0 :(得分:4)
您可以使用Builder API,它提供O(1)singleton :: Char -> Builder
和O(1)(<>) :: Builder -> Builder -> Builder
,以进行有效的构建操作。