Y at-il un moyen d'obtenir le premier UTF-8 Char
dans un ByteString
dans O (1) temps? Je cherche quelque chose commeObtenir un `Char` à partir d'un` ByteString`
headUtf8 :: ByteString -> Char
tailUtf8 :: ByteString -> ByteString
Je ne suis pas encore contraint d'utiliser stricte ou paresseux ByteString
, mais je préfère stricte. Pour ByteString
paresseux, je peux pavbler quelque chose ensemble via Text
, mais je ne suis pas sûr de l'efficacité (surtout de la complexité de l'espace) c'est.
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
Dans le cas où quelqu'un est intéressé, ce problème se pose lors de l'utilisation Alex pour faire un lexer qui prend en charge UTF-8 caractères .
Je sais que depuis Alex 3.0, vous ne devez fournir alexGetByte
(et ce qui est grand!), Mais je dois encore être en mesure d'obtenir des caractères dans tout autre code dans le lexer.
Je ne connaissais pas ce paquet existait, mais c'est exactement ce que je cherchais. Cela signifie que je peux éliminer complètement toute dépendance sur 'text'. – Alec
Wow! Cette bibliothèque minuscule a exactement la fonctionnalité dont j'ai besoin pour mon lexer. Merci beaucoup. – Alec
Gardez à l'esprit que ces fonctions sont partielles; ils sont indéfinis sur 'Data.ByteString.empty'. – chepner