title: How to elegantly perform multiple effects in parallel with ZIO
body: <p>I know that I can use</p>
  
  <pre class="lang-scala prettyprint-override"><code>import zio.Task
  
  def zip3Par[A, B, C](a: Task[A], b: Task[B], c: Task[C]): Task[(A, B, C)] =
    a.zipPar(b).zipWithPar(c) { case ((a, b), c) =&gt; (a, b, c) }
  
  def zip4Par[A, B, C, D](a: Task[A], b: Task[B], c: Task[C], d: Task[D]): Task[(A, B, C, D)] =
    zip3Par(a, b, c).zipWithPar(d) { case ((a, b, c), d) =&gt; (a, b, c, d) }
  </code></pre>
  
  <p>to execute 3 or 4 tasks in parallel, but I wounder if there is a more elegant solution?</p>