Repository: 7mind/izumi
Pull request #1045 (2020-05-07 19:51:17)

Split ZIO BIOLocal instance from BIOAsync
* Add test for soundness of 3to2 conversion
* remove redundant variance in typeclass method with a single parameter list
* doc: update bio hierarchy graphs


Patch:
diff --git a/doc/microsite/src/main/tut/bio/media/bio-hierarchy.svg b/doc/microsite/src/main/tut/bio/media/bio-hierarchy.svg
index a3ba37f2a..338ab072d 100644
--- a/doc/microsite/src/main/tut/bio/media/bio-hierarchy.svg
+++ b/doc/microsite/src/main/tut/bio/media/bio-hierarchy.svg
@@ -11,6 +11,7 @@
 [BIOBracket3]&lt;:--[BIOPanic3]
 [BIOPanic3]&lt;:--[BIO3]
 [BIO3]&lt;:--[BIOAsync3]
+[BIOParallel3]&lt;:--[BIOAsync3]
 [BIOAsync3]&lt;:--[BIOTemporal3]
 
 [BIOProfunctor]&lt;:--[BIOArrow]
@@ -18,8 +19,7 @@
 [BIOArrowChoice]&lt;:--[BIOLocal]
 
 [BIOAsk]&lt;:--[BIOMonadAsk]
-[BIOMonadAsk]&lt;:--[BIOLocal]
-</desc>
+[BIOMonadAsk]&lt;:--[BIOLocal]</desc>
   <path d="M83.5 186.5 L83.5 206.5 L134.2 226.5 L134.2 226.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
   <path d="M88.8 199.8 L83.5 199.8 L78.2 199.8 L83.5 186.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
   <path d="M335.5 44.5 L335.5 64.5 L335.5 84.5 L335.5 84.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
@@ -40,10 +40,12 @@
   <path d="M250.8 412.8 L245.5 412.8 L240.2 412.8 L245.5 399.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
   <path d="M245.5 470.5 L245.5 490.5 L245.5 510.5 L245.5 510.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
   <path d="M250.8 483.8 L245.5 483.8 L240.2 483.8 L245.5 470.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
-  <path d="M245.5 541.5 L245.5 561.5 L245.5 581.5 L245.5 581.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
+  <path d="M245.5 541.5 L245.5 561.5 L282.7 581.5 L282.7 581.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
   <path d="M250.8 554.8 L245.5 554.8 L240.2 554.8 L245.5 541.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
-  <path d="M245.5 612.5 L245.5 632.5 L245.5 652.5 L245.5 652.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
-  <path d="M250.8 625.8 L245.5 625.8 L240.2 625.8 L245.5 612.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
+  <path d="M377.5 541.5 L377.5 561.5 L340.3 581.5 L340.3 581.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
+  <path d="M382.8 554.8 L377.5 554.8 L372.2 554.8 L377.5 541.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
+  <path d="M311.5 612.5 L311.5 632.5 L311.5 652.5 L311.5 652.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
+  <path d="M316.8 625.8 L311.5 625.8 L306.2 625.8 L311.5 612.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
   <path d="M545.3 44.5 L545.3 64.5 L545.3 84.5 L545.3 84.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
   <path d="M550.6 57.8 L545.3 57.8 L539.9 57.8 L545.3 44.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
   <path d="M545.3 115.5 L545.3 135.5 L545.3 155.5 L545.3 155.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
@@ -74,10 +76,12 @@
   <text x="245.5" y="461" style="fill: #33322E;text-anchor: middle;">BIOPanic3</text>
   <rect x="218.5" y="510.5" height="31" width="54" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
   <text x="245.5" y="532" style="fill: #33322E;text-anchor: middle;">BIO3</text>
-  <rect x="194.5" y="581.5" height="31" width="102" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
-  <text x="245.5" y="603" style="fill: #33322E;text-anchor: middle;">BIOAsync3</text>
-  <rect x="180.5" y="652.5" height="31" width="130" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
-  <text x="245.5" y="674" style="fill: #33322E;text-anchor: middle;">BIOTemporal3</text>
+  <rect x="260.5" y="581.5" height="31" width="102" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
+  <text x="311.5" y="603" style="fill: #33322E;text-anchor: middle;">BIOAsync3</text>
+  <rect x="312.5" y="510.5" height="31" width="130" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
+  <text x="377.5" y="532" style="fill: #33322E;text-anchor: middle;">BIOParallel3</text>
+  <rect x="246.5" y="652.5" height="31" width="130" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
+  <text x="311.5" y="674" style="fill: #33322E;text-anchor: middle;">BIOTemporal3</text>
   <rect x="475.5" y="13.5" height="31" width="140" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
   <text x="545.5" y="35" style="fill: #33322E;text-anchor: middle;">BIOProfunctor</text>
   <rect x="499.5" y="84.5" height="31" width="92" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
diff --git a/doc/microsite/src/main/tut/bio/media/bio-relationship-hierarchy.svg b/doc/microsite/src/main/tut/bio/media/bio-relationship-hierarchy.svg
index 0565d4012..770b660d0 100644
--- a/doc/microsite/src/main/tut/bio/media/bio-relationship-hierarchy.svg
+++ b/doc/microsite/src/main/tut/bio/media/bio-relationship-hierarchy.svg
@@ -1,7 +1,6 @@
-<svg version="1.1" baseProfile="full" width="806.5" height="696" viewbox="0 0 806.5 696" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" style="font-weight:bold; font-size:12pt; font-family:'Calibri', Helvetica, sans-serif;;stroke-width:3;stroke-linejoin:round;stroke-linecap:round">
+<svg version="1.1" baseProfile="full" width="836.5" height="696" viewbox="0 0 836.5 696" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" style="font-weight:bold; font-size:12pt; font-family:'Calibri', Helvetica, sans-serif;;stroke-width:3;stroke-linejoin:round;stroke-linecap:round">
   <title >nomnoml</title>
-  <desc >
-[BIOFunctor3]&lt;:--[BIOBifunctor3]
+  <desc >[BIOFunctor3]&lt;:--[BIOBifunctor3]
 [BIOBifunctor3]&lt;:--[BIOError3]
 [BIOFunctor3]&lt;:--[BIOApplicative3]
 [BIOApplicative3]&lt;:--[BIOGuarantee3]
