Библиотека Pipes.Aeson предоставляет следующую функцию:
decode :: (Monad m, ToJSON a) => Parser ByteString m (Either DecodingError a)
Если я использую evalStateT с этим синтаксическим анализатором и дескриптором файла в качестве аргумента, из файла считывается и анализируется один объект JSON.
Проблема в том, что файл содержит несколько объектов (все одного типа), и я хотел бы свернуть или уменьшить их по мере их чтения.
Pipes.Parse предоставляет:
foldAll :: Monad m => (x -> a -> x) -> x -> (x -> b) -> Parser a m b
но, как вы можете видеть, это возвращает новый синтаксический анализатор - я не могу придумать способ предоставить первый синтаксический анализатор в качестве аргумента.
Похоже, что Parser на самом деле является Producer в преобразователе монады StateT. Мне было интересно, есть ли способ извлечь Producer из StateT, чтобы evalStateT можно было применить к парсеру foldAll и Producer из парсера декодирования.
Хотя, наверное, это совершенно неправильный подход.
Коротко о моем вопросе:
Как при синтаксическом анализе файла с помощью Pipes.Aeson лучше всего свернуть все объекты в файле?