有沒有辦法在O(1)的時間內得到ByteString
中的第一個UTF-8 Char
?我正在尋找類似從`ByteString`獲取`Char`
headUtf8 :: ByteString -> Char
tailUtf8 :: ByteString -> ByteString
我還沒有限制使用嚴格或懶惰ByteString
,但我更喜歡嚴格。對於懶惰的ByteString
,我可以通過Text
拼湊一些東西,但我不確定這是多高效(特別是空間複雜性明智)。
import qualified Data.Text.Lazy as T
import Data.Text.Lazy.Encoding (decodeUtf8With, encodeUtf8)
import Data.Text.Encoding.Error (lenientDecode)
headUtf8 :: ByteString -> Char
headUtf8 = T.head . decodeUtf8With lenientDecode
tailUtf8 :: ByteString -> ByteString
tailUtf8 = encodeUtf8 . T.tail . decodeUtf8With lenientDecode
如果有人有興趣,該問題採用亞歷使支持UTF-8字符詞法分析器時出現。
我知道,因爲亞歷克斯3.0,你只需要提供alexGetByte
(這是偉大的!),但我仍然需要能夠得到其他代碼字符的詞法分析器。
我不知道這個包存在,但這正是我所期待的。這意味着我可以完全消除對「文本」的任何依賴。 – Alec
哇!這個小型庫恰恰具有我需要的詞法分析器的功能。萬分感謝。 – Alec
只要記住這些功能是部分的;它們在'Data.ByteString.empty'上是未定義的。 – chepner