@@ -13,6 +12,8 @@
 [BIOBracket3]&lt;:--[BIOPanic3]
 [BIOPanic3]&lt;:--[BIO3]
 [BIO3]&lt;:--[BIOAsync3]
+[BIOMonad3]&lt;:--[BIOParallel3]
+[BIOParallel3]&lt;:--[BIOAsync3]
 [BIOAsync3]&lt;:--[BIOTemporal3]
 
 [BIOFunctor3]&lt;:--[BIOProfunctor]
@@ -23,84 +24,89 @@
 [BIOApplicative3]&lt;:--[BIOAsk]
 [BIOMonad3]&lt;:--[BIOMonadAsk]
 [BIOAsk]&lt;:--[BIOMonadAsk]
-[BIOMonadAsk]&lt;:--[BIOLocal]
-</desc>
-  <path d="M366 35.3 L83.5 64.5 L83.5 100 L83.5 100 L83.5 135.5 L83.5 135.5 L83.5 155.5 L83.5 155.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
-  <path d="M353.3 41.9 L352.7 36.6 L352.2 31.3 L366 35.3 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
-  <path d="M83.5 186.5 L83.5 206.5 L130.7 226.5 L130.7 226.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
+[BIOMonadAsk]&lt;:--[BIOLocal]</desc>
+  <path d="M396 34.8 L83.5 64.5 L83.5 100 L83.5 100 L83.5 135.5 L83.5 135.5 L83.5 155.5 L83.5 155.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
+  <path d="M383.2 41.3 L382.7 36 L382.2 30.7 L396 34.8 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
+  <path d="M83.5 186.5 L83.5 206.5 L119.4 226.5 L119.4 226.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
   <path d="M88.8 199.8 L83.5 199.8 L78.2 199.8 L83.5 186.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
-  <path d="M426.5 44.5 L426.5 64.5 L426.5 84.5 L426.5 84.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
-  <path d="M431.8 57.8 L426.5 57.8 L421.2 57.8 L426.5 44.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
-  <path d="M355.3 115.5 L263.5 135.5 L263.5 155.5 L263.5 155.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
-  <path d="M343.4 123.5 L342.3 118.3 L341.2 113.1 L355.3 115.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
-  <path d="M426.5 115.5 L426.5 135.5 L426.5 155.5 L426.5 155.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
-  <path d="M431.8 128.8 L426.5 128.8 L421.2 128.8 L426.5 115.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
-  <path d="M263.5 186.5 L263.5 206.5 L209.3 226.5 L209.3 226.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
+  <path d="M456.5 44.5 L456.5 64.5 L456.5 84.5 L456.5 84.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
+  <path d="M461.8 57.8 L456.5 57.8 L451.2 57.8 L456.5 44.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
+  <path d="M377 114.6 L263.5 135.5 L263.5 155.5 L263.5 155.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
+  <path d="M364.9 122.3 L363.9 117 L362.9 111.8 L377 114.6 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
+  <path d="M456.5 115.5 L456.5 135.5 L456.5 155.5 L456.5 155.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
+  <path d="M461.8 128.8 L456.5 128.8 L451.2 128.8 L456.5 115.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
+  <path d="M263.5 186.5 L263.5 206.5 L198 226.5 L198 226.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
   <path d="M268.8 199.8 L263.5 199.8 L258.2 199.8 L263.5 186.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
