меня получилось, он работает, но я как всегда обеспокоен производительностью (конечно, ведь надо обрабатывать гигабайты JSON Pointers!)
Вот так написано в RFC 6901:
reference-token = *( unescaped / escaped )
unescaped = %x00-2E / %x30-7D / %x7F-10FFFF
; %x2F ('/') and %x7E ('~') are excluded from 'unescaped'
escaped = "~" ( "0" / "1" )
; representing '~' and '/', respectively
Вот так получилось у меня:
haskell
referenceTokenParser :: A.Parser T.Text
referenceTokenParser = T.pack <$> A.many' (unescaped <|> escaped)
where
unescaped :: A.Parser Char
unescaped = A.satisfy $ \x -> not (x == '~') && not (x == '/')
escaped :: A.Parser Char
escaped = (A.string "~0" *> pure '~') <|> (A.string "~1" *> pure '/')
Можно ли как-то ускорить это дело? (В документации к attoparsec написано, что takeWhile1 использовать лучше, чем many1 anyChar. Также я нашёл комбинатор peekChar, но немного не уверен, как его применять)
любой Юникод или только UTF-8?
Unicode string. Как я понимаю, кодировка там одна из этих: UTF-32LE, UTF-32BE, UTF-16LE, UTF16-BE, UTF-8.
а гигабайты у вас на входе в чём-то конкретном?
Ну, блин... Извините, что так плохо написал, но это была шутка, сарказм. Хочется, конечно, написать, чтобы оно работало быстрее. Вообще строку я буду получать из JSON объекта, так что там обязательно будет Text.
Обсуждают сегодня