Gibt es eine Möglichkeit, die erste UTF-8 Char
in einer ByteString
in O (1) Zeit zu bekommen? Ich bin auf der Suche nach so etwas wieErhalte ein `Char` von einem` ByteString`
headUtf8 :: ByteString -> Char
tailUtf8 :: ByteString -> ByteString
Ich bin noch nicht streng zu verwenden, eingeschränkt oder faul ByteString
, aber ich würde es vorziehen, streng. Für faule ByteString
kann ich etwas zusammen über , aber ich bin mir nicht sicher, wie effizient (vor allem Raum-Komplexität weise) dies ist.
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
Falls jemand daran interessiert ist, stellt sich dieses Problem, wenn Alex mit einem LEXER zu machen, die UTF-8-Zeichen unterstützt.
Ich bin mir bewusst, dass seit Alex 3.0 nur alexGetByte
zur Verfügung stellen müssen (und das ist großartig!), Aber ich brauche noch in der Lage sein Zeichen in der Lexer in anderen Code zu erhalten.
Ich wusste nicht, dass dieses Paket existiert, aber das ist genau das, wonach ich gesucht habe. Dies bedeutet, dass ich jegliche Abhängigkeit von "Text" vollständig eliminieren kann. – Alec
Wow! Diese kleine Bibliothek hat genau die Funktionalität, die ich für meinen Lexer brauche. Danke vielmals. – Alec
Denken Sie daran, dass diese Funktionen teilweise sind; Sie sind nicht definiert in 'Data.ByteString.empty'. – chepner