-  <path d="M167.3 257.5 L167.3 277.5 L192.9 297.5 L192.9 297.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
-  <path d="M172.6 270.8 L167.3 270.8 L161.9 270.8 L167.3 257.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
-  <path d="M410.8 186.5 L390.5 206.5 L390.5 242 L390.5 242 L390.5 277.5 L390.5 277.5 L289.8 297.6 L289.8 297.6 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
-  <path d="M405 199.7 L401.3 195.9 L397.5 192.1 L410.8 186.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
-  <path d="M212.8 328.5 L212.8 348.5 L212.8 368.5 L212.8 368.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
-  <path d="M218.1 341.8 L212.8 341.8 L207.4 341.8 L212.8 328.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
-  <path d="M212.8 399.5 L212.8 419.5 L212.8 439.5 L212.8 439.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
-  <path d="M218.1 412.8 L212.8 412.8 L207.4 412.8 L212.8 399.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
-  <path d="M212.8 470.5 L212.8 490.5 L212.8 510.5 L212.8 510.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
-  <path d="M218.1 483.8 L212.8 483.8 L207.4 483.8 L212.8 470.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
-  <path d="M212.8 541.5 L212.8 561.5 L212.8 581.5 L212.8 581.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
-  <path d="M218.1 554.8 L212.8 554.8 L207.4 554.8 L212.8 541.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
-  <path d="M212.8 612.5 L212.8 632.5 L212.8 652.5 L212.8 652.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
-  <path d="M218.1 625.8 L212.8 625.8 L207.4 625.8 L212.8 612.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
-  <path d="M487 36.3 L719.5 64.5 L719.5 84.5 L719.5 84.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
-  <path d="M500.9 32.6 L500.2 37.9 L499.6 43.2 L487 36.3 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
-  <path d="M719.5 115.5 L719.5 135.5 L719.5 155.5 L719.5 155.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
-  <path d="M724.8 128.8 L719.5 128.8 L714.2 128.8 L719.5 115.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
-  <path d="M719.5 186.5 L719.5 206.5 L719.5 226.5 L719.5 226.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
-  <path d="M724.8 199.8 L719.5 199.8 L714.2 199.8 L719.5 186.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
-  <path d="M719.5 257.5 L719.5 277.5 L669.6 297.5 L669.6 297.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
-  <path d="M724.8 270.8 L719.5 270.8 L714.2 270.8 L719.5 257.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
-  <path d="M489 115.5 L569.8 135.5 L569.8 155.5 L569.8 155.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
-  <path d="M503.3 113.5 L502 118.7 L500.7 123.9 L489 115.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
-  <path d="M448.9 186.5 L477.8 206.5 L514.2 226.5 L514.2 226.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
-  <path d="M462.9 189.7 L459.8 194.1 L456.8 198.5 L448.9 186.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
-  <path d="M569.8 186.5 L569.8 206.5 L554.4 226.5 L554.4 226.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
-  <path d="M575.1 199.8 L569.8 199.8 L564.4 199.8 L569.8 186.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
-  <path d="M542.5 257.5 L542.5 277.5 L592.4 297.5 L592.4 297.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
-  <path d="M547.8 270.8 L542.5 270.8 L537.2 270.8 L542.5 257.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
-  <rect x="366.5" y="13.5" height="31" width="121" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
-  <text x="427" y="35" style="fill: #33322E;text-anchor: middle;">BIOFunctor3</text>
+  <path d="M147.3 257.5 L147.3 277.5 L172.9 297.5 L172.9 297.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
+  <path d="M152.6 270.8 L147.3 270.8 L141.9 270.8 L147.3 257.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
+  <path d="M419 186.5 L370.5 206.5 L370.5 242 L370.5 242 L370.5 277.5 L370.5 277.5 L269.8 297.6 L269.8 297.6 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
+  <path d="M408.7 196.5 L406.6 191.6 L404.6 186.7 L419 186.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
+  <path d="M192.8 328.5 L192.8 348.5 L192.8 368.5 L192.8 368.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
+  <path d="M198.1 341.8 L192.8 341.8 L187.4 341.8 L192.8 328.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
+  <path d="M192.8 399.5 L192.8 419.5 L192.8 439.5 L192.8 439.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
+  <path d="M198.1 412.8 L192.8 412.8 L187.4 412.8 L192.8 399.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
+  <path d="M192.8 470.5 L192.8 490.5 L192.8 510.5 L192.8 510.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
+  <path d="M198.1 483.8 L192.8 483.8 L187.4 483.8 L192.8 470.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
+  <path d="M192.8 541.5 L192.8 561.5 L229.9 581.5 L229.9 581.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
+  <path d="M198.1 554.8 L192.8 554.8 L187.4 554.8 L192.8 541.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
+  <path d="M456.5 186.5 L456.5 206.5 L456.5 242 L456.5 242 L456.5 277.5 L456.5 277.5 L456.5 313 L456.5 313 L456.5 348.5 L456.5 348.5 L456.5 384 L456.5 384 L456.5 419.5 L456.5 419.5 L456.5 455 L456.5 455 L456.5 490.5 L456.5 490.5 L456.5 510.5 L456.5 510.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
+  <path d="M461.8 199.8 L456.5 199.8 L451.2 199.8 L456.5 186.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
+  <path d="M456.5 541.5 L456.5 561.5 L309.8 587.8 L309.8 587.8 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
+  <path d="M461.8 554.8 L456.5 554.8 L451.2 554.8 L456.5 541.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
+  <path d="M258.8 612.5 L258.8 632.5 L258.8 652.5 L258.8 652.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
+  <path d="M264.1 625.8 L258.8 625.8 L253.4 625.8 L258.8 612.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
+  <path d="M517 36.3 L749.5 64.5 L749.5 84.5 L749.5 84.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
+  <path d="M530.9 32.6 L530.2 37.9 L529.6 43.2 L517 36.3 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
+  <path d="M749.5 115.5 L749.5 135.5 L749.5 155.5 L749.5 155.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
+  <path d="M754.8 128.8 L749.5 128.8 L744.2 128.8 L749.5 115.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
+  <path d="M749.5 186.5 L749.5 206.5 L749.5 226.5 L749.5 226.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
+  <path d="M754.8 199.8 L749.5 199.8 L744.2 199.8 L749.5 186.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
+  <path d="M749.5 257.5 L749.5 277.5 L710.9 297.5 L710.9 297.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
+  <path d="M754.8 270.8 L749.5 270.8 L744.2 270.8 L749.5 257.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
+  <path d="M519 115.5 L599.8 135.5 L599.8 155.5 L599.8 155.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
+  <path d="M533.3 113.5 L532 118.7 L530.7 123.9 L519 115.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
+  <path d="M487.6 186.5 L527.8 206.5 L553 226.5 L553 226.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
+  <path d="M501.9 187.7 L499.5 192.4 L497.2 197.2 L487.6 186.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
+  <path d="M599.8 186.5 L599.8 206.5 L584.4 226.5 L584.4 226.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
+  <path d="M605.1 199.8 L599.8 199.8 L594.4 199.8 L599.8 186.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
+  <path d="M572.5 257.5 L572.5 277.5 L635 297.9 L635 297.9 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
+  <path d="M577.8 270.8 L572.5 270.8 L567.2 270.8 L572.5 257.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
+  <rect x="396.5" y="13.5" height="31" width="121" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
+  <text x="457" y="35" style="fill: #33322E;text-anchor: middle;">BIOFunctor3</text>
   <rect x="13.5" y="155.5" height="31" width="140" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
   <text x="83.5" y="177" style="fill: #33322E;text-anchor: middle;">BIOBifunctor3</text>
-  <rect x="116.5" y="226.5" height="31" width="102" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
-  <text x="167.5" y="248" style="fill: #33322E;text-anchor: middle;">BIOError3</text>
-  <rect x="347.5" y="84.5" height="31" width="159" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
-  <text x="427" y="106" style="fill: #33322E;text-anchor: middle;">BIOApplicative3</text>
+  <rect x="96.5" y="226.5" height="31" width="102" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
+  <text x="147.5" y="248" style="fill: #33322E;text-anchor: middle;">BIOError3</text>
+  <rect x="377.5" y="84.5" height="31" width="159" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
+  <text x="457" y="106" style="fill: #33322E;text-anchor: middle;">BIOApplicative3</text>
   <rect x="193.5" y="155.5" height="31" width="140" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
   <text x="263.5" y="177" style="fill: #33322E;text-anchor: middle;">BIOGuarantee3</text>
