假设我想写这样的东西:
-- | Decode a 'ByteString' containing Code Page 437 encoded text.
decodeCP437 :: ByteString -> Text
decodeCP437 = undefined
(我知道encoding
包,但它的依赖列表为这个单一付出的代价是荒谬的,而且我认为相当微不足道的功能。
我的问题是,如何以合理的效率从ByteString
构建Text
,特别是在不使用列表的情况下。在我看来,Data.Text.Encoding
应该是一个很好的灵感来源,但乍一看它使用withForeignPtr
,我想它对于我的用例来说太低了。
应该如何处理这个问题?简而言之,我想我需要不断地从ByteString
中获取字节(Word8
),将每个字节转换为相应的Char
,并以某种方式有效地从中构建Text
。Data.Text
Text
构造中基本建筑功能的复杂性并不奇怪,这表明一个接一个地附加字符并不是最好的主意,但我没有看到更好的工具。
更新:我想创建严格的Text
。似乎唯一的选择是创建构建器,然后从中获取懒惰Text
(O(n)),然后转换为严格Text
(O(n))。
构建器 API,它提供 O(1) singleton :: Char -> Builder
和 O(1) (<>) :: Builder -> Builder -> Builder
,以实现高效的施工操作。