Плохо в этом разбираюсь, но всё же попробую прокомментировать:
Вначале импортируются модули из библиотек:
conduit - для работы с потоками данных (если я не ошибаюсь, раньше пользовались iteratee для этих целей);
http-conduit - "расширение" для Network.HTTP для работы с этим conduit;
Binary, ByteString - думаю, понятно - для преобразований типов данных.
Создаём
менеджер соединений из
дефолтных настроекmanager <- newManager def
Создаём запрос:
req <- parseUrl "http://localhost:8080/api/v1.0/streams/counter"
Затем дополняем заголовки в запросе:
let headers = requestHeaders req
req' = req {
requestHeaders = ("Accept", "application/x-json-stream") :
headers
}
"Безопасно" (тут я навряд ли смогу точно описать, лучше почитать
документацию) "запускается" монада. Что-то вроде try, только с потокобезопасностью и прочим.
runResourceT $ do
res <- http req' manager
responseBody res $$+- CB.lines =$ counterSink
Здесь вешаем (
=$) обработчик "counterSink", который будет ждать получения всех данных (
$$+-), причём уже в виде строк (
CB.lines).
Функция counterSink ждёт данные, и, если они пришли, выводит в stdout:
--------
<данные>