-  <rect x="373.5" y="155.5" height="31" width="106" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
-  <text x="426.5" y="177" style="fill: #33322E;text-anchor: middle;">BIOMonad3</text>
-  <rect x="135.5" y="297.5" height="31" width="154" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
-  <text x="212.5" y="319" style="fill: #33322E;text-anchor: middle;">BIOMonadError3</text>
-  <rect x="152.5" y="368.5" height="31" width="121" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
-  <text x="213" y="390" style="fill: #33322E;text-anchor: middle;">BIOBracket3</text>
-  <rect x="161.5" y="439.5" height="31" width="102" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
-  <text x="212.5" y="461" style="fill: #33322E;text-anchor: middle;">BIOPanic3</text>
-  <rect x="185.5" y="510.5" height="31" width="54" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
-  <text x="212.5" y="532" style="fill: #33322E;text-anchor: middle;">BIO3</text>
-  <rect x="161.5" y="581.5" height="31" width="102" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
-  <text x="212.5" y="603" style="fill: #33322E;text-anchor: middle;">BIOAsync3</text>
-  <rect x="147.5" y="652.5" height="31" width="130" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
-  <text x="212.5" y="674" style="fill: #33322E;text-anchor: middle;">BIOTemporal3</text>
-  <rect x="649.5" y="84.5" height="31" width="140" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
-  <text x="719.5" y="106" style="fill: #33322E;text-anchor: middle;">BIOProfunctor</text>
-  <rect x="673.5" y="155.5" height="31" width="92" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
-  <text x="719.5" y="177" style="fill: #33322E;text-anchor: middle;">BIOArrow</text>
-  <rect x="645.5" y="226.5" height="31" width="149" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
-  <text x="720" y="248" style="fill: #33322E;text-anchor: middle;">BIOArrowChoice</text>
-  <rect x="585.5" y="297.5" height="31" width="92" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
-  <text x="631.5" y="319" style="fill: #33322E;text-anchor: middle;">BIOLocal</text>
-  <rect x="533.5" y="155.5" height="31" width="73" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
-  <text x="570" y="177" style="fill: #33322E;text-anchor: middle;">BIOAsk</text>
-  <rect x="480.5" y="226.5" height="31" width="125" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
-  <text x="543" y="248" style="fill: #33322E;text-anchor: middle;">BIOMonadAsk</text>
+  <rect x="403.5" y="155.5" height="31" width="106" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
+  <text x="456.5" y="177" style="fill: #33322E;text-anchor: middle;">BIOMonad3</text>
+  <rect x="115.5" y="297.5" height="31" width="154" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
+  <text x="192.5" y="319" style="fill: #33322E;text-anchor: middle;">BIOMonadError3</text>
+  <rect x="132.5" y="368.5" height="31" width="121" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
+  <text x="193" y="390" style="fill: #33322E;text-anchor: middle;">BIOBracket3</text>
+  <rect x="141.5" y="439.5" height="31" width="102" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
+  <text x="192.5" y="461" style="fill: #33322E;text-anchor: middle;">BIOPanic3</text>
+  <rect x="165.5" y="510.5" height="31" width="54" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
+  <text x="192.5" y="532" style="fill: #33322E;text-anchor: middle;">BIO3</text>
+  <rect x="207.5" y="581.5" height="31" width="102" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
+  <text x="258.5" y="603" style="fill: #33322E;text-anchor: middle;">BIOAsync3</text>
+  <rect x="391.5" y="510.5" height="31" width="130" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
+  <text x="456.5" y="532" style="fill: #33322E;text-anchor: middle;">BIOParallel3</text>
+  <rect x="193.5" y="652.5" height="31" width="130" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
+  <text x="258.5" y="674" style="fill: #33322E;text-anchor: middle;">BIOTemporal3</text>
+  <rect x="679.5" y="84.5" height="31" width="140" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
+  <text x="749.5" y="106" style="fill: #33322E;text-anchor: middle;">BIOProfunctor</text>
+  <rect x="703.5" y="155.5" height="31" width="92" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
+  <text x="749.5" y="177" style="fill: #33322E;text-anchor: middle;">BIOArrow</text>
+  <rect x="675.5" y="226.5" height="31" width="149" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
+  <text x="750" y="248" style="fill: #33322E;text-anchor: middle;">BIOArrowChoice</text>
+  <rect x="635.5" y="297.5" height="31" width="92" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
+  <text x="681.5" y="319" style="fill: #33322E;text-anchor: middle;">BIOLocal</text>
+  <rect x="563.5" y="155.5" height="31" width="73" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
+  <text x="600" y="177" style="fill: #33322E;text-anchor: middle;">BIOAsk</text>
+  <rect x="510.5" y="226.5" height="31" width="125" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
+  <text x="573" y="248" style="fill: #33322E;text-anchor: middle;">BIOMonadAsk</text>
 </svg>
