Можно ли построить в Conduit функцию (скажем, zipC2), которая бы превратила следующие источники:
series1 = yieldMany [2, 4, 6, 8, 16 :: Int]
series2 = yieldMany [1, 5, 6 :: Int]
в одну, которая выдала бы следующие пары (показанные здесь в виде списка):
[(Nothing, Just 1), (Just 2, Just 1), (Just 4, Just 1), (Just 4, Just 5), (Just 6, Just 6), (Just 8, Just 6), (Just 16, Just 6)]
Он вызывался бы с функцией сравнения следующим образом:
runConduitPure ( zipC2 (<=) series1 series1 .| sinkList )
Раньше в предыдущих версиях была функция mergeSources
, которая делала что-то относительно похожее (без эффекта памятихотя), но он исчез в самой последней версии (1.3.1).
Разъяснение о том, как работает функция : Идея состоит в том, чтобы взять 2 источника A (генерирует значения a ) и B (генерирует значения b ).
Затем мы генерируем пары:
Если a мы сначала строим (просто a, ничего)
Если b , это даст (ничего, просто b)
Если a == b , мы обновляем обе стороны и производим (Just a, Just b)
Значение изгоИсточник, который не был обновлен, не используется и используется для следующего раунда сравнений.Используются только обновленные значения.
Затем мы продолжаем обновлять пару в соответствии со значениями A и B относительно друг друга.
Другими словами: мы обновляем левую сторону пары, если a , правую сторону, если b , или обе стороны, если a == b * 1058.*.Любое неизрасходованное значение сохраняется в памяти для следующего цикла сравнения.