如何编写从 ByteString 到 Text 的自定义解码函数
How to approach writing of custom decoding function from `ByteString` to `Text`
假设我想写这样的东西:
-- | 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
。 basic building functions in Data.Text
for Text
构造的复杂性并不令人惊讶地表明一个接一个地附加字符不是最好的主意,但我没有看到更好的工具可用。
更新:我想创建严格 Text
。似乎唯一的选择是创建构建器然后从中获取惰性 Text
(O(n)),然后转换为严格 Text
(O(n)).
您可以使用 Builder API,它提供 O(1) singleton :: Char -> Builder
和 O(1) (<>) :: Builder -> Builder -> Builder
的高效构造操作。
假设我想写这样的东西:
-- | 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
。 basic building functions in Data.Text
for Text
构造的复杂性并不令人惊讶地表明一个接一个地附加字符不是最好的主意,但我没有看到更好的工具可用。
更新:我想创建严格 Text
。似乎唯一的选择是创建构建器然后从中获取惰性 Text
(O(n)),然后转换为严格 Text
(O(n)).
您可以使用 Builder API,它提供 O(1) singleton :: Char -> Builder
和 O(1) (<>) :: Builder -> Builder -> Builder
的高效构造操作。