Conduit захотелось странного

49 views
Skip to first unread message

Александр Замараев

unread,
Jul 22, 2016, 6:19:54 AM7/22/16
to Русский Haskell
Обрабатываю conduit-ами логи апача. Логи большие и их много.
Центральная операция - сборка сессий реализована через Data.Conduit.List.concatMapAccum
Структура accum довольно сложная и операции с ней можно разбить на 2 группы:
  1. Обработка очередной строки лога
  2. Вычисление результата и очистка старых данных
Для ускорения очистка делается не на каждую строку а на каждую 1000-ую.
При этом теряются последние результаты (если число обработанных строк не кратно 1000)

Собственно вопрос: есть ли функция подобная concatMapAccum но с дополнительной пост обработкой accum в конце потока.
Если нет, то как её проще сделать?

Александр Замараев

unread,
Jul 23, 2016, 7:05:07 AM7/23/16
to Русский Haskell
Получилось вот такое:
concatMapDoneAccum
  :: Monad m => (a -> accum -> (accum, [b])) -> (accum -> [b])
  -> accum -> Conduit a m b
concatMapDoneAccum f done acc = do
  celt <- await
  case celt of
    Nothing -> do 
      let ret = done acc
      DF.mapM_ yield ret
      return ()
    Just elt -> do
      let (acc', ret) = f elt acc 
      DF.mapM_ yield ret
      concatMapDoneAccum f done acc'


Reply all
Reply to author
Forward
0 new messages