zipWithM package:streamly

Like zipWith but using a monadic zipping function.
Evaluates the streams being zipped in separate threads than the consumer. The zip function is evaluated in the consumer thread.
>>> parZipWithM cfg f m1 m2 = Stream.zipWithM f (Stream.parEval cfg m1) (Stream.parEval cfg m2)
Multi-stream concurrency options won't apply here, see the notes in parEval. If you want to evaluate the zip function as well in a separate thread, you can use a parEval on parZipWithM.