\ No newline at end of file
diff --git a/fundamentals/fundamentals-bio/src/main/scala/izumi/functional/bio/BIOParallel3.scala b/fundamentals/fundamentals-bio/src/main/scala/izumi/functional/bio/BIOParallel3.scala
index 120c52cc7..508d9dc50 100644
--- a/fundamentals/fundamentals-bio/src/main/scala/izumi/functional/bio/BIOParallel3.scala
+++ b/fundamentals/fundamentals-bio/src/main/scala/izumi/functional/bio/BIOParallel3.scala
@@ -3,39 +3,38 @@ package izumi.functional.bio
 trait BIOParallel3[F[-_, +_, +_]] extends BIORoot {
   val InnerF: BIOMonad3[F]
 
-  def parTraverseN[R, E, A, B](maxConcurrent: Int)(l: Iterable[A])(f: A => F[R, E, B]): F[R, E, List[B]]
   def parTraverse[R, E, A, B](l: Iterable[A])(f: A => F[R, E, B]): F[R, E, List[B]]
+  def parTraverseN[R, E, A, B](maxConcurrent: Int)(l: Iterable[A])(f: A => F[R, E, B]): F[R, E, List[B]]
 
   /**
     * Returns an effect that executes both effects,
     * in parallel, combining their results with the specified `f` function. If
     * either side fails, then the other side will be interrupted.
     */
-  def zipWithPar[R, E, A, R1 <: R, E1 >: E, B, C](fa: F[R, E, A], fb: F[R1, E1, B])(f: (A, B) => C): F[R1, E1, C]
+  def zipWithPar[R, E, A, B, C](fa: F[R, E, A], fb: F[R, E, B])(f: (A, B) => C): F[R, E, C]
 
   // defaults
-  def parTraverse_[R, E, A, B](l: Iterable[A])(f: A => F[R, E, B]): F[R, E, Unit] = InnerF.void(parTraverse(l)(f))
-  def parTraverseN_[R, E, A, B](maxConcurrent: Int)(l: Iterable[A])(f: A => F[R, E, B]): F[R, E, Unit] = InnerF.void(parTraverseN(maxConcurrent)(l)(f))
-
   /**
     * Returns an effect that executes both effects,
     * in parallel, combining their results into a tuple. If either side fails,
     * then the other side will be interrupted.
     */
-  def zipPar[R, E, A, R1 <: R, E1 >: E, B](fa: F[R, E, A], fb: F[R1, E1, B]): F[R1, E1, (A, B)] = zipWithPar(fa, fb)((a, b) => (a, b))
+  def zipPar[R, E, A, B](fa: F[R, E, A], fb: F[R, E, B]): F[R, E, (A, B)] = zipWithPar(fa, fb)((a, b) => (a, b))
 
   /**
     * Returns an effect that executes both effects,
     * in parallel, the left effect result is returned. If either side fails,
     * then the other side will be interrupted.
     */
-  def zipParLeft[R, E, A, R1 <: R, E1 >: E, B](fa: F[R, E, A], fb: F[R1, E1, B]): F[R1, E1, A] = zipWithPar(fa, fb)((a, _) => a)
+  def zipParLeft[R, E, A, B](fa: F[R, E, A], fb: F[R, E, B]): F[R, E, A] = zipWithPar(fa, fb)((a, _) => a)
 
   /**
     * Returns an effect that executes both effects,
     * in parallel, the right effect result is returned. If either side fails,
     * then the other side will be interrupted.
     */
-  def zipParRight[R, E, A, R1 <: R, E1 >: E, B](fa: F[R, E, A], fb: F[R1, E1, B]): F[R1, E1, B] = zipWithPar(fa, fb)((_, b) => b)
+  def zipParRight[R, E, A, B](fa: F[R, E, A], fb: F[R, E, B]): F[R, E, B] = zipWithPar(fa, fb)((_, b) => b)
 
+  def parTraverse_[R, E, A, B](l: Iterable[A])(f: A => F[R, E, B]): F[R, E, Unit] = InnerF.void(parTraverse(l)(f))
+  def parTraverseN_[R, E, A, B](maxConcurrent: Int)(l: Iterable[A])(f: A => F[R, E, B]): F[R, E, Unit] = InnerF.void(parTraverseN(maxConcurrent)(l)(f))
 }
