Разбор потока JSON с помощью pipe-ason

Учитывая простой пример типа JSON:

data Test = Test
  { name :: Text
  , age  :: Int
  } deriving (Show, Generic)

instance FromJSON Test

Как я могу использовать pipe-ason для декодирования потока сообщений JSON, поступающих через сокет, используя линзу decoded? В качестве примера я хотел бы просто распечатать их по мере их анализа:

main = connect "127.0.0.1" "8000" $ \(socket, _) -> $ runEffect $
  some use of zoom decoded? view decoded? >-> P.print

person jhickner    schedule 16.03.2015    source источник


Ответы (1)


decoded (тот, что из Pipes.Aeson.Unchecked) — это линза, которая преобразует производителя необработанных байтов в производителя проанализированных значений FromJSON.

Итак, мы должны сначала создать Producer байтов из сокета, используя fromSocket из пакета pipes-network. Что-то вроде этого:

-- to help with type inference
printTest :: (MonadIO m) => Consumer' Test m r
printTest = P.print

main = do
    connect "127.0.0.1" "8000" $ \(socket, _) -> $ runEffect $
        view decoded (fromSocket socket 4096) >-> printTest
    return ()
person danidiaz    schedule 16.03.2015
comment
Это должно быть fromSocket socket 4096? - person Itkovian; 11.05.2017