diff --git a/fundamentals/fundamentals-bio/src/main/scala/izumi/functional/bio/BIORoot.scala b/fundamentals/fundamentals-bio/src/main/scala/izumi/functional/bio/BIORoot.scala
index 975bf6352..d87280e17 100644
--- a/fundamentals/fundamentals-bio/src/main/scala/izumi/functional/bio/BIORoot.scala
+++ b/fundamentals/fundamentals-bio/src/main/scala/izumi/functional/bio/BIORoot.scala
@@ -26,7 +26,7 @@ object BIORoot extends BIORootInstancesLowPriority1 {
 }
 
 sealed trait BIORootInstancesLowPriority1 extends BIORootInstancesLowPriority2 {
-  @inline implicit final def BIOConvertFromBIOAsk[FR[-_, +_, +_]](implicit BIOAsk: NotPredefined.Of[BIOAsk[FR]]): BIOApplicative3[FR] with S2 = S2(BIOAsk.InnerF)
+  @inline implicit final def BIOConvertFromBIOParallel[FR[-_, +_, +_]](implicit BIOParallel: NotPredefined.Of[BIOParallel3[FR]]): BIOMonad3[FR] with S2 = S2(BIOParallel.InnerF)
 
   @inline implicit final def AttachBIOArrowChoice[FR[-_, +_, +_]](@deprecated("unused", "") self: BIOFunctor3[FR])(implicit BIOArrowChoice: BIOArrowChoice[FR]): BIOArrowChoice.type = BIOArrowChoice
   @inline implicit final def AttachBIOArrow[FR[-_, +_, +_]](@deprecated("unused", "") self: BIOFunctor3[FR])(implicit BIOArrow: BIOArrow[FR]): BIOArrow.type = BIOArrow
@@ -34,7 +34,7 @@ sealed trait BIORootInstancesLowPriority1 extends BIORootInstancesLowPriority2 {
 }
 
 sealed trait BIORootInstancesLowPriority2 extends BIORootInstancesLowPriority3 {
-  @inline implicit final def BIOConvertFromBIOParallel[FR[-_, +_, +_]](implicit BIOParallel: NotPredefined.Of[BIOParallel3[FR]]): BIOMonad3[FR] with S5 = S5(BIOParallel.InnerF)
+  @inline implicit final def BIOConvertFromBIOAsk[FR[-_, +_, +_]](implicit BIOAsk: NotPredefined.Of[BIOAsk[FR]]): BIOApplicative3[FR] with S3 = S3(BIOAsk.InnerF)
 
   @inline implicit final def AttachBIOProfunctor[FR[-_, +_, +_]](@deprecated("unused", "") self: BIOFunctor3[FR])(implicit BIOProfunctor: BIOProfunctor[FR]): BIOProfunctor.type = BIOProfunctor
   @inline implicit final def AttachBIOAsk[FR[-_, +_, +_], R](@deprecated("unused", "") self: BIOFunctor3[FR])(implicit BIOAsk: BIOAsk[FR]): BIOAsk.type = BIOAsk
@@ -43,20 +43,20 @@ sealed trait BIORootInstancesLowPriority2 extends BIORootInstancesLowPriority3 {
 }
 
 sealed trait BIORootInstancesLowPriority3 extends BIORootInstancesLowPriority4 {
-  @inline implicit final def BIOConvertFromBIOProfunctor[FR[-_, +_, +_]](implicit BIOProfunctor: NotPredefined.Of[BIOProfunctor[FR]]): BIOFunctor3[FR] with S3 = S3(BIOProfunctor.InnerF)
+  @inline implicit final def BIOConvertFromBIOProfunctor[FR[-_, +_, +_]](implicit BIOProfunctor: NotPredefined.Of[BIOProfunctor[FR]]): BIOFunctor3[FR] with S4 = S4(BIOProfunctor.InnerF)
 }
 
 sealed trait BIORootInstancesLowPriority4 extends BIORootInstancesLowPriority5 {
-  @inline implicit final def BIOConvertFromBIOBifunctor[FR[-_, +_, +_]](implicit BIOBifunctor: NotPredefined.Of[BIOBifunctor3[FR]]): BIOFunctor3[FR] with S4 = S4(BIOBifunctor.InnerF)
+  @inline implicit final def BIOConvertFromBIOBifunctor[FR[-_, +_, +_]](implicit BIOBifunctor: NotPredefined.Of[BIOBifunctor3[FR]]): BIOFunctor3[FR] with S5 = S5(BIOBifunctor.InnerF)
 }
 
 sealed trait BIORootInstancesLowPriority5 extends BIORootInstancesLowPriority6 {
-  // place ZIO instance at the root of the hierarchy, so that it's visible when summoning any class in hierarchy
-  @inline implicit final def BIOZIO: Predefined.Of[BIOAsync3[ZIO] with BIOLocal[ZIO]] = Predefined(BIOAsyncZio)
+  @inline implicit final def BIOZIO: Predefined.Of[BIOAsync3[ZIO]] = Predefined(BIOAsyncZio)
+  @inline implicit final def BIOLocalZIO: Predefined.Of[BIOLocal[ZIO]] = Predefined(BIOAsyncZio)
 }
 
 sealed trait BIORootInstancesLowPriority6 {
-  @inline implicit final def BIOConvert3To2[C[_[-_, +_, +_]] <: DivergenceHelper, FR[-_, +_, +_], R0](
+  @inline implicit final def BIOConvert3To2[C[f[-_, +_, +_]] <: DivergenceHelper with BIOFunctor3[f], FR[-_, +_, +_], R0](
     implicit BIOFunctor3: C[FR] { type Divergence = Nondivergent }
   ): C[Lambda[(`-R`, `+E`, `+A`) => FR[R0, E, A]]] with DivergenceHelper { type Divergence = Divergent } =
     Divergent(cast3To2[C, FR, R0](BIOFunctor3))
diff --git a/fundamentals/fundamentals-bio/src/main/scala/izumi/functional/bio/SpecificityHelper.scala b/fundamentals/fundamentals-bio/src/main/scala/izumi/functional/bio/SpecificityHelper.scala
index 0af62135c..731cda951 100644
--- a/fundamentals/fundamentals-bio/src/main/scala/izumi/functional/bio/SpecificityHelper.scala
+++ b/fundamentals/fundamentals-bio/src/main/scala/izumi/functional/bio/SpecificityHelper.scala
@@ -17,6 +17,11 @@ private[bio] object SpecificityHelper {
   private[bio] trait S8 extends Any
   private[bio] trait S9 extends Any
   private[bio] trait S10 extends Any
+  private[bio] trait S11 extends Any
+  private[bio] trait S12 extends Any
+  private[bio] trait S13 extends Any
+  private[bio] trait S14 extends Any
+  private[bio] trait S15 extends Any
   @inline private[bio] def S1[A, A1 >: A](a: A): A1 with S1 = a.asInstanceOf[A1 with S1]
   @inline private[bio] def S2[A, A1 >: A](a: A): A1 with S2 = a.asInstanceOf[A1 with S2]
   @inline private[bio] def S3[A, A1 >: A](a: A): A1 with S3 = a.asInstanceOf[A1 with S3]
@@ -26,4 +31,10 @@ private[bio] object SpecificityHelper {
   @inline private[bio] def S7[A, A1 >: A](a: A): A1 with S7 = a.asInstanceOf[A1 with S7]
   @inline private[bio] def S8[A, A1 >: A](a: A): A1 with S8 = a.asInstanceOf[A1 with S8]
   @inline private[bio] def S9[A, A1 >: A](a: A): A1 with S9 = a.asInstanceOf[A1 with S9]
+  @inline private[bio] def S10[A, A1 >: A](a: A): A1 with S10 = a.asInstanceOf[A1 with S10]
+  @inline private[bio] def S11[A, A1 >: A](a: A): A1 with S11 = a.asInstanceOf[A1 with S11]
+  @inline private[bio] def S12[A, A1 >: A](a: A): A1 with S12 = a.asInstanceOf[A1 with S12]
+  @inline private[bio] def S13[A, A1 >: A](a: A): A1 with S13 = a.asInstanceOf[A1 with S13]
+  @inline private[bio] def S14[A, A1 >: A](a: A): A1 with S14 = a.asInstanceOf[A1 with S14]
+  @inline private[bio] def S15[A, A1 >: A](a: A): A1 with S15 = a.asInstanceOf[A1 with S15]
 }
diff --git a/fundamentals/fundamentals-bio/src/main/scala/izumi/functional/bio/impl/BIOAsyncZio.scala b/fundamentals/fundamentals-bio/src/main/scala/izumi/functional/bio/impl/BIOAsyncZio.scala
index 4a9eee46a..f4176c81f 100644
--- a/fundamentals/fundamentals-bio/src/main/scala/izumi/functional/bio/impl/BIOAsyncZio.scala
+++ b/fundamentals/fundamentals-bio/src/main/scala/izumi/functional/bio/impl/BIOAsyncZio.scala
@@ -117,10 +117,10 @@ class BIOAsyncZio extends BIOAsync3[ZIO] with BIOLocal[ZIO] {
   @inline override final def parTraverse[R, E, A, B](l: Iterable[A])(f: A => ZIO[R, E, B]): ZIO[R, E, List[B]] = ZIO.foreachPar(l)(f(_).interruptible)
   @inline override final def parTraverse_[R, E, A, B](l: Iterable[A])(f: A => ZIO[R, E, B]): ZIO[R, E, Unit] = ZIO.foreachPar_(l)(f(_).interruptible)
 
-  @inline override final def zipWithPar[R, E, A, R1 <: R, E1 >: E, B, C](fa: ZIO[R, E, A], fb: ZIO[R1, E1, B])(f: (A, B) => C): ZIO[R1, E1, C] = fa.zipWithPar(fb)(f)
-  @inline override final def zipPar[R, E, A, R1 <: R, E1 >: E, B](fa: ZIO[R, E, A], fb: ZIO[R1, E1, B]): ZIO[R1, E1, (A, B)] = fa <&> fb
-  @inline override final def zipParLeft[R, E, A, R1 <: R, E1 >: E, B](fa: ZIO[R, E, A], fb: ZIO[R1, E1, B]): ZIO[R1, E1, A] = fa <& fb
-  @inline override final def zipParRight[R, E, A, R1 <: R, E1 >: E, B](fa: ZIO[R, E, A], fb: ZIO[R1, E1, B]): ZIO[R1, E1, B] = fa &> fb
+  @inline override final def zipWithPar[R, E, A, B, C](fa: ZIO[R, E, A], fb: ZIO[R, E, B])(f: (A, B) => C): ZIO[R, E, C] = fa.zipWithPar(fb)(f)
+  @inline override final def zipPar[R, E, A, B](fa: ZIO[R, E, A], fb: ZIO[R, E, B]): ZIO[R, E, (A, B)] = fa <&> fb
+  @inline override final def zipParLeft[R, E, A, B](fa: ZIO[R, E, A], fb: ZIO[R, E, B]): ZIO[R, E, A] = fa <& fb
+  @inline override final def zipParRight[R, E, A, B](fa: ZIO[R, E, A], fb: ZIO[R, E, B]): ZIO[R, E, B] = fa &> fb
 
   @inline override final val InnerF: BIOMonad3[ZIO] = this
 
diff --git a/fundamentals/fundamentals-bio/src/main/scala/izumi/functional/bio/package.scala b/fundamentals/fundamentals-bio/src/main/scala/izumi/functional/bio/package.scala
index e5fefd81a..fa62dbf14 100644
--- a/fundamentals/fundamentals-bio/src/main/scala/izumi/functional/bio/package.scala
+++ b/fundamentals/fundamentals-bio/src/main/scala/izumi/functional/bio/package.scala
@@ -4,7 +4,7 @@ import izumi.functional.bio.syntax.{BIO3Syntax, BIOSyntax}
 import izumi.functional.mono.{Clock, Entropy, SyncSafe}
 
 /*
-  Current inheritance hierarchy: (rendered: https://izumi.7mind.io/latest/release/doc/bio/media/bio-hierarchy.svg)
+  Current inheritance hierarchy (use http://www.nomnoml.com/ to render, rendered: https://izumi.7mind.io/latest/release/doc/bio/media/bio-hierarchy.svg)
 
   [BIOFunctor3]<:--[BIOApplicative3]
   [BIOApplicative3]<:--[BIOGuarantee3]
@@ -17,6 +17,7 @@ import izumi.functional.mono.{Clock, Entropy, SyncSafe}
   [BIOBracket3]<:--[BIOPanic3]
   [BIOPanic3]<:--[BIO3]
   [BIO3]<:--[BIOAsync3]
+  [BIOParallel3]<:--[BIOAsync3]
   [BIOAsync3]<:--[BIOTemporal3]
 
   [BIOProfunctor]<:--[BIOArrow]
diff --git a/logstage/logstage-core/src/main/scala/izumi/logstage/sink/ConsoleSink.scala b/logstage/logstage-core/src/main/scala/izumi/logstage/sink/ConsoleSink.scala
index 5dddfcd0d..0139349f0 100644
--- a/logstage/logstage-core/src/main/scala/izumi/logstage/sink/ConsoleSink.scala
+++ b/logstage/logstage-core/src/main/scala/izumi/logstage/sink/ConsoleSink.scala
@@ -2,8 +2,7 @@ package izumi.logstage.sink
 
 import izumi.logstage.api.Log
 import izumi.logstage.api.logger.LogSink
-import izumi.logstage.api.rendering.logunits.Renderer
-import izumi.logstage.api.rendering.{RenderingOptions, RenderingPolicy, StringRenderingPolicy}
+import izumi.logstage.api.rendering.RenderingPolicy
 
 class ConsoleSink(policy: RenderingPolicy) extends LogSink {
   override def flush(e: Log.Entry): Unit = {
@@ -18,5 +17,4 @@ object ConsoleSink {
 
   object ColoredConsoleSink extends ConsoleSink(RenderingPolicy.coloringPolicy())
   object SimpleConsoleSink extends ConsoleSink(RenderingPolicy.simplePolicy())
-
 }


Test patch:
diff --git a/fundamentals/fundamentals-bio/src/test/scala/izumi/fundamentals/bio/test/BIOSoundnessTest.scala b/fundamentals/fundamentals-bio/src/test/scala/izumi/fundamentals/bio/test/BIOSoundnessTest.scala
new file mode 100644
index 000000000..096ca0ba9
--- /dev/null
+++ b/fundamentals/fundamentals-bio/src/test/scala/izumi/fundamentals/bio/test/BIOSoundnessTest.scala
@@ -0,0 +1,58 @@
+package izumi.fundamentals.bio.test
+
+import izumi.functional.bio._
+import org.scalatest.exceptions.TestFailedException
+import org.scalatest.wordspec.AnyWordSpec
+import zio.{IO, Task, ZIO}
+
+class BIOSoundnessTest extends AnyWordSpec {
+  /*
+    There's a `<: BIOFunctor3[f]` constraint now in BIOConvert3To2
+    to prevent trifunctorial classes from being converted to bifunctorial,
+    but it's still circumventable by inheriting from BIOFunctor + Trifunctor
+    hierarchies in one implicit instance, like `BIOAsync[F] with BIOLocal[F]`.
+
+    A solution would be to add a marker type member inside instances:
+
+    trait FunctorialityHelper {
+      type Functoriality
+    }
+    object FunctorialityHelper {
+      type Monofunctorial
+      type Bifunctorial <: Monofunctorial
+      type Trifunctorial <: Bifunctorial
+    }
+
+    And then add a LUB guard to check that type member is _no more specific_
+    than `Bifunctorial`: `(implicit guard: Lub[F#Functoriality, Trifunctorial, Bifunctorial])`
+  */
+
+  type BIOArrow2[F[+_, +_]] = BIOArrow[Lambda[(`-R`, `+E`, `+A`) => F[E, A]]]
+  type FR[F[-_, +_, +_], R] = { type l[+E, +A] = F[R, E, A] }
+
+  "Cannot convert polymorphic BIOArrow into a bifunctor typeclass (normally)" in {
+    val res = intercept[TestFailedException](assertCompiles(
+      """
+      def valueF[F[-_, +_, +_]: BIOArrow: BIOMonadAsk: BIO3] = {
+        val FA: BIOArrow2[FR[F, Int]#l] = implicitly[BIOArrow2[FR[F, Int]#l]]
+        FA.andThen(F.unit, F.access((i: Int) => F.sync(println(i))))
+      }
+      zio.Runtime.default.unsafeRun(valueF[ZIO].provide(1))
+      """))
+    assert(res.getMessage contains "could not find implicit value for parameter")
+    assert(res.getMessage contains "BIOArrow2")
+  }
+
+  "Cannot convert ZIO BIOArrow instance into a bifunctor typeclass (normally)" in {
+    val res = intercept[TestFailedException](assertCompiles(
+    """
+    def valueZIO = {
+      val F: BIOArrow2[FR[ZIO, Int]#l] = implicitly[BIOArrow2[FR[ZIO, Int]#l]]
+      F.andThen(IO.unit, ZIO.accessM[Int](i => Task(println(i))))
+    }
+    zio.Runtime.default.unsafeRun(valueZIO.provide(1))
+    """))
+    assert(res.getMessage contains "could not find implicit value for parameter")
+    assert(res.getMessage contains "BIOArrow2")
+  }
+}
diff --git a/fundamentals/fundamentals-bio/src/test/scala/izumi/fundamentals/bio/test/BIOSyntaxTest.scala b/fundamentals/fundamentals-bio/src/test/scala/izumi/fundamentals/bio/test/BIOSyntaxTest.scala
index b858a0db0..9348dda53 100644
--- a/fundamentals/fundamentals-bio/src/test/scala/izumi/fundamentals/bio/test/BIOSyntaxTest.scala
+++ b/fundamentals/fundamentals-bio/src/test/scala/izumi/fundamentals/bio/test/BIOSyntaxTest.scala
@@ -11,10 +11,11 @@ class BIOSyntaxTest extends AnyWordSpec {
     import izumi.functional.bio.BIOParallel
 
     def x[F[+_, +_]: BIOParallel](a: F[Nothing, Unit], b: F[Nothing, Unit]) = {
-      a zipPar b
-      a zipParLeft b
-      a zipParRight b
+      a.zipPar(b)
+      a.zipParLeft(b)
+      a.zipParRight(b)
       a.zipWithPar(b)((a, b) => (a, b))
+      a.flatMap(_ => b)
     }
 
     x[zio.IO](zio.UIO.succeed(()), zio.UIO.succeed(()))
@@ -23,10 +24,11 @@ class BIOSyntaxTest extends AnyWordSpec {
   "BIOParallel3.zipPar/zipParLeft/zipParRight/zipWithPar is callable" in {
     import izumi.functional.bio.BIOParallel3
     def x[F[-_, +_, +_]: BIOParallel3](a: F[Any, Nothing, Unit], b: F[Any, Nothing, Unit]) = {
-      a zipPar b
-      a zipParLeft b
-      a zipParRight b
+      a.zipPar(b)
+      a.zipParLeft(b)
+      a.zipParRight(b)
       a.zipWithPar(b)((a, b) => (a, b))
+      a.flatMap(_ => b)
     }
 
     x[zio.ZIO](zio.UIO.succeed(()), zio.UIO.succeed(()))
@@ -39,7 +41,8 @@ class BIOSyntaxTest extends AnyWordSpec {
       a zipParLeft b
       a zipParRight b
       a.zipWithPar(b)((a, b) => (a, b))
-      a race b
+      a.race(b)
+      a.flatMap(_ => b)
     }
 
     x[zio.IO](zio.UIO.succeed(()), zio.UIO.succeed(()))
@@ -49,11 +52,12 @@ class BIOSyntaxTest extends AnyWordSpec {
     import izumi.functional.bio.BIOAsync3
 
     def x[F[-_, +_, +_]: BIOAsync3](a: F[Any, Nothing, Unit], b: F[Any, Nothing, Unit]) = {
-      a zipPar b
-      a zipParLeft b
-      a zipParRight b
+      a.zipPar(b)
+      a.zipParLeft(b)
+      a.zipParRight(b)
       a.zipWithPar(b)((a, b) => (a, b))
-      a race b
+      a.race(b)
+      a.flatMap(_ => b)
     }
 
     x[zio.ZIO](zio.UIO.succeed(()), zio.UIO.succeed(()))
diff --git a/logstage/logstage-sink-slf4j/src/test/scala/izumi/logstage/sink/slf4j/LoggingSlf4jSinkTest.scala b/logstage/logstage-sink-slf4j/src/test/scala/izumi/logstage/sink/slf4j/LoggingSlf4jSinkTest.scala
index 443429e1b..e37c08604 100644
--- a/logstage/logstage-sink-slf4j/src/test/scala/izumi/logstage/sink/slf4j/LoggingSlf4jSinkTest.scala
+++ b/logstage/logstage-sink-slf4j/src/test/scala/izumi/logstage/sink/slf4j/LoggingSlf4jSinkTest.scala
@@ -2,7 +2,7 @@ package izumi.logstage.sink.slf4j
 
 import izumi.logstage.api.IzLogger
 import izumi.logstage.api.rendering.RenderingPolicy
-import izumi.logstage.sink.{ConsoleSink, ExampleService}
+import izumi.logstage.sink.ExampleService
 import org.scalatest.wordspec.AnyWordSpec
 
 class LoggingSlf4jSinkTest extends AnyWordSpec {