Deploying to gh-pages from @ 917dc3693d 🚀

This commit is contained in:
Lemmih 2020-08-28 07:00:02 +00:00
commit 32f4dbd2d4
8 changed files with 524 additions and 472 deletions

View file

@ -98,7 +98,7 @@ table.dashboard { border-collapse: collapse ; border: solid 1px black }
<td align="right">15%</td><td>2/13</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="15%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">0%</td><td>0/17</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">11%</td><td>52/443</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="11%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> <td align="right">15%</td><td>2/13</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="15%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">0%</td><td>0/17</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">11%</td><td>52/443</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="11%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
<tr> <tr>
<td>&nbsp;&nbsp;<tt>module <a href="reanimate-0.4.2.0-inplace/Reanimate.Render.hs.html">reanimate-0.4.2.0-inplace/Reanimate.Render</a></tt></td> <td>&nbsp;&nbsp;<tt>module <a href="reanimate-0.4.2.0-inplace/Reanimate.Render.hs.html">reanimate-0.4.2.0-inplace/Reanimate.Render</a></tt></td>
<td align="right">5%</td><td>1/19</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="5%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">0%</td><td>0/50</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">4%</td><td>39/826</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="4%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> <td align="right">5%</td><td>1/19</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="5%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">0%</td><td>0/53</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">4%</td><td>39/852</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="4%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
<tr> <tr>
<td>&nbsp;&nbsp;<tt>module <a href="reanimate-0.4.2.0-inplace/Reanimate.Scene.hs.html">reanimate-0.4.2.0-inplace/Reanimate.Scene</a></tt></td> <td>&nbsp;&nbsp;<tt>module <a href="reanimate-0.4.2.0-inplace/Reanimate.Scene.hs.html">reanimate-0.4.2.0-inplace/Reanimate.Scene</a></tt></td>
<td align="right">30%</td><td>40/130</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="30%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">60%</td><td>15/25</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="60%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">36%</td><td>545/1483</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="36%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> <td align="right">30%</td><td>40/130</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="30%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">60%</td><td>15/25</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="60%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">36%</td><td>545/1483</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="36%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
@ -125,5 +125,5 @@ table.dashboard { border-collapse: collapse ; border: solid 1px black }
<td align="right">100%</td><td>6/6</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">50%</td><td>1/2</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="50%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">95%</td><td>43/45</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="95%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> <td align="right">100%</td><td>6/6</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">50%</td><td>1/2</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="50%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">95%</td><td>43/45</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="95%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
<tr></tr><tr style="background: #e0e0e0"> <tr></tr><tr style="background: #e0e0e0">
<th align=left>&nbsp;&nbsp;Program Coverage Total</tt></th> <th align=left>&nbsp;&nbsp;Program Coverage Total</tt></th>
<td align="right">31%</td><td>248/798</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="31%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">16%</td><td>131/815</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="16%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">30%</td><td>4682/15530</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="30%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> <td align="right">31%</td><td>248/798</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="31%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">16%</td><td>131/818</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="16%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">30%</td><td>4682/15556</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="30%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
</table></body></html> </table></body></html>

View file

@ -98,7 +98,7 @@ table.dashboard { border-collapse: collapse ; border: solid 1px black }
<td align="right">15%</td><td>2/13</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="15%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">0%</td><td>0/17</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">11%</td><td>52/443</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="11%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> <td align="right">15%</td><td>2/13</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="15%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">0%</td><td>0/17</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">11%</td><td>52/443</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="11%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
<tr> <tr>
<td>&nbsp;&nbsp;<tt>module <a href="reanimate-0.4.2.0-inplace/Reanimate.Render.hs.html">reanimate-0.4.2.0-inplace/Reanimate.Render</a></tt></td> <td>&nbsp;&nbsp;<tt>module <a href="reanimate-0.4.2.0-inplace/Reanimate.Render.hs.html">reanimate-0.4.2.0-inplace/Reanimate.Render</a></tt></td>
<td align="right">5%</td><td>1/19</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="5%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">0%</td><td>0/50</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">4%</td><td>39/826</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="4%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> <td align="right">5%</td><td>1/19</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="5%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">0%</td><td>0/53</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">4%</td><td>39/852</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="4%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
<tr> <tr>
<td>&nbsp;&nbsp;<tt>module <a href="reanimate-0.4.2.0-inplace/Reanimate.Svg.Unuse.hs.html">reanimate-0.4.2.0-inplace/Reanimate.Svg.Unuse</a></tt></td> <td>&nbsp;&nbsp;<tt>module <a href="reanimate-0.4.2.0-inplace/Reanimate.Svg.Unuse.hs.html">reanimate-0.4.2.0-inplace/Reanimate.Svg.Unuse</a></tt></td>
<td align="right">33%</td><td>1/3</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="33%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">0%</td><td>0/14</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">21%</td><td>28/128</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="21%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> <td align="right">33%</td><td>1/3</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="33%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">0%</td><td>0/14</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">21%</td><td>28/128</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="21%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
@ -125,5 +125,5 @@ table.dashboard { border-collapse: collapse ; border: solid 1px black }
<td align="right">15%</td><td>3/20</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="15%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">-&nbsp;</td><td>0/0</td><td width=100>&nbsp;</td><td align="right">14%</td><td>7/49</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="14%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> <td align="right">15%</td><td>3/20</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="15%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">-&nbsp;</td><td>0/0</td><td width=100>&nbsp;</td><td align="right">14%</td><td>7/49</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="14%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
<tr></tr><tr style="background: #e0e0e0"> <tr></tr><tr style="background: #e0e0e0">
<th align=left>&nbsp;&nbsp;Program Coverage Total</tt></th> <th align=left>&nbsp;&nbsp;Program Coverage Total</tt></th>
<td align="right">31%</td><td>248/798</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="31%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">16%</td><td>131/815</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="16%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">30%</td><td>4682/15530</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="30%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> <td align="right">31%</td><td>248/798</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="31%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">16%</td><td>131/818</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="16%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">30%</td><td>4682/15556</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="30%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
</table></body></html> </table></body></html>

View file

@ -86,7 +86,7 @@ table.dashboard { border-collapse: collapse ; border: solid 1px black }
<td align="right">33%</td><td>4/12</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="33%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">11%</td><td>1/9</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="11%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">7%</td><td>12/167</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="7%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> <td align="right">33%</td><td>4/12</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="33%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">11%</td><td>1/9</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="11%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">7%</td><td>12/167</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="7%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
<tr> <tr>
<td>&nbsp;&nbsp;<tt>module <a href="reanimate-0.4.2.0-inplace/Reanimate.Render.hs.html">reanimate-0.4.2.0-inplace/Reanimate.Render</a></tt></td> <td>&nbsp;&nbsp;<tt>module <a href="reanimate-0.4.2.0-inplace/Reanimate.Render.hs.html">reanimate-0.4.2.0-inplace/Reanimate.Render</a></tt></td>
<td align="right">5%</td><td>1/19</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="5%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">0%</td><td>0/50</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">4%</td><td>39/826</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="4%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> <td align="right">5%</td><td>1/19</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="5%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">0%</td><td>0/53</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">4%</td><td>39/852</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="4%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
<tr> <tr>
<td>&nbsp;&nbsp;<tt>module <a href="reanimate-0.4.2.0-inplace/Reanimate.Driver.hs.html">reanimate-0.4.2.0-inplace/Reanimate.Driver</a></tt></td> <td>&nbsp;&nbsp;<tt>module <a href="reanimate-0.4.2.0-inplace/Reanimate.Driver.hs.html">reanimate-0.4.2.0-inplace/Reanimate.Driver</a></tt></td>
<td align="right">8%</td><td>1/12</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="8%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">1%</td><td>1/55</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="1%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">3%</td><td>9/246</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="3%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> <td align="right">8%</td><td>1/12</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="8%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">1%</td><td>1/55</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="1%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">3%</td><td>9/246</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="3%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
@ -125,5 +125,5 @@ table.dashboard { border-collapse: collapse ; border: solid 1px black }
<td align="right">0%</td><td>0/1</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">0%</td><td>0/4</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">0%</td><td>0/61</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td></tr> <td align="right">0%</td><td>0/1</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">0%</td><td>0/4</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">0%</td><td>0/61</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td></tr>
<tr></tr><tr style="background: #e0e0e0"> <tr></tr><tr style="background: #e0e0e0">
<th align=left>&nbsp;&nbsp;Program Coverage Total</tt></th> <th align=left>&nbsp;&nbsp;Program Coverage Total</tt></th>
<td align="right">31%</td><td>248/798</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="31%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">16%</td><td>131/815</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="16%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">30%</td><td>4682/15530</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="30%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> <td align="right">31%</td><td>248/798</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="31%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">16%</td><td>131/818</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="16%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">30%</td><td>4682/15556</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="30%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
</table></body></html> </table></body></html>

View file

@ -92,7 +92,7 @@ table.dashboard { border-collapse: collapse ; border: solid 1px black }
<td align="right">8%</td><td>7/82</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="8%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">5%</td><td>4/79</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="5%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">2%</td><td>58/2494</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="2%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> <td align="right">8%</td><td>7/82</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="8%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">5%</td><td>4/79</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="5%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">2%</td><td>58/2494</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="2%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
<tr> <tr>
<td>&nbsp;&nbsp;<tt>module <a href="reanimate-0.4.2.0-inplace/Reanimate.Render.hs.html">reanimate-0.4.2.0-inplace/Reanimate.Render</a></tt></td> <td>&nbsp;&nbsp;<tt>module <a href="reanimate-0.4.2.0-inplace/Reanimate.Render.hs.html">reanimate-0.4.2.0-inplace/Reanimate.Render</a></tt></td>
<td align="right">5%</td><td>1/19</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="5%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">0%</td><td>0/50</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">4%</td><td>39/826</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="4%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> <td align="right">5%</td><td>1/19</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="5%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">0%</td><td>0/53</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">4%</td><td>39/852</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="4%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
<tr> <tr>
<td>&nbsp;&nbsp;<tt>module <a href="reanimate-0.4.2.0-inplace/Reanimate.Cache.hs.html">reanimate-0.4.2.0-inplace/Reanimate.Cache</a></tt></td> <td>&nbsp;&nbsp;<tt>module <a href="reanimate-0.4.2.0-inplace/Reanimate.Cache.hs.html">reanimate-0.4.2.0-inplace/Reanimate.Cache</a></tt></td>
<td align="right">0%</td><td>0/8</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">0%</td><td>0/12</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">0%</td><td>0/160</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td></tr> <td align="right">0%</td><td>0/8</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">0%</td><td>0/12</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">0%</td><td>0/160</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td></tr>
@ -125,5 +125,5 @@ table.dashboard { border-collapse: collapse ; border: solid 1px black }
<td align="right">0%</td><td>0/1</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">0%</td><td>0/4</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">0%</td><td>0/61</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td></tr> <td align="right">0%</td><td>0/1</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">0%</td><td>0/4</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">0%</td><td>0/61</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td></tr>
<tr></tr><tr style="background: #e0e0e0"> <tr></tr><tr style="background: #e0e0e0">
<th align=left>&nbsp;&nbsp;Program Coverage Total</tt></th> <th align=left>&nbsp;&nbsp;Program Coverage Total</tt></th>
<td align="right">31%</td><td>248/798</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="31%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">16%</td><td>131/815</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="16%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">30%</td><td>4682/15530</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="30%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> <td align="right">31%</td><td>248/798</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="31%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">16%</td><td>131/818</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="16%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">30%</td><td>4682/15556</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="30%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
</table></body></html> </table></body></html>

View file

@ -784,11 +784,11 @@ function _Debug_crash_UNUSED(identifier, fact1, fact2, fact3, fact4)
function _Debug_regionToString(region) function _Debug_regionToString(region)
{ {
if (region.O.E === region.T.E) if (region.P.E === region.U.E)
{ {
return 'on line ' + region.O.E; return 'on line ' + region.P.E;
} }
return 'on lines ' + region.O.E + ' through ' + region.T.E; return 'on lines ' + region.P.E + ' through ' + region.U.E;
} }
@ -1857,9 +1857,9 @@ var _Platform_worker = F4(function(impl, flagDecoder, debugMetadata, args)
return _Platform_initialize( return _Platform_initialize(
flagDecoder, flagDecoder,
args, args,
impl.aD, impl.aE,
impl.aL, impl.aM,
impl.aJ, impl.aK,
function() { return function() {} } function() { return function() {} }
); );
}); });
@ -2705,8 +2705,8 @@ var _VirtualDom_mapEventRecord = F2(function(func, record)
{ {
return { return {
p: func(record.p), p: func(record.p),
P: record.P, Q: record.Q,
M: record.M N: record.N
} }
}); });
@ -2975,10 +2975,10 @@ function _VirtualDom_makeCallback(eventNode, initialHandler)
var value = result.a; var value = result.a;
var message = !tag ? value : tag < 3 ? value.a : value.p; var message = !tag ? value : tag < 3 ? value.a : value.p;
var stopPropagation = tag == 1 ? value.b : tag == 3 && value.P; var stopPropagation = tag == 1 ? value.b : tag == 3 && value.Q;
var currentEventNode = ( var currentEventNode = (
stopPropagation && event.stopPropagation(), stopPropagation && event.stopPropagation(),
(tag == 2 ? value.b : tag == 3 && value.M) && event.preventDefault(), (tag == 2 ? value.b : tag == 3 && value.N) && event.preventDefault(),
eventNode eventNode
); );
var tagger; var tagger;
@ -3928,11 +3928,11 @@ var _Browser_element = _Debugger_element || F4(function(impl, flagDecoder, debug
return _Platform_initialize( return _Platform_initialize(
flagDecoder, flagDecoder,
args, args,
impl.aD, impl.aE,
impl.aL, impl.aM,
impl.aJ, impl.aK,
function(sendToApp, initialModel) { function(sendToApp, initialModel) {
var view = impl.aM; var view = impl.aN;
/**/ /**/
var domNode = args['node']; var domNode = args['node'];
//*/ //*/
@ -3964,12 +3964,12 @@ var _Browser_document = _Debugger_document || F4(function(impl, flagDecoder, deb
return _Platform_initialize( return _Platform_initialize(
flagDecoder, flagDecoder,
args, args,
impl.aD, impl.aE,
impl.aL, impl.aM,
impl.aJ, impl.aK,
function(sendToApp, initialModel) { function(sendToApp, initialModel) {
var divertHrefToApp = impl.N && impl.N(sendToApp) var divertHrefToApp = impl.O && impl.O(sendToApp)
var view = impl.aM; var view = impl.aN;
var title = _VirtualDom_doc.title; var title = _VirtualDom_doc.title;
var bodyNode = _VirtualDom_doc.body; var bodyNode = _VirtualDom_doc.body;
var currNode = _VirtualDom_virtualize(bodyNode); var currNode = _VirtualDom_virtualize(bodyNode);
@ -3977,12 +3977,12 @@ var _Browser_document = _Debugger_document || F4(function(impl, flagDecoder, deb
{ {
_VirtualDom_divertHrefToApp = divertHrefToApp; _VirtualDom_divertHrefToApp = divertHrefToApp;
var doc = view(model); var doc = view(model);
var nextNode = _VirtualDom_node('body')(_List_Nil)(doc.at); var nextNode = _VirtualDom_node('body')(_List_Nil)(doc.au);
var patches = _VirtualDom_diff(currNode, nextNode); var patches = _VirtualDom_diff(currNode, nextNode);
bodyNode = _VirtualDom_applyPatches(bodyNode, currNode, patches, sendToApp); bodyNode = _VirtualDom_applyPatches(bodyNode, currNode, patches, sendToApp);
currNode = nextNode; currNode = nextNode;
_VirtualDom_divertHrefToApp = 0; _VirtualDom_divertHrefToApp = 0;
(title !== doc.aK) && (_VirtualDom_doc.title = title = doc.aK); (title !== doc.aL) && (_VirtualDom_doc.title = title = doc.aL);
}); });
} }
); );
@ -4038,12 +4038,12 @@ function _Browser_makeAnimator(model, draw)
function _Browser_application(impl) function _Browser_application(impl)
{ {
var onUrlChange = impl.aE; var onUrlChange = impl.aF;
var onUrlRequest = impl.aF; var onUrlRequest = impl.aG;
var key = function() { key.a(onUrlChange(_Browser_getUrl())); }; var key = function() { key.a(onUrlChange(_Browser_getUrl())); };
return _Browser_document({ return _Browser_document({
N: function(sendToApp) O: function(sendToApp)
{ {
key.a = sendToApp; key.a = sendToApp;
_Browser_window.addEventListener('popstate', key); _Browser_window.addEventListener('popstate', key);
@ -4059,9 +4059,9 @@ function _Browser_application(impl)
var next = $elm$url$Url$fromString(href).a; var next = $elm$url$Url$fromString(href).a;
sendToApp(onUrlRequest( sendToApp(onUrlRequest(
(next (next
&& curr.aH === next.aH && curr.aI === next.aI
&& curr.X === next.X && curr.Y === next.Y
&& curr.ad.a === next.ad.a && curr.ae.a === next.ae.a
) )
? $elm$browser$Browser$Internal(next) ? $elm$browser$Browser$Internal(next)
: $elm$browser$Browser$External(href) : $elm$browser$Browser$External(href)
@ -4069,13 +4069,13 @@ function _Browser_application(impl)
} }
}); });
}, },
aD: function(flags) aE: function(flags)
{ {
return A3(impl.aD, flags, _Browser_getUrl(), key); return A3(impl.aE, flags, _Browser_getUrl(), key);
}, },
aN: impl.aN,
aM: impl.aM, aM: impl.aM,
aL: impl.aL, aK: impl.aK
aJ: impl.aJ
}); });
} }
@ -4141,17 +4141,17 @@ var _Browser_decodeEvent = F2(function(decoder, event)
function _Browser_visibilityInfo() function _Browser_visibilityInfo()
{ {
return (typeof _VirtualDom_doc.hidden !== 'undefined') return (typeof _VirtualDom_doc.hidden !== 'undefined')
? { aB: 'hidden', au: 'visibilitychange' } ? { aC: 'hidden', av: 'visibilitychange' }
: :
(typeof _VirtualDom_doc.mozHidden !== 'undefined') (typeof _VirtualDom_doc.mozHidden !== 'undefined')
? { aB: 'mozHidden', au: 'mozvisibilitychange' } ? { aC: 'mozHidden', av: 'mozvisibilitychange' }
: :
(typeof _VirtualDom_doc.msHidden !== 'undefined') (typeof _VirtualDom_doc.msHidden !== 'undefined')
? { aB: 'msHidden', au: 'msvisibilitychange' } ? { aC: 'msHidden', av: 'msvisibilitychange' }
: :
(typeof _VirtualDom_doc.webkitHidden !== 'undefined') (typeof _VirtualDom_doc.webkitHidden !== 'undefined')
? { aB: 'webkitHidden', au: 'webkitvisibilitychange' } ? { aC: 'webkitHidden', av: 'webkitvisibilitychange' }
: { aB: 'hidden', au: 'visibilitychange' }; : { aC: 'hidden', av: 'visibilitychange' };
} }
@ -4232,12 +4232,12 @@ var _Browser_call = F2(function(functionName, id)
function _Browser_getViewport() function _Browser_getViewport()
{ {
return { return {
aj: _Browser_getScene(), ak: _Browser_getScene(),
am: { an: {
ao: _Browser_window.pageXOffset, ap: _Browser_window.pageXOffset,
ap: _Browser_window.pageYOffset, aq: _Browser_window.pageYOffset,
an: _Browser_doc.documentElement.clientWidth, ao: _Browser_doc.documentElement.clientWidth,
W: _Browser_doc.documentElement.clientHeight X: _Browser_doc.documentElement.clientHeight
} }
}; };
} }
@ -4247,8 +4247,8 @@ function _Browser_getScene()
var body = _Browser_doc.body; var body = _Browser_doc.body;
var elem = _Browser_doc.documentElement; var elem = _Browser_doc.documentElement;
return { return {
an: Math.max(body.scrollWidth, body.offsetWidth, elem.scrollWidth, elem.offsetWidth, elem.clientWidth), ao: Math.max(body.scrollWidth, body.offsetWidth, elem.scrollWidth, elem.offsetWidth, elem.clientWidth),
W: Math.max(body.scrollHeight, body.offsetHeight, elem.scrollHeight, elem.offsetHeight, elem.clientHeight) X: Math.max(body.scrollHeight, body.offsetHeight, elem.scrollHeight, elem.offsetHeight, elem.clientHeight)
}; };
} }
@ -4271,15 +4271,15 @@ function _Browser_getViewportOf(id)
return _Browser_withNode(id, function(node) return _Browser_withNode(id, function(node)
{ {
return { return {
aj: { ak: {
an: node.scrollWidth, ao: node.scrollWidth,
W: node.scrollHeight X: node.scrollHeight
}, },
am: { an: {
ao: node.scrollLeft, ap: node.scrollLeft,
ap: node.scrollTop, aq: node.scrollTop,
an: node.clientWidth, ao: node.clientWidth,
W: node.clientHeight X: node.clientHeight
} }
}; };
}); });
@ -4309,18 +4309,18 @@ function _Browser_getElement(id)
var x = _Browser_window.pageXOffset; var x = _Browser_window.pageXOffset;
var y = _Browser_window.pageYOffset; var y = _Browser_window.pageYOffset;
return { return {
aj: _Browser_getScene(), ak: _Browser_getScene(),
am: { an: {
ao: x, ap: x,
ap: y, aq: y,
an: _Browser_doc.documentElement.clientWidth, ao: _Browser_doc.documentElement.clientWidth,
W: _Browser_doc.documentElement.clientHeight X: _Browser_doc.documentElement.clientHeight
}, },
ay: { az: {
ao: x + rect.left, ap: x + rect.left,
ap: y + rect.top, aq: y + rect.top,
an: rect.width, ao: rect.width,
W: rect.height X: rect.height
} }
}; };
}); });
@ -4905,7 +4905,7 @@ var $elm$url$Url$Http = 0;
var $elm$url$Url$Https = 1; var $elm$url$Url$Https = 1;
var $elm$url$Url$Url = F6( var $elm$url$Url$Url = F6(
function (protocol, host, port_, path, query, fragment) { function (protocol, host, port_, path, query, fragment) {
return {V: fragment, X: host, ab: path, ad: port_, aH: protocol, ag: query}; return {W: fragment, Y: host, ac: path, ae: port_, aI: protocol, ah: query};
}); });
var $elm$core$String$contains = _String_contains; var $elm$core$String$contains = _String_contains;
var $elm$core$String$length = _String_length; var $elm$core$String$length = _String_length;
@ -5214,13 +5214,13 @@ var $bburdette$websocket$WebSocket$encodeCmd = function (wsc) {
$elm$json$Json$Encode$string('connect')), $elm$json$Json$Encode$string('connect')),
_Utils_Tuple2( _Utils_Tuple2(
'name', 'name',
$elm$json$Json$Encode$string(msg._)), $elm$json$Json$Encode$string(msg.aa)),
_Utils_Tuple2( _Utils_Tuple2(
'address', 'address',
$elm$json$Json$Encode$string(msg.ar)), $elm$json$Json$Encode$string(msg.as)),
_Utils_Tuple2( _Utils_Tuple2(
'protocol', 'protocol',
$elm$json$Json$Encode$string(msg.aH)) $elm$json$Json$Encode$string(msg.aI))
])); ]));
case 1: case 1:
var msg = wsc.a; var msg = wsc.a;
@ -5232,10 +5232,10 @@ var $bburdette$websocket$WebSocket$encodeCmd = function (wsc) {
$elm$json$Json$Encode$string('send')), $elm$json$Json$Encode$string('send')),
_Utils_Tuple2( _Utils_Tuple2(
'name', 'name',
$elm$json$Json$Encode$string(msg._)), $elm$json$Json$Encode$string(msg.aa)),
_Utils_Tuple2( _Utils_Tuple2(
'content', 'content',
$elm$json$Json$Encode$string(msg.av)) $elm$json$Json$Encode$string(msg.aw))
])); ]));
default: default:
var msg = wsc.a; var msg = wsc.a;
@ -5247,7 +5247,7 @@ var $bburdette$websocket$WebSocket$encodeCmd = function (wsc) {
$elm$json$Json$Encode$string('close')), $elm$json$Json$Encode$string('close')),
_Utils_Tuple2( _Utils_Tuple2(
'name', 'name',
$elm$json$Json$Encode$string(msg._)) $elm$json$Json$Encode$string(msg.aa))
])); ]));
} }
}; };
@ -5271,7 +5271,7 @@ var $author$project$Main$connectCommand = A2(
$bburdette$websocket$WebSocket$send, $bburdette$websocket$WebSocket$send,
$author$project$Ports$sendSocketCommand, $author$project$Ports$sendSocketCommand,
$bburdette$websocket$WebSocket$Connect( $bburdette$websocket$WebSocket$Connect(
{ar: $author$project$Main$wsBackend, _: 'TheSocket', aH: ''})); {as: $author$project$Main$wsBackend, aa: 'TheSocket', aI: ''}));
var $author$project$Main$init = function (_v0) { var $author$project$Main$init = function (_v0) {
return _Utils_Tuple2($author$project$Main$Disconnected, $author$project$Main$connectCommand); return _Utils_Tuple2($author$project$Main$Disconnected, $author$project$Main$connectCommand);
}; };
@ -5296,7 +5296,7 @@ var $elm$time$Time$Every = F2(
}); });
var $elm$time$Time$State = F2( var $elm$time$Time$State = F2(
function (taggers, processes) { function (taggers, processes) {
return {af: processes, al: taggers}; return {ag: processes, am: taggers};
}); });
var $elm$core$Dict$RBEmpty_elm_builtin = {$: -2}; var $elm$core$Dict$RBEmpty_elm_builtin = {$: -2};
var $elm$core$Dict$empty = $elm$core$Dict$RBEmpty_elm_builtin; var $elm$core$Dict$empty = $elm$core$Dict$RBEmpty_elm_builtin;
@ -5588,7 +5588,7 @@ var $elm$time$Time$spawnHelp = F3(
}); });
var $elm$time$Time$onEffects = F3( var $elm$time$Time$onEffects = F3(
function (router, subs, _v0) { function (router, subs, _v0) {
var processes = _v0.af; var processes = _v0.ag;
var rightStep = F3( var rightStep = F3(
function (_v6, id, _v7) { function (_v6, id, _v7) {
var spawns = _v7.a; var spawns = _v7.a;
@ -5657,7 +5657,7 @@ var $elm$time$Time$millisToPosix = $elm$core$Basics$identity;
var $elm$time$Time$now = _Time_now($elm$time$Time$millisToPosix); var $elm$time$Time$now = _Time_now($elm$time$Time$millisToPosix);
var $elm$time$Time$onSelfMsg = F3( var $elm$time$Time$onSelfMsg = F3(
function (router, interval, state) { function (router, interval, state) {
var _v0 = A2($elm$core$Dict$get, interval, state.al); var _v0 = A2($elm$core$Dict$get, interval, state.am);
if (_v0.$ === 1) { if (_v0.$ === 1) {
return $elm$core$Task$succeed(state); return $elm$core$Task$succeed(state);
} else { } else {
@ -5709,7 +5709,7 @@ var $elm$browser$Browser$AnimationManager$Delta = function (a) {
}; };
var $elm$browser$Browser$AnimationManager$State = F3( var $elm$browser$Browser$AnimationManager$State = F3(
function (subs, request, oldTime) { function (subs, request, oldTime) {
return {L: oldTime, ai: request, ak: subs}; return {M: oldTime, aj: request, al: subs};
}); });
var $elm$browser$Browser$AnimationManager$init = $elm$core$Task$succeed( var $elm$browser$Browser$AnimationManager$init = $elm$core$Task$succeed(
A3($elm$browser$Browser$AnimationManager$State, _List_Nil, $elm$core$Maybe$Nothing, 0)); A3($elm$browser$Browser$AnimationManager$State, _List_Nil, $elm$core$Maybe$Nothing, 0));
@ -5717,8 +5717,8 @@ var $elm$browser$Browser$AnimationManager$now = _Browser_now(0);
var $elm$browser$Browser$AnimationManager$rAF = _Browser_rAF(0); var $elm$browser$Browser$AnimationManager$rAF = _Browser_rAF(0);
var $elm$browser$Browser$AnimationManager$onEffects = F3( var $elm$browser$Browser$AnimationManager$onEffects = F3(
function (router, subs, _v0) { function (router, subs, _v0) {
var request = _v0.ai; var request = _v0.aj;
var oldTime = _v0.L; var oldTime = _v0.M;
var _v1 = _Utils_Tuple2(request, subs); var _v1 = _Utils_Tuple2(request, subs);
if (_v1.a.$ === 1) { if (_v1.a.$ === 1) {
if (!_v1.b.b) { if (!_v1.b.b) {
@ -5764,8 +5764,8 @@ var $elm$browser$Browser$AnimationManager$onEffects = F3(
}); });
var $elm$browser$Browser$AnimationManager$onSelfMsg = F3( var $elm$browser$Browser$AnimationManager$onSelfMsg = F3(
function (router, newTime, _v0) { function (router, newTime, _v0) {
var subs = _v0.ak; var subs = _v0.al;
var oldTime = _v0.L; var oldTime = _v0.M;
var send = function (sub) { var send = function (sub) {
if (!sub.$) { if (!sub.$) {
var tagger = sub.a; var tagger = sub.a;
@ -5873,7 +5873,7 @@ var $bburdette$websocket$WebSocket$decodeMsg = A2(
F2( F2(
function (a, b) { function (a, b) {
return $bburdette$websocket$WebSocket$Error( return $bburdette$websocket$WebSocket$Error(
{az: b, _: a}); {aA: b, aa: a});
}), }),
A2($elm$json$Json$Decode$field, 'name', $elm$json$Json$Decode$string), A2($elm$json$Json$Decode$field, 'name', $elm$json$Json$Decode$string),
A2($elm$json$Json$Decode$field, 'error', $elm$json$Json$Decode$string)); A2($elm$json$Json$Decode$field, 'error', $elm$json$Json$Decode$string));
@ -5883,7 +5883,7 @@ var $bburdette$websocket$WebSocket$decodeMsg = A2(
F2( F2(
function (a, b) { function (a, b) {
return $bburdette$websocket$WebSocket$Data( return $bburdette$websocket$WebSocket$Data(
{aw: b, _: a}); {ax: b, aa: a});
}), }),
A2($elm$json$Json$Decode$field, 'name', $elm$json$Json$Decode$string), A2($elm$json$Json$Decode$field, 'name', $elm$json$Json$Decode$string),
A2($elm$json$Json$Decode$field, 'data', $elm$json$Json$Decode$string)); A2($elm$json$Json$Decode$field, 'data', $elm$json$Json$Decode$string));
@ -6085,14 +6085,15 @@ var $author$project$Main$initAnimation = function (frameCount) {
J: $author$project$Fps$init, J: $author$project$Fps$init,
t: 0, t: 0,
y: $elm$core$Dict$empty, y: $elm$core$Dict$empty,
m: $author$project$Main$Playing(0) m: $author$project$Main$Playing(0),
K: $elm$core$Maybe$Nothing
}; };
}; };
var $elm$core$String$lines = _String_lines; var $elm$core$String$lines = _String_lines;
var $author$project$Main$processMessage = F2( var $author$project$Main$processMessage = F2(
function (data, model) { function (data, model) {
var _v0 = $elm$core$String$lines(data); var _v0 = $elm$core$String$lines(data);
_v0$6: _v0$7:
while (true) { while (true) {
if (_v0.b) { if (_v0.b) {
switch (_v0.a) { switch (_v0.a) {
@ -6100,13 +6101,13 @@ var $author$project$Main$processMessage = F2(
if (!_v0.b.b) { if (!_v0.b.b) {
return $author$project$Main$Connected; return $author$project$Main$Connected;
} else { } else {
break _v0$6; break _v0$7;
} }
case 'connection failed': case 'connection failed':
if (!_v0.b.b) { if (!_v0.b.b) {
return $author$project$Main$Problem($author$project$Main$ConnectionFailed); return $author$project$Main$Problem($author$project$Main$ConnectionFailed);
} else { } else {
break _v0$6; break _v0$7;
} }
case 'status': case 'status':
if (_v0.b.b && (!_v0.b.b.b)) { if (_v0.b.b && (!_v0.b.b.b)) {
@ -6122,20 +6123,39 @@ var $author$project$Main$processMessage = F2(
$author$project$Main$UnexpectedMessage('Unknown status: \'' + (status + '\''))); $author$project$Main$UnexpectedMessage('Unknown status: \'' + (status + '\'')));
} }
} else { } else {
break _v0$6; break _v0$7;
} }
case 'error': case 'error':
var errorLines = _v0.b; var errorLines = _v0.b;
return $author$project$Main$Problem( return $author$project$Main$Problem(
$author$project$Main$CompilationError( $author$project$Main$CompilationError(
A2($elm$core$String$join, '\n', errorLines))); A2($elm$core$String$join, '\n', errorLines)));
case 'frame_count': case 'warning':
if (_v0.b.b && (!_v0.b.b.b)) { if (_v0.b.b && (!_v0.b.b.b)) {
var _v3 = _v0.b; var _v3 = _v0.b;
var n = _v3.a; var warning = _v3.a;
var _v4 = $elm$core$String$toInt(n); if (model.$ === 3) {
if (!_v4.$) { var animation = model.a;
var frameCount = _v4.a; return $author$project$Main$Animating(
_Utils_update(
animation,
{
K: $elm$core$Maybe$Just(warning)
}));
} else {
return $author$project$Main$Problem(
$author$project$Main$CompilationError(warning));
}
} else {
break _v0$7;
}
case 'frame_count':
if (_v0.b.b && (!_v0.b.b.b)) {
var _v5 = _v0.b;
var n = _v5.a;
var _v6 = $elm$core$String$toInt(n);
if (!_v6.$) {
var frameCount = _v6.a;
return $author$project$Main$Animating( return $author$project$Main$Animating(
$author$project$Main$initAnimation(frameCount)); $author$project$Main$initAnimation(frameCount));
} else { } else {
@ -6143,17 +6163,17 @@ var $author$project$Main$processMessage = F2(
$author$project$Main$UnexpectedMessage('frame_count wasn\'t number, but \'' + (n + '\''))); $author$project$Main$UnexpectedMessage('frame_count wasn\'t number, but \'' + (n + '\'')));
} }
} else { } else {
break _v0$6; break _v0$7;
} }
case 'frame': case 'frame':
if ((_v0.b.b && _v0.b.b.b) && (!_v0.b.b.b.b)) { if ((_v0.b.b && _v0.b.b.b) && (!_v0.b.b.b.b)) {
var _v5 = _v0.b; var _v7 = _v0.b;
var n = _v5.a; var n = _v7.a;
var _v6 = _v5.b; var _v8 = _v7.b;
var svgUrl = _v6.a; var svgUrl = _v8.a;
var _v7 = $elm$core$String$toInt(n); var _v9 = $elm$core$String$toInt(n);
if (!_v7.$) { if (!_v9.$) {
var frameIndex = _v7.a; var frameIndex = _v9.a;
if (model.$ === 3) { if (model.$ === 3) {
var animation = model.a; var animation = model.a;
return $author$project$Main$Animating( return $author$project$Main$Animating(
@ -6171,13 +6191,13 @@ var $author$project$Main$processMessage = F2(
$author$project$Main$UnexpectedMessage('Frame index wasn\'t number, but \'' + (n + '\''))); $author$project$Main$UnexpectedMessage('Frame index wasn\'t number, but \'' + (n + '\'')));
} }
} else { } else {
break _v0$6; break _v0$7;
} }
default: default:
break _v0$6; break _v0$7;
} }
} else { } else {
break _v0$6; break _v0$7;
} }
} }
return $author$project$Main$Problem( return $author$project$Main$Problem(
@ -6192,11 +6212,11 @@ var $author$project$Main$processResult = F2(
} else { } else {
var wsMsg = result.a; var wsMsg = result.a;
if (!wsMsg.$) { if (!wsMsg.$) {
var error = wsMsg.a.az; var error = wsMsg.a.aA;
return $author$project$Main$Problem( return $author$project$Main$Problem(
$author$project$Main$UnexpectedMessage(error)); $author$project$Main$UnexpectedMessage(error));
} else { } else {
var data = wsMsg.a.aw; var data = wsMsg.a.ax;
return A2($author$project$Main$processMessage, data, model); return A2($author$project$Main$processMessage, data, model);
} }
} }
@ -6209,7 +6229,7 @@ var $author$project$Main$sendSource = function (txt) {
$bburdette$websocket$WebSocket$send, $bburdette$websocket$WebSocket$send,
$author$project$Ports$sendSocketCommand, $author$project$Ports$sendSocketCommand,
$bburdette$websocket$WebSocket$Send( $bburdette$websocket$WebSocket$Send(
{av: txt, _: 'TheSocket'})); {aw: txt, aa: 'TheSocket'}));
}; };
var $author$project$Fps$addToHead = F2( var $author$project$Fps$addToHead = F2(
function (dt, fps) { function (dt, fps) {
@ -6480,6 +6500,7 @@ var $elm$html$Html$Attributes$stringProperty = F2(
var $elm$html$Html$Attributes$class = $elm$html$Html$Attributes$stringProperty('className'); var $elm$html$Html$Attributes$class = $elm$html$Html$Attributes$stringProperty('className');
var $elm$html$Html$div = _VirtualDom_node('div'); var $elm$html$Html$div = _VirtualDom_node('div');
var $elm$html$Html$img = _VirtualDom_node('img'); var $elm$html$Html$img = _VirtualDom_node('img');
var $elm$html$Html$span = _VirtualDom_node('span');
var $elm$html$Html$Attributes$src = function (url) { var $elm$html$Html$Attributes$src = function (url) {
return A2( return A2(
$elm$html$Html$Attributes$stringProperty, $elm$html$Html$Attributes$stringProperty,
@ -6496,31 +6517,49 @@ var $author$project$Main$webBackend = function () {
return 'http://localhost:10162/'; return 'http://localhost:10162/';
} }
}(); }();
var $author$project$Main$frameView = function (bestFrame) { var $author$project$Main$frameView = F2(
var image = function () { function (bestFrame, mbWarning) {
if (!bestFrame.$) { var warn = function () {
var svgUrl = bestFrame.a; if (!mbWarning.$) {
return A2( var txt = mbWarning.a;
$elm$html$Html$img, return A2(
_List_fromArray( $elm$html$Html$span,
[ _List_fromArray(
$elm$html$Html$Attributes$src( [
_Utils_ap($author$project$Main$webBackend, svgUrl)) $elm$html$Html$Attributes$class('warning')
]), ]),
_List_Nil); _List_fromArray(
} else { [
return $elm$html$Html$text(''); $elm$html$Html$text(txt)
} ]));
}(); } else {
return A2( return A2($elm$html$Html$span, _List_Nil, _List_Nil);
$elm$html$Html$div, }
_List_fromArray( }();
[ var image = function () {
$elm$html$Html$Attributes$class('viewer') if (!bestFrame.$) {
]), var svgUrl = bestFrame.a;
_List_fromArray( return A2(
[image])); $elm$html$Html$img,
}; _List_fromArray(
[
$elm$html$Html$Attributes$src(
_Utils_ap($author$project$Main$webBackend, svgUrl))
]),
_List_Nil);
} else {
return $elm$html$Html$text('');
}
}();
return A2(
$elm$html$Html$div,
_List_fromArray(
[
$elm$html$Html$Attributes$class('viewer')
]),
_List_fromArray(
[image, warn]));
});
var $elm$html$Html$Attributes$id = $elm$html$Html$Attributes$stringProperty('id'); var $elm$html$Html$Attributes$id = $elm$html$Html$Attributes$stringProperty('id');
var $elm$html$Html$h1 = _VirtualDom_node('h1'); var $elm$html$Html$h1 = _VirtualDom_node('h1');
var $elm$html$Html$pre = _VirtualDom_node('pre'); var $elm$html$Html$pre = _VirtualDom_node('pre');
@ -6595,13 +6634,14 @@ var $author$project$Main$view = function (model) {
return $author$project$Main$problemView(problem); return $author$project$Main$problemView(problem);
default: default:
var bestFrame = model.a.C; var bestFrame = model.a.C;
return $author$project$Main$frameView(bestFrame); var warning = model.a.K;
return A2($author$project$Main$frameView, bestFrame, warning);
} }
}() }()
])) ]))
])); ]));
}; };
var $author$project$Main$main = $elm$browser$Browser$element( var $author$project$Main$main = $elm$browser$Browser$element(
{aD: $author$project$Main$init, aJ: $author$project$Main$subscriptions, aL: $author$project$Main$update, aM: $author$project$Main$view}); {aE: $author$project$Main$init, aK: $author$project$Main$subscriptions, aM: $author$project$Main$update, aN: $author$project$Main$view});
_Platform_export({'Main':{'init':$author$project$Main$main( _Platform_export({'Main':{'init':$author$project$Main$main(
$elm$json$Json$Decode$succeed(0))(0)}});}(this)); $elm$json$Json$Decode$succeed(0))(0)}});}(this));

View file

@ -58,6 +58,7 @@ function playgroundInit(elt) {
node: elt node: elt
}); });
app.ports.sendSocketCommand.subscribe(sendSocketCommand); app.ports.sendSocketCommand.subscribe(sendSocketCommand);
var tHandler = setTimeout(function(){},0);
return { return {
play: function () { play: function () {
app.ports.receiveControlMsg.send('play'); app.ports.receiveControlMsg.send('play');
@ -78,8 +79,11 @@ function playgroundInit(elt) {
app.ports.receiveControlMsg.send('seek-10'); app.ports.receiveControlMsg.send('seek-10');
}, },
newCode: function(code) { newCode: function(code) {
lastScript = code; clearTimeout(tHandler);
app.ports.receiveEditorMsg.send(code); tHandler = setTimeout(function() {
lastScript = code;
app.ports.receiveEditorMsg.send(code);
}, 500);
} }
}; };
} }

View file

@ -9,4 +9,4 @@ const snippets = [{"title": "Hello World","url": "https://reanimate.clozecards.c
,{"title": "Object Positions","url": "https://reanimate.clozecards.com/PHaVM0ar3yF/195.svg","code": "env =\n addStatic (mkBackground \"white\") .\n mapA (withStrokeColor \"black\")\n\nanimation :: Animation\nanimation = env $\n sceneAnimation $ do\n -- Configure objects\n txt <- newText \"Center\"\n top <- newText \"Top\"\n oModifyS top $ \n oTopY .= screenTop\n topR <- newText \"Top right\"\n oModifyS topR $ do\n oTopY .= screenTop\n oRightX .= screenRight\n botR <- newText \"Bottom right\"\n oModifyS botR $ do\n oTranslate .= (0, screenBottom+0.5)\n oRightX .= screenRight\n botL <- newText \"Bottom left\"\n oModifyS botL $ do\n oTranslate .= (0, screenBottom+0.5)\n oLeftX .= screenLeft\n topL <- newText \"Top left\"\n oModifyS topL $ do\n oTopY .= screenTop\n oLeftX .= screenLeft\n -- Show objects\n oShow txt\n wait 1\n switchTo txt top\n switchTo top topR\n switchTo topR botR\n switchTo botR botL\n switchTo botL topL\n switchTo topL txt\n\nswitchTo src dst = do\n fork $ oFadeOut src 1\n oModify dst $ oOpacity .~ 1\n oFadeIn dst 1\n wait 1\n\nnewText txt =\n newObject $ scale 1.5 $ center $ latex txt\n"} ,{"title": "Object Positions","url": "https://reanimate.clozecards.com/PHaVM0ar3yF/195.svg","code": "env =\n addStatic (mkBackground \"white\") .\n mapA (withStrokeColor \"black\")\n\nanimation :: Animation\nanimation = env $\n sceneAnimation $ do\n -- Configure objects\n txt <- newText \"Center\"\n top <- newText \"Top\"\n oModifyS top $ \n oTopY .= screenTop\n topR <- newText \"Top right\"\n oModifyS topR $ do\n oTopY .= screenTop\n oRightX .= screenRight\n botR <- newText \"Bottom right\"\n oModifyS botR $ do\n oTranslate .= (0, screenBottom+0.5)\n oRightX .= screenRight\n botL <- newText \"Bottom left\"\n oModifyS botL $ do\n oTranslate .= (0, screenBottom+0.5)\n oLeftX .= screenLeft\n topL <- newText \"Top left\"\n oModifyS topL $ do\n oTopY .= screenTop\n oLeftX .= screenLeft\n -- Show objects\n oShow txt\n wait 1\n switchTo txt top\n switchTo top topR\n switchTo topR botR\n switchTo botR botL\n switchTo botL topL\n switchTo topL txt\n\nswitchTo src dst = do\n fork $ oFadeOut src 1\n oModify dst $ oOpacity .~ 1\n oFadeIn dst 1\n wait 1\n\nnewText txt =\n newObject $ scale 1.5 $ center $ latex txt\n"}
,{"title": "Camera","url": "https://reanimate.clozecards.com/CD5Bg7AwVkF/150.svg","code": "animation :: Animation\nanimation = docEnv $ mapA (withFillOpacity 1) $ sceneAnimation $ do\n cam <- newObject Camera\n\n txt <- newObject $ center $ latex \"Fixed (non-cam)\"\n oModifyS txt $ do\n oTopY .= screenTop \n oZIndex .= 2\n\n circle <- newObject $ Circle 1\n cameraAttach cam circle\n oModify circle $ oContext .~ withFillColor \"blue\"\n circleRight <- oRead circle oRightX\n\n box <- newObject $ Rectangle 2 2\n cameraAttach cam box\n oModify box $ oContext .~ withFillColor \"green\"\n oModify box $ oLeftX .~ circleRight\n boxCenter <- oRead box oCenterXY\n\n small <- newObject $ center $ latex \"This text is very small\"\n cameraAttach cam small\n oModifyS small $ do\n oCenterXY .= boxCenter\n oScale .= 0.1\n \n oShow txt\n oShow small\n oShow circle\n oShow box\n\n wait 1\n\n cameraFocus cam boxCenter\n waitOn $ do\n fork $ cameraPan cam 3 boxCenter\n fork $ cameraZoom cam 3 15\n \n wait 2\n cameraZoom cam 3 1\n cameraPan cam 1 (0,0)\n"} ,{"title": "Camera","url": "https://reanimate.clozecards.com/CD5Bg7AwVkF/150.svg","code": "animation :: Animation\nanimation = docEnv $ mapA (withFillOpacity 1) $ sceneAnimation $ do\n cam <- newObject Camera\n\n txt <- newObject $ center $ latex \"Fixed (non-cam)\"\n oModifyS txt $ do\n oTopY .= screenTop \n oZIndex .= 2\n\n circle <- newObject $ Circle 1\n cameraAttach cam circle\n oModify circle $ oContext .~ withFillColor \"blue\"\n circleRight <- oRead circle oRightX\n\n box <- newObject $ Rectangle 2 2\n cameraAttach cam box\n oModify box $ oContext .~ withFillColor \"green\"\n oModify box $ oLeftX .~ circleRight\n boxCenter <- oRead box oCenterXY\n\n small <- newObject $ center $ latex \"This text is very small\"\n cameraAttach cam small\n oModifyS small $ do\n oCenterXY .= boxCenter\n oScale .= 0.1\n \n oShow txt\n oShow small\n oShow circle\n oShow box\n\n wait 1\n\n cameraFocus cam boxCenter\n waitOn $ do\n fork $ cameraPan cam 3 boxCenter\n fork $ cameraZoom cam 3 15\n \n wait 2\n cameraZoom cam 3 1\n cameraPan cam 1 (0,0)\n"}
]; ];
const playgroundVersion = "2020-08-28 (39297)"; const playgroundVersion = "2020-08-28 (917dc)";

View file

@ -33,7 +33,7 @@ span.spaces { background: white }
<span class="lineno"> 14 </span> ( render <span class="lineno"> 14 </span> ( render
<span class="lineno"> 15 </span> , renderSvgs <span class="lineno"> 15 </span> , renderSvgs
<span class="lineno"> 16 </span> , renderSnippets -- :: Animation -&gt; IO () <span class="lineno"> 16 </span> , renderSnippets -- :: Animation -&gt; IO ()
<span class="lineno"> 17 </span> , renderOneFrame <span class="lineno"> 17 </span> , renderLimitedFrames
<span class="lineno"> 18 </span> , Format(..) <span class="lineno"> 18 </span> , Format(..)
<span class="lineno"> 19 </span> , Raster(..) <span class="lineno"> 19 </span> , Raster(..)
<span class="lineno"> 20 </span> , Width, Height, FPS <span class="lineno"> 20 </span> , Width, Height, FPS
@ -101,336 +101,344 @@ span.spaces { background: white }
<span class="lineno"> 82 </span><span class="spaces"> </span><span class="nottickedoff">hPutStrLn stderr msg</span> <span class="lineno"> 82 </span><span class="spaces"> </span><span class="nottickedoff">hPutStrLn stderr msg</span>
<span class="lineno"> 83 </span><span class="spaces"> </span><span class="nottickedoff">exitWith (ExitFailure 1)</span></span> <span class="lineno"> 83 </span><span class="spaces"> </span><span class="nottickedoff">exitWith (ExitFailure 1)</span></span>
<span class="lineno"> 84 </span> <span class="lineno"> 84 </span>
<span class="lineno"> 85 </span>-- | Select a single frame that doesn't already exist in the output <span class="lineno"> 85 </span>-- | Render as many frames as possible in 2 seconds. Limited to 20 frames.
<span class="lineno"> 86 </span>-- folder and render it. If all frames have been rendered, print &quot;Done&quot;. <span class="lineno"> 86 </span>renderLimitedFrames :: FilePath -&gt; Int -&gt; Bool -&gt; Int -&gt; Animation -&gt; IO ()
<span class="lineno"> 87 </span>renderOneFrame :: FilePath -&gt; Int -&gt; Bool -&gt; Int -&gt; Animation -&gt; IO () <span class="lineno"> 87 </span><span class="decl"><span class="nottickedoff">renderLimitedFrames folder offset _prettyPrint rate ani = do</span>
<span class="lineno"> 88 </span><span class="decl"><span class="nottickedoff">renderOneFrame folder offset _prettyPrint rate ani =</span> <span class="lineno"> 88 </span><span class="spaces"> </span><span class="nottickedoff">now &lt;- getCurrentTime</span>
<span class="lineno"> 89 </span><span class="spaces"> </span><span class="nottickedoff">worker (frameOrder rate frameCount)</span> <span class="lineno"> 89 </span><span class="spaces"> </span><span class="nottickedoff">worker (addUTCTime timeLimit now) frameLimit (frameOrder rate frameCount)</span>
<span class="lineno"> 90 </span><span class="spaces"> </span><span class="nottickedoff">where</span> <span class="lineno"> 90 </span><span class="spaces"> </span><span class="nottickedoff">where</span>
<span class="lineno"> 91 </span><span class="spaces"> </span><span class="nottickedoff">worker [] = putStrLn &quot;Done&quot;</span> <span class="lineno"> 91 </span><span class="spaces"> </span><span class="nottickedoff">timeLimit = 2</span>
<span class="lineno"> 92 </span><span class="spaces"> </span><span class="nottickedoff">worker (x:xs) = do</span> <span class="lineno"> 92 </span><span class="spaces"> </span><span class="nottickedoff">frameLimit = 20 :: Int</span>
<span class="lineno"> 93 </span><span class="spaces"> </span><span class="nottickedoff">let nth = (x+offset) `mod` frameCount</span> <span class="lineno"> 93 </span><span class="spaces"> </span><span class="nottickedoff">worker _ 0 _ = return ()</span>
<span class="lineno"> 94 </span><span class="spaces"> </span><span class="nottickedoff">now = (duration ani / (fromIntegral frameCount - 1)) * fromIntegral nth</span> <span class="lineno"> 94 </span><span class="spaces"> </span><span class="nottickedoff">worker _ _ [] = putStrLn &quot;Done&quot;</span>
<span class="lineno"> 95 </span><span class="spaces"> </span><span class="nottickedoff">frame = frameAt (if frameCount &lt;= 1 then 0 else now) ani</span> <span class="lineno"> 95 </span><span class="spaces"> </span><span class="nottickedoff">worker localTimeLimit l (x:xs) = do</span>
<span class="lineno"> 96 </span><span class="spaces"> </span><span class="nottickedoff">svg = renderSvg Nothing Nothing frame</span> <span class="lineno"> 96 </span><span class="spaces"> </span><span class="nottickedoff">curTime &lt;- getCurrentTime</span>
<span class="lineno"> 97 </span><span class="spaces"> </span><span class="nottickedoff">path = folder &lt;/&gt; show nth &lt;.&gt; &quot;svg&quot;</span> <span class="lineno"> 97 </span><span class="spaces"> </span><span class="nottickedoff">if curTime &gt; localTimeLimit</span>
<span class="lineno"> 98 </span><span class="spaces"> </span><span class="nottickedoff">tmpPath = path &lt;.&gt; &quot;tmp&quot;</span> <span class="lineno"> 98 </span><span class="spaces"> </span><span class="nottickedoff">then return ()</span>
<span class="lineno"> 99 </span><span class="spaces"> </span><span class="nottickedoff">haveFile &lt;- doesFileExist path</span> <span class="lineno"> 99 </span><span class="spaces"> </span><span class="nottickedoff">else do</span>
<span class="lineno"> 100 </span><span class="spaces"> </span><span class="nottickedoff">if haveFile</span> <span class="lineno"> 100 </span><span class="spaces"> </span><span class="nottickedoff">let nth = (x+offset) `mod` frameCount</span>
<span class="lineno"> 101 </span><span class="spaces"> </span><span class="nottickedoff">then worker xs</span> <span class="lineno"> 101 </span><span class="spaces"> </span><span class="nottickedoff">now = (duration ani / (fromIntegral frameCount - 1)) * fromIntegral nth</span>
<span class="lineno"> 102 </span><span class="spaces"> </span><span class="nottickedoff">else do</span> <span class="lineno"> 102 </span><span class="spaces"> </span><span class="nottickedoff">frame = frameAt (if frameCount &lt;= 1 then 0 else now) ani</span>
<span class="lineno"> 103 </span><span class="spaces"> </span><span class="nottickedoff">writeFile tmpPath svg</span> <span class="lineno"> 103 </span><span class="spaces"> </span><span class="nottickedoff">svg = renderSvg Nothing Nothing frame</span>
<span class="lineno"> 104 </span><span class="spaces"> </span><span class="nottickedoff">renameOrCopyFile tmpPath path</span> <span class="lineno"> 104 </span><span class="spaces"> </span><span class="nottickedoff">path = folder &lt;/&gt; show nth &lt;.&gt; &quot;svg&quot;</span>
<span class="lineno"> 105 </span><span class="spaces"> </span><span class="nottickedoff">print nth</span> <span class="lineno"> 105 </span><span class="spaces"> </span><span class="nottickedoff">tmpPath = path &lt;.&gt; &quot;tmp&quot;</span>
<span class="lineno"> 106 </span><span class="spaces"> </span><span class="nottickedoff">frameCount = round (duration ani * fromIntegral rate) :: Int</span></span> <span class="lineno"> 106 </span><span class="spaces"> </span><span class="nottickedoff">haveFile &lt;- doesFileExist path</span>
<span class="lineno"> 107 </span> <span class="lineno"> 107 </span><span class="spaces"> </span><span class="nottickedoff">if haveFile</span>
<span class="lineno"> 108 </span>-- XXX: Merge with 'renderSvgs' <span class="lineno"> 108 </span><span class="spaces"> </span><span class="nottickedoff">then worker localTimeLimit l xs</span>
<span class="lineno"> 109 </span>-- | Render 10 frames and print them to stdout. Used for testing. <span class="lineno"> 109 </span><span class="spaces"> </span><span class="nottickedoff">else do</span>
<span class="lineno"> 110 </span>-- <span class="lineno"> 110 </span><span class="spaces"> </span><span class="nottickedoff">writeFile tmpPath svg</span>
<span class="lineno"> 111 </span>-- XXX: Not related to the snippets in the playground. <span class="lineno"> 111 </span><span class="spaces"> </span><span class="nottickedoff">renameOrCopyFile tmpPath path</span>
<span class="lineno"> 112 </span>renderSnippets :: Animation -&gt; IO () <span class="lineno"> 112 </span><span class="spaces"> </span><span class="nottickedoff">print nth</span>
<span class="lineno"> 113 </span><span class="decl"><span class="istickedoff">renderSnippets ani = forM_ [0 .. frameCount - 1] $ \nth -&gt; do</span> <span class="lineno"> 113 </span><span class="spaces"> </span><span class="nottickedoff">worker localTimeLimit (l-1) xs</span>
<span class="lineno"> 114 </span><span class="spaces"> </span><span class="istickedoff">let now = (duration ani / (fromIntegral frameCount - 1)) * fromIntegral nth</span> <span class="lineno"> 114 </span><span class="spaces"> </span><span class="nottickedoff">frameCount = round (duration ani * fromIntegral rate) :: Int</span></span>
<span class="lineno"> 115 </span><span class="spaces"> </span><span class="istickedoff">frame = frameAt now ani</span> <span class="lineno"> 115 </span>
<span class="lineno"> 116 </span><span class="spaces"> </span><span class="istickedoff">svg = renderSvg Nothing Nothing frame</span> <span class="lineno"> 116 </span>-- XXX: Merge with 'renderSvgs'
<span class="lineno"> 117 </span><span class="spaces"> </span><span class="istickedoff">putStr (show nth)</span> <span class="lineno"> 117 </span>-- | Render 10 frames and print them to stdout. Used for testing.
<span class="lineno"> 118 </span><span class="spaces"> </span><span class="istickedoff">T.putStrLn $ T.concat . T.lines . T.pack $ svg</span> <span class="lineno"> 118 </span>--
<span class="lineno"> 119 </span><span class="spaces"> </span><span class="istickedoff">where frameCount = 10 :: Integer</span></span> <span class="lineno"> 119 </span>-- XXX: Not related to the snippets in the playground.
<span class="lineno"> 120 </span> <span class="lineno"> 120 </span>renderSnippets :: Animation -&gt; IO ()
<span class="lineno"> 121 </span>frameOrder :: Int -&gt; Int -&gt; [Int] <span class="lineno"> 121 </span><span class="decl"><span class="istickedoff">renderSnippets ani = forM_ [0 .. frameCount - 1] $ \nth -&gt; do</span>
<span class="lineno"> 122 </span><span class="decl"><span class="nottickedoff">frameOrder fps nFrames = worker [] fps</span> <span class="lineno"> 122 </span><span class="spaces"> </span><span class="istickedoff">let now = (duration ani / (fromIntegral frameCount - 1)) * fromIntegral nth</span>
<span class="lineno"> 123 </span><span class="spaces"> </span><span class="nottickedoff">where</span> <span class="lineno"> 123 </span><span class="spaces"> </span><span class="istickedoff">frame = frameAt now ani</span>
<span class="lineno"> 124 </span><span class="spaces"> </span><span class="nottickedoff">worker _seen 0 = []</span> <span class="lineno"> 124 </span><span class="spaces"> </span><span class="istickedoff">svg = renderSvg Nothing Nothing frame</span>
<span class="lineno"> 125 </span><span class="spaces"> </span><span class="nottickedoff">worker seen nthFrame = filterFrameList seen nthFrame nFrames</span> <span class="lineno"> 125 </span><span class="spaces"> </span><span class="istickedoff">putStr (show nth)</span>
<span class="lineno"> 126 </span><span class="spaces"> </span><span class="nottickedoff">++ worker (nthFrame : seen) (nthFrame `div` 2)</span></span> <span class="lineno"> 126 </span><span class="spaces"> </span><span class="istickedoff">T.putStrLn $ T.concat . T.lines . T.pack $ svg</span>
<span class="lineno"> 127 </span> <span class="lineno"> 127 </span><span class="spaces"> </span><span class="istickedoff">where frameCount = 10 :: Integer</span></span>
<span class="lineno"> 128 </span>filterFrameList :: [Int] -&gt; Int -&gt; Int -&gt; [Int] <span class="lineno"> 128 </span>
<span class="lineno"> 129 </span><span class="decl"><span class="nottickedoff">filterFrameList seen nthFrame nFrames = filter (not . isSeen)</span> <span class="lineno"> 129 </span>frameOrder :: Int -&gt; Int -&gt; [Int]
<span class="lineno"> 130 </span><span class="spaces"> </span><span class="nottickedoff">[0, nthFrame .. nFrames - 1]</span> <span class="lineno"> 130 </span><span class="decl"><span class="nottickedoff">frameOrder fps nFrames = worker [] fps</span>
<span class="lineno"> 131 </span><span class="spaces"> </span><span class="nottickedoff">where isSeen x = any (\y -&gt; x `mod` y == 0) seen</span></span> <span class="lineno"> 131 </span><span class="spaces"> </span><span class="nottickedoff">where</span>
<span class="lineno"> 132 </span> <span class="lineno"> 132 </span><span class="spaces"> </span><span class="nottickedoff">worker _seen 0 = []</span>
<span class="lineno"> 133 </span>-- | Video formats supported by reanimate. <span class="lineno"> 133 </span><span class="spaces"> </span><span class="nottickedoff">worker seen nthFrame = filterFrameList seen nthFrame nFrames</span>
<span class="lineno"> 134 </span>data Format = RenderMp4 | RenderGif | RenderWebm <span class="lineno"> 134 </span><span class="spaces"> </span><span class="nottickedoff">++ worker (nthFrame : seen) (nthFrame `div` 2)</span></span>
<span class="lineno"> 135 </span> deriving (<span class="decl"><span class="nottickedoff">Show</span></span>) <span class="lineno"> 135 </span>
<span class="lineno"> 136 </span> <span class="lineno"> 136 </span>filterFrameList :: [Int] -&gt; Int -&gt; Int -&gt; [Int]
<span class="lineno"> 137 </span>mp4Arguments :: FPS -&gt; FilePath -&gt; FilePath -&gt; FilePath -&gt; [String] <span class="lineno"> 137 </span><span class="decl"><span class="nottickedoff">filterFrameList seen nthFrame nFrames = filter (not . isSeen)</span>
<span class="lineno"> 138 </span><span class="decl"><span class="nottickedoff">mp4Arguments fps progress template target =</span> <span class="lineno"> 138 </span><span class="spaces"> </span><span class="nottickedoff">[0, nthFrame .. nFrames - 1]</span>
<span class="lineno"> 139 </span><span class="spaces"> </span><span class="nottickedoff">[ &quot;-r&quot;</span> <span class="lineno"> 139 </span><span class="spaces"> </span><span class="nottickedoff">where isSeen x = any (\y -&gt; x `mod` y == 0) seen</span></span>
<span class="lineno"> 140 </span><span class="spaces"> </span><span class="nottickedoff">, show fps</span> <span class="lineno"> 140 </span>
<span class="lineno"> 141 </span><span class="spaces"> </span><span class="nottickedoff">, &quot;-i&quot;</span> <span class="lineno"> 141 </span>-- | Video formats supported by reanimate.
<span class="lineno"> 142 </span><span class="spaces"> </span><span class="nottickedoff">, template</span> <span class="lineno"> 142 </span>data Format = RenderMp4 | RenderGif | RenderWebm
<span class="lineno"> 143 </span><span class="spaces"> </span><span class="nottickedoff">, &quot;-y&quot;</span> <span class="lineno"> 143 </span> deriving (<span class="decl"><span class="nottickedoff">Show</span></span>)
<span class="lineno"> 144 </span><span class="spaces"> </span><span class="nottickedoff">, &quot;-c:v&quot;</span> <span class="lineno"> 144 </span>
<span class="lineno"> 145 </span><span class="spaces"> </span><span class="nottickedoff">, &quot;libx264&quot;</span> <span class="lineno"> 145 </span>mp4Arguments :: FPS -&gt; FilePath -&gt; FilePath -&gt; FilePath -&gt; [String]
<span class="lineno"> 146 </span><span class="spaces"> </span><span class="nottickedoff">, &quot;-vf&quot;</span> <span class="lineno"> 146 </span><span class="decl"><span class="nottickedoff">mp4Arguments fps progress template target =</span>
<span class="lineno"> 147 </span><span class="spaces"> </span><span class="nottickedoff">, &quot;fps=&quot; ++ show fps</span> <span class="lineno"> 147 </span><span class="spaces"> </span><span class="nottickedoff">[ &quot;-r&quot;</span>
<span class="lineno"> 148 </span><span class="spaces"> </span><span class="nottickedoff">, &quot;-preset&quot;</span> <span class="lineno"> 148 </span><span class="spaces"> </span><span class="nottickedoff">, show fps</span>
<span class="lineno"> 149 </span><span class="spaces"> </span><span class="nottickedoff">, &quot;slow&quot;</span> <span class="lineno"> 149 </span><span class="spaces"> </span><span class="nottickedoff">, &quot;-i&quot;</span>
<span class="lineno"> 150 </span><span class="spaces"> </span><span class="nottickedoff">, &quot;-crf&quot;</span> <span class="lineno"> 150 </span><span class="spaces"> </span><span class="nottickedoff">, template</span>
<span class="lineno"> 151 </span><span class="spaces"> </span><span class="nottickedoff">, &quot;18&quot;</span> <span class="lineno"> 151 </span><span class="spaces"> </span><span class="nottickedoff">, &quot;-y&quot;</span>
<span class="lineno"> 152 </span><span class="spaces"> </span><span class="nottickedoff">, &quot;-movflags&quot;</span> <span class="lineno"> 152 </span><span class="spaces"> </span><span class="nottickedoff">, &quot;-c:v&quot;</span>
<span class="lineno"> 153 </span><span class="spaces"> </span><span class="nottickedoff">, &quot;+faststart&quot;</span> <span class="lineno"> 153 </span><span class="spaces"> </span><span class="nottickedoff">, &quot;libx264&quot;</span>
<span class="lineno"> 154 </span><span class="spaces"> </span><span class="nottickedoff">, &quot;-progress&quot;</span> <span class="lineno"> 154 </span><span class="spaces"> </span><span class="nottickedoff">, &quot;-vf&quot;</span>
<span class="lineno"> 155 </span><span class="spaces"> </span><span class="nottickedoff">, progress</span> <span class="lineno"> 155 </span><span class="spaces"> </span><span class="nottickedoff">, &quot;fps=&quot; ++ show fps</span>
<span class="lineno"> 156 </span><span class="spaces"> </span><span class="nottickedoff">, &quot;-pix_fmt&quot;</span> <span class="lineno"> 156 </span><span class="spaces"> </span><span class="nottickedoff">, &quot;-preset&quot;</span>
<span class="lineno"> 157 </span><span class="spaces"> </span><span class="nottickedoff">, &quot;yuv420p&quot;</span> <span class="lineno"> 157 </span><span class="spaces"> </span><span class="nottickedoff">, &quot;slow&quot;</span>
<span class="lineno"> 158 </span><span class="spaces"> </span><span class="nottickedoff">, target</span> <span class="lineno"> 158 </span><span class="spaces"> </span><span class="nottickedoff">, &quot;-crf&quot;</span>
<span class="lineno"> 159 </span><span class="spaces"> </span><span class="nottickedoff">]</span></span> <span class="lineno"> 159 </span><span class="spaces"> </span><span class="nottickedoff">, &quot;18&quot;</span>
<span class="lineno"> 160 </span> <span class="lineno"> 160 </span><span class="spaces"> </span><span class="nottickedoff">, &quot;-movflags&quot;</span>
<span class="lineno"> 161 </span>-- gifArguments :: FPS -&gt; FilePath -&gt; FilePath -&gt; FilePath -&gt; [String] <span class="lineno"> 161 </span><span class="spaces"> </span><span class="nottickedoff">, &quot;+faststart&quot;</span>
<span class="lineno"> 162 </span>-- gifArguments fps progress template target = <span class="lineno"> 162 </span><span class="spaces"> </span><span class="nottickedoff">, &quot;-progress&quot;</span>
<span class="lineno"> 163 </span> <span class="lineno"> 163 </span><span class="spaces"> </span><span class="nottickedoff">, progress</span>
<span class="lineno"> 164 </span>-- | Render animation to a video file with given parameters. <span class="lineno"> 164 </span><span class="spaces"> </span><span class="nottickedoff">, &quot;-pix_fmt&quot;</span>
<span class="lineno"> 165 </span>render <span class="lineno"> 165 </span><span class="spaces"> </span><span class="nottickedoff">, &quot;yuv420p&quot;</span>
<span class="lineno"> 166 </span> :: Animation <span class="lineno"> 166 </span><span class="spaces"> </span><span class="nottickedoff">, target</span>
<span class="lineno"> 167 </span> -&gt; FilePath <span class="lineno"> 167 </span><span class="spaces"> </span><span class="nottickedoff">]</span></span>
<span class="lineno"> 168 </span> -&gt; Raster <span class="lineno"> 168 </span>
<span class="lineno"> 169 </span> -&gt; Format <span class="lineno"> 169 </span>-- gifArguments :: FPS -&gt; FilePath -&gt; FilePath -&gt; FilePath -&gt; [String]
<span class="lineno"> 170 </span> -&gt; Width <span class="lineno"> 170 </span>-- gifArguments fps progress template target =
<span class="lineno"> 171 </span> -&gt; Height <span class="lineno"> 171 </span>
<span class="lineno"> 172 </span> -&gt; FPS <span class="lineno"> 172 </span>-- | Render animation to a video file with given parameters.
<span class="lineno"> 173 </span> -&gt; Bool <span class="lineno"> 173 </span>render
<span class="lineno"> 174 </span> -&gt; IO () <span class="lineno"> 174 </span> :: Animation
<span class="lineno"> 175 </span><span class="decl"><span class="nottickedoff">render ani target raster format width height fps partial = do</span> <span class="lineno"> 175 </span> -&gt; FilePath
<span class="lineno"> 176 </span><span class="spaces"> </span><span class="nottickedoff">printf &quot;Starting render of animation: %.1f\n&quot; (duration ani)</span> <span class="lineno"> 176 </span> -&gt; Raster
<span class="lineno"> 177 </span><span class="spaces"> </span><span class="nottickedoff">ffmpeg &lt;- requireExecutable &quot;ffmpeg&quot;</span> <span class="lineno"> 177 </span> -&gt; Format
<span class="lineno"> 178 </span><span class="spaces"> </span><span class="nottickedoff">generateFrames raster ani width height fps partial $ \template -&gt;</span> <span class="lineno"> 178 </span> -&gt; Width
<span class="lineno"> 179 </span><span class="spaces"> </span><span class="nottickedoff">withTempFile &quot;txt&quot; $ \progress -&gt; do</span> <span class="lineno"> 179 </span> -&gt; Height
<span class="lineno"> 180 </span><span class="spaces"> </span><span class="nottickedoff">writeFile progress &quot;&quot;</span> <span class="lineno"> 180 </span> -&gt; FPS
<span class="lineno"> 181 </span><span class="spaces"> </span><span class="nottickedoff">progressH &lt;- openFile progress ReadMode</span> <span class="lineno"> 181 </span> -&gt; Bool
<span class="lineno"> 182 </span><span class="spaces"> </span><span class="nottickedoff">hSetBuffering progressH NoBuffering</span> <span class="lineno"> 182 </span> -&gt; IO ()
<span class="lineno"> 183 </span><span class="spaces"> </span><span class="nottickedoff">allFinished &lt;- newEmptyMVar</span> <span class="lineno"> 183 </span><span class="decl"><span class="nottickedoff">render ani target raster format width height fps partial = do</span>
<span class="lineno"> 184 </span><span class="spaces"> </span><span class="nottickedoff">void $ forkIO $ do</span> <span class="lineno"> 184 </span><span class="spaces"> </span><span class="nottickedoff">printf &quot;Starting render of animation: %.1f\n&quot; (duration ani)</span>
<span class="lineno"> 185 </span><span class="spaces"> </span><span class="nottickedoff">progressPrinter &quot;rendered&quot; (animationFrameCount ani fps)</span> <span class="lineno"> 185 </span><span class="spaces"> </span><span class="nottickedoff">ffmpeg &lt;- requireExecutable &quot;ffmpeg&quot;</span>
<span class="lineno"> 186 </span><span class="spaces"> </span><span class="nottickedoff">$ \done -&gt; fix $ \loop -&gt; do</span> <span class="lineno"> 186 </span><span class="spaces"> </span><span class="nottickedoff">generateFrames raster ani width height fps partial $ \template -&gt;</span>
<span class="lineno"> 187 </span><span class="spaces"> </span><span class="nottickedoff">eof &lt;- hIsEOF progressH</span> <span class="lineno"> 187 </span><span class="spaces"> </span><span class="nottickedoff">withTempFile &quot;txt&quot; $ \progress -&gt; do</span>
<span class="lineno"> 188 </span><span class="spaces"> </span><span class="nottickedoff">if eof</span> <span class="lineno"> 188 </span><span class="spaces"> </span><span class="nottickedoff">writeFile progress &quot;&quot;</span>
<span class="lineno"> 189 </span><span class="spaces"> </span><span class="nottickedoff">then threadDelay 1000000 &gt;&gt; loop</span> <span class="lineno"> 189 </span><span class="spaces"> </span><span class="nottickedoff">progressH &lt;- openFile progress ReadMode</span>
<span class="lineno"> 190 </span><span class="spaces"> </span><span class="nottickedoff">else do</span> <span class="lineno"> 190 </span><span class="spaces"> </span><span class="nottickedoff">hSetBuffering progressH NoBuffering</span>
<span class="lineno"> 191 </span><span class="spaces"> </span><span class="nottickedoff">l &lt;- try (hGetLine progressH)</span> <span class="lineno"> 191 </span><span class="spaces"> </span><span class="nottickedoff">allFinished &lt;- newEmptyMVar</span>
<span class="lineno"> 192 </span><span class="spaces"> </span><span class="nottickedoff">case l of</span> <span class="lineno"> 192 </span><span class="spaces"> </span><span class="nottickedoff">void $ forkIO $ do</span>
<span class="lineno"> 193 </span><span class="spaces"> </span><span class="nottickedoff">Left SomeException{} -&gt; return ()</span> <span class="lineno"> 193 </span><span class="spaces"> </span><span class="nottickedoff">progressPrinter &quot;rendered&quot; (animationFrameCount ani fps)</span>
<span class="lineno"> 194 </span><span class="spaces"> </span><span class="nottickedoff">Right str -&gt;</span> <span class="lineno"> 194 </span><span class="spaces"> </span><span class="nottickedoff">$ \done -&gt; fix $ \loop -&gt; do</span>
<span class="lineno"> 195 </span><span class="spaces"> </span><span class="nottickedoff">case take 6 str of</span> <span class="lineno"> 195 </span><span class="spaces"> </span><span class="nottickedoff">eof &lt;- hIsEOF progressH</span>
<span class="lineno"> 196 </span><span class="spaces"> </span><span class="nottickedoff">&quot;frame=&quot; -&gt; do</span> <span class="lineno"> 196 </span><span class="spaces"> </span><span class="nottickedoff">if eof</span>
<span class="lineno"> 197 </span><span class="spaces"> </span><span class="nottickedoff">void $ swapMVar done (read (drop 6 str))</span> <span class="lineno"> 197 </span><span class="spaces"> </span><span class="nottickedoff">then threadDelay 1000000 &gt;&gt; loop</span>
<span class="lineno"> 198 </span><span class="spaces"> </span><span class="nottickedoff">loop</span> <span class="lineno"> 198 </span><span class="spaces"> </span><span class="nottickedoff">else do</span>
<span class="lineno"> 199 </span><span class="spaces"> </span><span class="nottickedoff">_ | str == &quot;progress=end&quot; -&gt; return ()</span> <span class="lineno"> 199 </span><span class="spaces"> </span><span class="nottickedoff">l &lt;- try (hGetLine progressH)</span>
<span class="lineno"> 200 </span><span class="spaces"> </span><span class="nottickedoff">_ -&gt; loop</span> <span class="lineno"> 200 </span><span class="spaces"> </span><span class="nottickedoff">case l of</span>
<span class="lineno"> 201 </span><span class="spaces"> </span><span class="nottickedoff">putMVar allFinished ()</span> <span class="lineno"> 201 </span><span class="spaces"> </span><span class="nottickedoff">Left SomeException{} -&gt; return ()</span>
<span class="lineno"> 202 </span><span class="spaces"> </span><span class="nottickedoff">case format of</span> <span class="lineno"> 202 </span><span class="spaces"> </span><span class="nottickedoff">Right str -&gt;</span>
<span class="lineno"> 203 </span><span class="spaces"> </span><span class="nottickedoff">RenderMp4 -&gt; runCmd ffmpeg (mp4Arguments fps progress template target)</span> <span class="lineno"> 203 </span><span class="spaces"> </span><span class="nottickedoff">case take 6 str of</span>
<span class="lineno"> 204 </span><span class="spaces"> </span><span class="nottickedoff">RenderGif -&gt; withTempFile &quot;png&quot; $ \palette -&gt; do</span> <span class="lineno"> 204 </span><span class="spaces"> </span><span class="nottickedoff">&quot;frame=&quot; -&gt; do</span>
<span class="lineno"> 205 </span><span class="spaces"> </span><span class="nottickedoff">runCmd</span> <span class="lineno"> 205 </span><span class="spaces"> </span><span class="nottickedoff">void $ swapMVar done (read (drop 6 str))</span>
<span class="lineno"> 206 </span><span class="spaces"> </span><span class="nottickedoff">ffmpeg</span> <span class="lineno"> 206 </span><span class="spaces"> </span><span class="nottickedoff">loop</span>
<span class="lineno"> 207 </span><span class="spaces"> </span><span class="nottickedoff">[ &quot;-i&quot;</span> <span class="lineno"> 207 </span><span class="spaces"> </span><span class="nottickedoff">_ | str == &quot;progress=end&quot; -&gt; return ()</span>
<span class="lineno"> 208 </span><span class="spaces"> </span><span class="nottickedoff">, template</span> <span class="lineno"> 208 </span><span class="spaces"> </span><span class="nottickedoff">_ -&gt; loop</span>
<span class="lineno"> 209 </span><span class="spaces"> </span><span class="nottickedoff">, &quot;-y&quot;</span> <span class="lineno"> 209 </span><span class="spaces"> </span><span class="nottickedoff">putMVar allFinished ()</span>
<span class="lineno"> 210 </span><span class="spaces"> </span><span class="nottickedoff">, &quot;-vf&quot;</span> <span class="lineno"> 210 </span><span class="spaces"> </span><span class="nottickedoff">case format of</span>
<span class="lineno"> 211 </span><span class="spaces"> </span><span class="nottickedoff">, &quot;fps=&quot;</span> <span class="lineno"> 211 </span><span class="spaces"> </span><span class="nottickedoff">RenderMp4 -&gt; runCmd ffmpeg (mp4Arguments fps progress template target)</span>
<span class="lineno"> 212 </span><span class="spaces"> </span><span class="nottickedoff">++ show fps</span> <span class="lineno"> 212 </span><span class="spaces"> </span><span class="nottickedoff">RenderGif -&gt; withTempFile &quot;png&quot; $ \palette -&gt; do</span>
<span class="lineno"> 213 </span><span class="spaces"> </span><span class="nottickedoff">++ &quot;,scale=&quot;</span> <span class="lineno"> 213 </span><span class="spaces"> </span><span class="nottickedoff">runCmd</span>
<span class="lineno"> 214 </span><span class="spaces"> </span><span class="nottickedoff">++ show width</span> <span class="lineno"> 214 </span><span class="spaces"> </span><span class="nottickedoff">ffmpeg</span>
<span class="lineno"> 215 </span><span class="spaces"> </span><span class="nottickedoff">++ &quot;:&quot;</span> <span class="lineno"> 215 </span><span class="spaces"> </span><span class="nottickedoff">[ &quot;-i&quot;</span>
<span class="lineno"> 216 </span><span class="spaces"> </span><span class="nottickedoff">++ show height</span> <span class="lineno"> 216 </span><span class="spaces"> </span><span class="nottickedoff">, template</span>
<span class="lineno"> 217 </span><span class="spaces"> </span><span class="nottickedoff">++ &quot;:flags=lanczos,palettegen&quot;</span> <span class="lineno"> 217 </span><span class="spaces"> </span><span class="nottickedoff">, &quot;-y&quot;</span>
<span class="lineno"> 218 </span><span class="spaces"> </span><span class="nottickedoff">, &quot;-t&quot;</span> <span class="lineno"> 218 </span><span class="spaces"> </span><span class="nottickedoff">, &quot;-vf&quot;</span>
<span class="lineno"> 219 </span><span class="spaces"> </span><span class="nottickedoff">, showFFloat Nothing (duration ani) &quot;&quot;</span> <span class="lineno"> 219 </span><span class="spaces"> </span><span class="nottickedoff">, &quot;fps=&quot;</span>
<span class="lineno"> 220 </span><span class="spaces"> </span><span class="nottickedoff">, palette</span> <span class="lineno"> 220 </span><span class="spaces"> </span><span class="nottickedoff">++ show fps</span>
<span class="lineno"> 221 </span><span class="spaces"> </span><span class="nottickedoff">]</span> <span class="lineno"> 221 </span><span class="spaces"> </span><span class="nottickedoff">++ &quot;,scale=&quot;</span>
<span class="lineno"> 222 </span><span class="spaces"> </span><span class="nottickedoff">runCmd</span> <span class="lineno"> 222 </span><span class="spaces"> </span><span class="nottickedoff">++ show width</span>
<span class="lineno"> 223 </span><span class="spaces"> </span><span class="nottickedoff">ffmpeg</span> <span class="lineno"> 223 </span><span class="spaces"> </span><span class="nottickedoff">++ &quot;:&quot;</span>
<span class="lineno"> 224 </span><span class="spaces"> </span><span class="nottickedoff">[ &quot;-framerate&quot;</span> <span class="lineno"> 224 </span><span class="spaces"> </span><span class="nottickedoff">++ show height</span>
<span class="lineno"> 225 </span><span class="spaces"> </span><span class="nottickedoff">, show fps</span> <span class="lineno"> 225 </span><span class="spaces"> </span><span class="nottickedoff">++ &quot;:flags=lanczos,palettegen&quot;</span>
<span class="lineno"> 226 </span><span class="spaces"> </span><span class="nottickedoff">, &quot;-i&quot;</span> <span class="lineno"> 226 </span><span class="spaces"> </span><span class="nottickedoff">, &quot;-t&quot;</span>
<span class="lineno"> 227 </span><span class="spaces"> </span><span class="nottickedoff">, template</span> <span class="lineno"> 227 </span><span class="spaces"> </span><span class="nottickedoff">, showFFloat Nothing (duration ani) &quot;&quot;</span>
<span class="lineno"> 228 </span><span class="spaces"> </span><span class="nottickedoff">, &quot;-y&quot;</span> <span class="lineno"> 228 </span><span class="spaces"> </span><span class="nottickedoff">, palette</span>
<span class="lineno"> 229 </span><span class="spaces"> </span><span class="nottickedoff">, &quot;-i&quot;</span> <span class="lineno"> 229 </span><span class="spaces"> </span><span class="nottickedoff">]</span>
<span class="lineno"> 230 </span><span class="spaces"> </span><span class="nottickedoff">, palette</span> <span class="lineno"> 230 </span><span class="spaces"> </span><span class="nottickedoff">runCmd</span>
<span class="lineno"> 231 </span><span class="spaces"> </span><span class="nottickedoff">, &quot;-progress&quot;</span> <span class="lineno"> 231 </span><span class="spaces"> </span><span class="nottickedoff">ffmpeg</span>
<span class="lineno"> 232 </span><span class="spaces"> </span><span class="nottickedoff">, progress</span> <span class="lineno"> 232 </span><span class="spaces"> </span><span class="nottickedoff">[ &quot;-framerate&quot;</span>
<span class="lineno"> 233 </span><span class="spaces"> </span><span class="nottickedoff">, &quot;-filter_complex&quot;</span> <span class="lineno"> 233 </span><span class="spaces"> </span><span class="nottickedoff">, show fps</span>
<span class="lineno"> 234 </span><span class="spaces"> </span><span class="nottickedoff">, &quot;fps=&quot;</span> <span class="lineno"> 234 </span><span class="spaces"> </span><span class="nottickedoff">, &quot;-i&quot;</span>
<span class="lineno"> 235 </span><span class="spaces"> </span><span class="nottickedoff">++ show fps</span> <span class="lineno"> 235 </span><span class="spaces"> </span><span class="nottickedoff">, template</span>
<span class="lineno"> 236 </span><span class="spaces"> </span><span class="nottickedoff">++ &quot;,scale=&quot;</span> <span class="lineno"> 236 </span><span class="spaces"> </span><span class="nottickedoff">, &quot;-y&quot;</span>
<span class="lineno"> 237 </span><span class="spaces"> </span><span class="nottickedoff">++ show width</span> <span class="lineno"> 237 </span><span class="spaces"> </span><span class="nottickedoff">, &quot;-i&quot;</span>
<span class="lineno"> 238 </span><span class="spaces"> </span><span class="nottickedoff">++ &quot;:&quot;</span> <span class="lineno"> 238 </span><span class="spaces"> </span><span class="nottickedoff">, palette</span>
<span class="lineno"> 239 </span><span class="spaces"> </span><span class="nottickedoff">++ show height</span> <span class="lineno"> 239 </span><span class="spaces"> </span><span class="nottickedoff">, &quot;-progress&quot;</span>
<span class="lineno"> 240 </span><span class="spaces"> </span><span class="nottickedoff">++ &quot;:flags=lanczos[x];[x][1:v]paletteuse&quot;</span> <span class="lineno"> 240 </span><span class="spaces"> </span><span class="nottickedoff">, progress</span>
<span class="lineno"> 241 </span><span class="spaces"> </span><span class="nottickedoff">, &quot;-t&quot;</span> <span class="lineno"> 241 </span><span class="spaces"> </span><span class="nottickedoff">, &quot;-filter_complex&quot;</span>
<span class="lineno"> 242 </span><span class="spaces"> </span><span class="nottickedoff">, showFFloat Nothing (duration ani) &quot;&quot;</span> <span class="lineno"> 242 </span><span class="spaces"> </span><span class="nottickedoff">, &quot;fps=&quot;</span>
<span class="lineno"> 243 </span><span class="spaces"> </span><span class="nottickedoff">, target</span> <span class="lineno"> 243 </span><span class="spaces"> </span><span class="nottickedoff">++ show fps</span>
<span class="lineno"> 244 </span><span class="spaces"> </span><span class="nottickedoff">]</span> <span class="lineno"> 244 </span><span class="spaces"> </span><span class="nottickedoff">++ &quot;,scale=&quot;</span>
<span class="lineno"> 245 </span><span class="spaces"> </span><span class="nottickedoff">RenderWebm -&gt; runCmd</span> <span class="lineno"> 245 </span><span class="spaces"> </span><span class="nottickedoff">++ show width</span>
<span class="lineno"> 246 </span><span class="spaces"> </span><span class="nottickedoff">ffmpeg</span> <span class="lineno"> 246 </span><span class="spaces"> </span><span class="nottickedoff">++ &quot;:&quot;</span>
<span class="lineno"> 247 </span><span class="spaces"> </span><span class="nottickedoff">[ &quot;-r&quot;</span> <span class="lineno"> 247 </span><span class="spaces"> </span><span class="nottickedoff">++ show height</span>
<span class="lineno"> 248 </span><span class="spaces"> </span><span class="nottickedoff">, show fps</span> <span class="lineno"> 248 </span><span class="spaces"> </span><span class="nottickedoff">++ &quot;:flags=lanczos[x];[x][1:v]paletteuse&quot;</span>
<span class="lineno"> 249 </span><span class="spaces"> </span><span class="nottickedoff">, &quot;-i&quot;</span> <span class="lineno"> 249 </span><span class="spaces"> </span><span class="nottickedoff">, &quot;-t&quot;</span>
<span class="lineno"> 250 </span><span class="spaces"> </span><span class="nottickedoff">, template</span> <span class="lineno"> 250 </span><span class="spaces"> </span><span class="nottickedoff">, showFFloat Nothing (duration ani) &quot;&quot;</span>
<span class="lineno"> 251 </span><span class="spaces"> </span><span class="nottickedoff">, &quot;-y&quot;</span> <span class="lineno"> 251 </span><span class="spaces"> </span><span class="nottickedoff">, target</span>
<span class="lineno"> 252 </span><span class="spaces"> </span><span class="nottickedoff">, &quot;-progress&quot;</span> <span class="lineno"> 252 </span><span class="spaces"> </span><span class="nottickedoff">]</span>
<span class="lineno"> 253 </span><span class="spaces"> </span><span class="nottickedoff">, progress</span> <span class="lineno"> 253 </span><span class="spaces"> </span><span class="nottickedoff">RenderWebm -&gt; runCmd</span>
<span class="lineno"> 254 </span><span class="spaces"> </span><span class="nottickedoff">, &quot;-c:v&quot;</span> <span class="lineno"> 254 </span><span class="spaces"> </span><span class="nottickedoff">ffmpeg</span>
<span class="lineno"> 255 </span><span class="spaces"> </span><span class="nottickedoff">, &quot;libvpx-vp9&quot;</span> <span class="lineno"> 255 </span><span class="spaces"> </span><span class="nottickedoff">[ &quot;-r&quot;</span>
<span class="lineno"> 256 </span><span class="spaces"> </span><span class="nottickedoff">, &quot;-vf&quot;</span> <span class="lineno"> 256 </span><span class="spaces"> </span><span class="nottickedoff">, show fps</span>
<span class="lineno"> 257 </span><span class="spaces"> </span><span class="nottickedoff">, &quot;fps=&quot; ++ show fps</span> <span class="lineno"> 257 </span><span class="spaces"> </span><span class="nottickedoff">, &quot;-i&quot;</span>
<span class="lineno"> 258 </span><span class="spaces"> </span><span class="nottickedoff">, target</span> <span class="lineno"> 258 </span><span class="spaces"> </span><span class="nottickedoff">, template</span>
<span class="lineno"> 259 </span><span class="spaces"> </span><span class="nottickedoff">]</span> <span class="lineno"> 259 </span><span class="spaces"> </span><span class="nottickedoff">, &quot;-y&quot;</span>
<span class="lineno"> 260 </span><span class="spaces"> </span><span class="nottickedoff">takeMVar allFinished</span></span> <span class="lineno"> 260 </span><span class="spaces"> </span><span class="nottickedoff">, &quot;-progress&quot;</span>
<span class="lineno"> 261 </span> <span class="lineno"> 261 </span><span class="spaces"> </span><span class="nottickedoff">, progress</span>
<span class="lineno"> 262 </span>--------------------------------------------------------------------------------- <span class="lineno"> 262 </span><span class="spaces"> </span><span class="nottickedoff">, &quot;-c:v&quot;</span>
<span class="lineno"> 263 </span>-- Helpers <span class="lineno"> 263 </span><span class="spaces"> </span><span class="nottickedoff">, &quot;libvpx-vp9&quot;</span>
<span class="lineno"> 264 </span> <span class="lineno"> 264 </span><span class="spaces"> </span><span class="nottickedoff">, &quot;-vf&quot;</span>
<span class="lineno"> 265 </span>progressPrinter :: String -&gt; Int -&gt; (MVar Int -&gt; IO ()) -&gt; IO () <span class="lineno"> 265 </span><span class="spaces"> </span><span class="nottickedoff">, &quot;fps=&quot; ++ show fps</span>
<span class="lineno"> 266 </span><span class="decl"><span class="nottickedoff">progressPrinter typeName maxCount action = do</span> <span class="lineno"> 266 </span><span class="spaces"> </span><span class="nottickedoff">, target</span>
<span class="lineno"> 267 </span><span class="spaces"> </span><span class="nottickedoff">printf &quot;\rFrames %s: 0/%d&quot; typeName maxCount</span> <span class="lineno"> 267 </span><span class="spaces"> </span><span class="nottickedoff">]</span>
<span class="lineno"> 268 </span><span class="spaces"> </span><span class="nottickedoff">putStr $ clearFromCursorToLineEndCode ++ &quot;\r&quot;</span> <span class="lineno"> 268 </span><span class="spaces"> </span><span class="nottickedoff">takeMVar allFinished</span></span>
<span class="lineno"> 269 </span><span class="spaces"> </span><span class="nottickedoff">done &lt;- newMVar (0 :: Int)</span> <span class="lineno"> 269 </span>
<span class="lineno"> 270 </span><span class="spaces"> </span><span class="nottickedoff">start &lt;- getCurrentTime</span> <span class="lineno"> 270 </span>---------------------------------------------------------------------------------
<span class="lineno"> 271 </span><span class="spaces"> </span><span class="nottickedoff">let bgThread = forever $ do</span> <span class="lineno"> 271 </span>-- Helpers
<span class="lineno"> 272 </span><span class="spaces"> </span><span class="nottickedoff">nDone &lt;- readMVar done</span> <span class="lineno"> 272 </span>
<span class="lineno"> 273 </span><span class="spaces"> </span><span class="nottickedoff">now &lt;- getCurrentTime</span> <span class="lineno"> 273 </span>progressPrinter :: String -&gt; Int -&gt; (MVar Int -&gt; IO ()) -&gt; IO ()
<span class="lineno"> 274 </span><span class="spaces"> </span><span class="nottickedoff">let spent = diffUTCTime now start</span> <span class="lineno"> 274 </span><span class="decl"><span class="nottickedoff">progressPrinter typeName maxCount action = do</span>
<span class="lineno"> 275 </span><span class="spaces"> </span><span class="nottickedoff">remaining =</span> <span class="lineno"> 275 </span><span class="spaces"> </span><span class="nottickedoff">printf &quot;\rFrames %s: 0/%d&quot; typeName maxCount</span>
<span class="lineno"> 276 </span><span class="spaces"> </span><span class="nottickedoff">(spent / (fromIntegral nDone / fromIntegral maxCount)) - spent</span> <span class="lineno"> 276 </span><span class="spaces"> </span><span class="nottickedoff">putStr $ clearFromCursorToLineEndCode ++ &quot;\r&quot;</span>
<span class="lineno"> 277 </span><span class="spaces"> </span><span class="nottickedoff">printf &quot;\rFrames %s: %d/%d&quot; typeName nDone maxCount</span> <span class="lineno"> 277 </span><span class="spaces"> </span><span class="nottickedoff">done &lt;- newMVar (0 :: Int)</span>
<span class="lineno"> 278 </span><span class="spaces"> </span><span class="nottickedoff">putStr $ &quot;, time spent: &quot; ++ ppDiff spent</span> <span class="lineno"> 278 </span><span class="spaces"> </span><span class="nottickedoff">start &lt;- getCurrentTime</span>
<span class="lineno"> 279 </span><span class="spaces"> </span><span class="nottickedoff">unless (nDone == 0) $ do</span> <span class="lineno"> 279 </span><span class="spaces"> </span><span class="nottickedoff">let bgThread = forever $ do</span>
<span class="lineno"> 280 </span><span class="spaces"> </span><span class="nottickedoff">putStr $ &quot;, time remaining: &quot; ++ ppDiff remaining</span> <span class="lineno"> 280 </span><span class="spaces"> </span><span class="nottickedoff">nDone &lt;- readMVar done</span>
<span class="lineno"> 281 </span><span class="spaces"> </span><span class="nottickedoff">putStr $ &quot;, total time: &quot; ++ ppDiff (remaining + spent)</span> <span class="lineno"> 281 </span><span class="spaces"> </span><span class="nottickedoff">now &lt;- getCurrentTime</span>
<span class="lineno"> 282 </span><span class="spaces"> </span><span class="nottickedoff">putStr $ clearFromCursorToLineEndCode ++ &quot;\r&quot;</span> <span class="lineno"> 282 </span><span class="spaces"> </span><span class="nottickedoff">let spent = diffUTCTime now start</span>
<span class="lineno"> 283 </span><span class="spaces"> </span><span class="nottickedoff">hFlush stdout</span> <span class="lineno"> 283 </span><span class="spaces"> </span><span class="nottickedoff">remaining =</span>
<span class="lineno"> 284 </span><span class="spaces"> </span><span class="nottickedoff">threadDelay 1000000</span> <span class="lineno"> 284 </span><span class="spaces"> </span><span class="nottickedoff">(spent / (fromIntegral nDone / fromIntegral maxCount)) - spent</span>
<span class="lineno"> 285 </span><span class="spaces"> </span><span class="nottickedoff">withBackgroundThread bgThread $ action done</span> <span class="lineno"> 285 </span><span class="spaces"> </span><span class="nottickedoff">printf &quot;\rFrames %s: %d/%d&quot; typeName nDone maxCount</span>
<span class="lineno"> 286 </span><span class="spaces"> </span><span class="nottickedoff">now &lt;- getCurrentTime</span> <span class="lineno"> 286 </span><span class="spaces"> </span><span class="nottickedoff">putStr $ &quot;, time spent: &quot; ++ ppDiff spent</span>
<span class="lineno"> 287 </span><span class="spaces"> </span><span class="nottickedoff">let spent = diffUTCTime now start</span> <span class="lineno"> 287 </span><span class="spaces"> </span><span class="nottickedoff">unless (nDone == 0) $ do</span>
<span class="lineno"> 288 </span><span class="spaces"> </span><span class="nottickedoff">printf &quot;\rFrames %s: %d/%d&quot; typeName maxCount maxCount</span> <span class="lineno"> 288 </span><span class="spaces"> </span><span class="nottickedoff">putStr $ &quot;, time remaining: &quot; ++ ppDiff remaining</span>
<span class="lineno"> 289 </span><span class="spaces"> </span><span class="nottickedoff">putStr $ &quot;, time spent: &quot; ++ ppDiff spent</span> <span class="lineno"> 289 </span><span class="spaces"> </span><span class="nottickedoff">putStr $ &quot;, total time: &quot; ++ ppDiff (remaining + spent)</span>
<span class="lineno"> 290 </span><span class="spaces"> </span><span class="nottickedoff">putStr $ clearFromCursorToLineEndCode ++ &quot;\n&quot;</span></span> <span class="lineno"> 290 </span><span class="spaces"> </span><span class="nottickedoff">putStr $ clearFromCursorToLineEndCode ++ &quot;\r&quot;</span>
<span class="lineno"> 291 </span> <span class="lineno"> 291 </span><span class="spaces"> </span><span class="nottickedoff">hFlush stdout</span>
<span class="lineno"> 292 </span>animationFrameCount :: Animation -&gt; FPS -&gt; Int <span class="lineno"> 292 </span><span class="spaces"> </span><span class="nottickedoff">threadDelay 1000000</span>
<span class="lineno"> 293 </span><span class="decl"><span class="nottickedoff">animationFrameCount ani rate = round (duration ani * fromIntegral rate) :: Int</span></span> <span class="lineno"> 293 </span><span class="spaces"> </span><span class="nottickedoff">withBackgroundThread bgThread $ action done</span>
<span class="lineno"> 294 </span> <span class="lineno"> 294 </span><span class="spaces"> </span><span class="nottickedoff">now &lt;- getCurrentTime</span>
<span class="lineno"> 295 </span>generateFrames <span class="lineno"> 295 </span><span class="spaces"> </span><span class="nottickedoff">let spent = diffUTCTime now start</span>
<span class="lineno"> 296 </span> :: Raster -&gt; Animation -&gt; Width -&gt; Height -&gt; FPS -&gt; Bool -&gt; (FilePath -&gt; IO a) -&gt; IO a <span class="lineno"> 296 </span><span class="spaces"> </span><span class="nottickedoff">printf &quot;\rFrames %s: %d/%d&quot; typeName maxCount maxCount</span>
<span class="lineno"> 297 </span><span class="decl"><span class="nottickedoff">generateFrames raster ani width_ height_ rate partial action = withTempDir $ \tmp -&gt; do</span> <span class="lineno"> 297 </span><span class="spaces"> </span><span class="nottickedoff">putStr $ &quot;, time spent: &quot; ++ ppDiff spent</span>
<span class="lineno"> 298 </span><span class="spaces"> </span><span class="nottickedoff">let frameName nth = tmp &lt;/&gt; printf nameTemplate nth</span> <span class="lineno"> 298 </span><span class="spaces"> </span><span class="nottickedoff">putStr $ clearFromCursorToLineEndCode ++ &quot;\n&quot;</span></span>
<span class="lineno"> 299 </span><span class="spaces"> </span><span class="nottickedoff">setRootDirectory tmp</span> <span class="lineno"> 299 </span>
<span class="lineno"> 300 </span><span class="spaces"> </span><span class="nottickedoff">progressPrinter &quot;generated&quot; frameCount</span> <span class="lineno"> 300 </span>animationFrameCount :: Animation -&gt; FPS -&gt; Int
<span class="lineno"> 301 </span><span class="spaces"> </span><span class="nottickedoff">$ \done -&gt; handle h $ concurrentForM_ frames $ \n -&gt; do</span> <span class="lineno"> 301 </span><span class="decl"><span class="nottickedoff">animationFrameCount ani rate = round (duration ani * fromIntegral rate) :: Int</span></span>
<span class="lineno"> 302 </span><span class="spaces"> </span><span class="nottickedoff">writeFile (frameName n) $ renderSvg width height $ nthFrame n</span> <span class="lineno"> 302 </span>
<span class="lineno"> 303 </span><span class="spaces"> </span><span class="nottickedoff">modifyMVar_ done $ \nDone -&gt; return (nDone + 1)</span> <span class="lineno"> 303 </span>generateFrames
<span class="lineno"> 304 </span><span class="spaces"></span><span class="nottickedoff"></span> <span class="lineno"> 304 </span> :: Raster -&gt; Animation -&gt; Width -&gt; Height -&gt; FPS -&gt; Bool -&gt; (FilePath -&gt; IO a) -&gt; IO a
<span class="lineno"> 305 </span><span class="spaces"> </span><span class="nottickedoff">when (isValidRaster raster)</span> <span class="lineno"> 305 </span><span class="decl"><span class="nottickedoff">generateFrames raster ani width_ height_ rate partial action = withTempDir $ \tmp -&gt; do</span>
<span class="lineno"> 306 </span><span class="spaces"> </span><span class="nottickedoff">$ progressPrinter &quot;rastered&quot; frameCount</span> <span class="lineno"> 306 </span><span class="spaces"> </span><span class="nottickedoff">let frameName nth = tmp &lt;/&gt; printf nameTemplate nth</span>
<span class="lineno"> 307 </span><span class="spaces"> </span><span class="nottickedoff">$ \done -&gt; handle h $ concurrentForM_ frames $ \n -&gt; do</span> <span class="lineno"> 307 </span><span class="spaces"> </span><span class="nottickedoff">setRootDirectory tmp</span>
<span class="lineno"> 308 </span><span class="spaces"> </span><span class="nottickedoff">applyRaster raster (frameName n)</span> <span class="lineno"> 308 </span><span class="spaces"> </span><span class="nottickedoff">progressPrinter &quot;generated&quot; frameCount</span>
<span class="lineno"> 309 </span><span class="spaces"> </span><span class="nottickedoff">modifyMVar_ done $ \nDone -&gt; return (nDone + 1)</span> <span class="lineno"> 309 </span><span class="spaces"> </span><span class="nottickedoff">$ \done -&gt; handle h $ concurrentForM_ frames $ \n -&gt; do</span>
<span class="lineno"> 310 </span><span class="spaces"></span><span class="nottickedoff"></span> <span class="lineno"> 310 </span><span class="spaces"> </span><span class="nottickedoff">writeFile (frameName n) $ renderSvg width height $ nthFrame n</span>
<span class="lineno"> 311 </span><span class="spaces"> </span><span class="nottickedoff">action (tmp &lt;/&gt; rasterTemplate raster)</span> <span class="lineno"> 311 </span><span class="spaces"> </span><span class="nottickedoff">modifyMVar_ done $ \nDone -&gt; return (nDone + 1)</span>
<span class="lineno"> 312 </span><span class="spaces"> </span><span class="nottickedoff">where</span> <span class="lineno"> 312 </span><span class="spaces"></span><span class="nottickedoff"></span>
<span class="lineno"> 313 </span><span class="spaces"> </span><span class="nottickedoff">isValidRaster RasterNone = False</span> <span class="lineno"> 313 </span><span class="spaces"> </span><span class="nottickedoff">when (isValidRaster raster)</span>
<span class="lineno"> 314 </span><span class="spaces"> </span><span class="nottickedoff">isValidRaster RasterAuto = False</span> <span class="lineno"> 314 </span><span class="spaces"> </span><span class="nottickedoff">$ progressPrinter &quot;rastered&quot; frameCount</span>
<span class="lineno"> 315 </span><span class="spaces"> </span><span class="nottickedoff">isValidRaster _ = True</span> <span class="lineno"> 315 </span><span class="spaces"> </span><span class="nottickedoff">$ \done -&gt; handle h $ concurrentForM_ frames $ \n -&gt; do</span>
<span class="lineno"> 316 </span><span class="spaces"></span><span class="nottickedoff"></span> <span class="lineno"> 316 </span><span class="spaces"> </span><span class="nottickedoff">applyRaster raster (frameName n)</span>
<span class="lineno"> 317 </span><span class="spaces"> </span><span class="nottickedoff">width = Just $ Px $ fromIntegral width_</span> <span class="lineno"> 317 </span><span class="spaces"> </span><span class="nottickedoff">modifyMVar_ done $ \nDone -&gt; return (nDone + 1)</span>
<span class="lineno"> 318 </span><span class="spaces"> </span><span class="nottickedoff">height = Just $ Px $ fromIntegral height_</span> <span class="lineno"> 318 </span><span class="spaces"></span><span class="nottickedoff"></span>
<span class="lineno"> 319 </span><span class="spaces"> </span><span class="nottickedoff">h UserInterrupt | partial = do</span> <span class="lineno"> 319 </span><span class="spaces"> </span><span class="nottickedoff">action (tmp &lt;/&gt; rasterTemplate raster)</span>
<span class="lineno"> 320 </span><span class="spaces"> </span><span class="nottickedoff">hPutStrLn</span> <span class="lineno"> 320 </span><span class="spaces"> </span><span class="nottickedoff">where</span>
<span class="lineno"> 321 </span><span class="spaces"> </span><span class="nottickedoff">stderr</span> <span class="lineno"> 321 </span><span class="spaces"> </span><span class="nottickedoff">isValidRaster RasterNone = False</span>
<span class="lineno"> 322 </span><span class="spaces"> </span><span class="nottickedoff">&quot;\nCtrl-C detected. Trying to generate video with available frames. \</span> <span class="lineno"> 322 </span><span class="spaces"> </span><span class="nottickedoff">isValidRaster RasterAuto = False</span>
<span class="lineno"> 323 </span><span class="spaces"> </span><span class="nottickedoff">\Hit ctrl-c again to abort.&quot;</span> <span class="lineno"> 323 </span><span class="spaces"> </span><span class="nottickedoff">isValidRaster _ = True</span>
<span class="lineno"> 324 </span><span class="spaces"> </span><span class="nottickedoff">return ()</span> <span class="lineno"> 324 </span><span class="spaces"></span><span class="nottickedoff"></span>
<span class="lineno"> 325 </span><span class="spaces"> </span><span class="nottickedoff">h other = throwIO other</span> <span class="lineno"> 325 </span><span class="spaces"> </span><span class="nottickedoff">width = Just $ Px $ fromIntegral width_</span>
<span class="lineno"> 326 </span><span class="spaces"> </span><span class="nottickedoff">-- frames = [0..frameCount-1]</span> <span class="lineno"> 326 </span><span class="spaces"> </span><span class="nottickedoff">height = Just $ Px $ fromIntegral height_</span>
<span class="lineno"> 327 </span><span class="spaces"> </span><span class="nottickedoff">frames = frameOrder rate frameCount</span> <span class="lineno"> 327 </span><span class="spaces"> </span><span class="nottickedoff">h UserInterrupt | partial = do</span>
<span class="lineno"> 328 </span><span class="spaces"> </span><span class="nottickedoff">nthFrame nth = frameAt (recip (fromIntegral rate) * fromIntegral nth) ani</span> <span class="lineno"> 328 </span><span class="spaces"> </span><span class="nottickedoff">hPutStrLn</span>
<span class="lineno"> 329 </span><span class="spaces"> </span><span class="nottickedoff">frameCount = animationFrameCount ani rate</span> <span class="lineno"> 329 </span><span class="spaces"> </span><span class="nottickedoff">stderr</span>
<span class="lineno"> 330 </span><span class="spaces"> </span><span class="nottickedoff">nameTemplate :: String</span> <span class="lineno"> 330 </span><span class="spaces"> </span><span class="nottickedoff">&quot;\nCtrl-C detected. Trying to generate video with available frames. \</span>
<span class="lineno"> 331 </span><span class="spaces"> </span><span class="nottickedoff">nameTemplate = &quot;render-%05d.svg&quot;</span></span> <span class="lineno"> 331 </span><span class="spaces"> </span><span class="nottickedoff">\Hit ctrl-c again to abort.&quot;</span>
<span class="lineno"> 332 </span> <span class="lineno"> 332 </span><span class="spaces"> </span><span class="nottickedoff">return ()</span>
<span class="lineno"> 333 </span>withBackgroundThread :: IO () -&gt; IO a -&gt; IO a <span class="lineno"> 333 </span><span class="spaces"> </span><span class="nottickedoff">h other = throwIO other</span>
<span class="lineno"> 334 </span><span class="decl"><span class="nottickedoff">withBackgroundThread t = bracket (forkIO t) killThread . const</span></span> <span class="lineno"> 334 </span><span class="spaces"> </span><span class="nottickedoff">-- frames = [0..frameCount-1]</span>
<span class="lineno"> 335 </span> <span class="lineno"> 335 </span><span class="spaces"> </span><span class="nottickedoff">frames = frameOrder rate frameCount</span>
<span class="lineno"> 336 </span>ppDiff :: NominalDiffTime -&gt; String <span class="lineno"> 336 </span><span class="spaces"> </span><span class="nottickedoff">nthFrame nth = frameAt (recip (fromIntegral rate) * fromIntegral nth) ani</span>
<span class="lineno"> 337 </span><span class="decl"><span class="nottickedoff">ppDiff diff | hours == 0 &amp;&amp; mins == 0 = show secs ++ &quot;s&quot;</span> <span class="lineno"> 337 </span><span class="spaces"> </span><span class="nottickedoff">frameCount = animationFrameCount ani rate</span>
<span class="lineno"> 338 </span><span class="spaces"> </span><span class="nottickedoff">| hours == 0 = printf &quot;%.2d:%.2d&quot; mins secs</span> <span class="lineno"> 338 </span><span class="spaces"> </span><span class="nottickedoff">nameTemplate :: String</span>
<span class="lineno"> 339 </span><span class="spaces"> </span><span class="nottickedoff">| otherwise = printf &quot;%.2d:%.2d:%.2d&quot; hours mins secs</span> <span class="lineno"> 339 </span><span class="spaces"> </span><span class="nottickedoff">nameTemplate = &quot;render-%05d.svg&quot;</span></span>
<span class="lineno"> 340 </span><span class="spaces"> </span><span class="nottickedoff">where</span> <span class="lineno"> 340 </span>
<span class="lineno"> 341 </span><span class="spaces"> </span><span class="nottickedoff">(osecs, secs) = round diff `divMod` (60 :: Int)</span> <span class="lineno"> 341 </span>withBackgroundThread :: IO () -&gt; IO a -&gt; IO a
<span class="lineno"> 342 </span><span class="spaces"> </span><span class="nottickedoff">(hours, mins) = osecs `divMod` 60</span></span> <span class="lineno"> 342 </span><span class="decl"><span class="nottickedoff">withBackgroundThread t = bracket (forkIO t) killThread . const</span></span>
<span class="lineno"> 343 </span> <span class="lineno"> 343 </span>
<span class="lineno"> 344 </span>rasterTemplate :: Raster -&gt; String <span class="lineno"> 344 </span>ppDiff :: NominalDiffTime -&gt; String
<span class="lineno"> 345 </span><span class="decl"><span class="nottickedoff">rasterTemplate RasterNone = &quot;render-%05d.svg&quot;</span> <span class="lineno"> 345 </span><span class="decl"><span class="nottickedoff">ppDiff diff | hours == 0 &amp;&amp; mins == 0 = show secs ++ &quot;s&quot;</span>
<span class="lineno"> 346 </span><span class="spaces"></span><span class="nottickedoff">rasterTemplate RasterAuto = &quot;render-%05d.svg&quot;</span> <span class="lineno"> 346 </span><span class="spaces"> </span><span class="nottickedoff">| hours == 0 = printf &quot;%.2d:%.2d&quot; mins secs</span>
<span class="lineno"> 347 </span><span class="spaces"></span><span class="nottickedoff">rasterTemplate _ = &quot;render-%05d.png&quot;</span></span> <span class="lineno"> 347 </span><span class="spaces"> </span><span class="nottickedoff">| otherwise = printf &quot;%.2d:%.2d:%.2d&quot; hours mins secs</span>
<span class="lineno"> 348 </span> <span class="lineno"> 348 </span><span class="spaces"> </span><span class="nottickedoff">where</span>
<span class="lineno"> 349 </span>-- | Resolve RasterNone and RasterAuto. If no valid raster can <span class="lineno"> 349 </span><span class="spaces"> </span><span class="nottickedoff">(osecs, secs) = round diff `divMod` (60 :: Int)</span>
<span class="lineno"> 350 </span>-- be found, exit with an error message. <span class="lineno"> 350 </span><span class="spaces"> </span><span class="nottickedoff">(hours, mins) = osecs `divMod` 60</span></span>
<span class="lineno"> 351 </span>requireRaster :: Raster -&gt; IO Raster <span class="lineno"> 351 </span>
<span class="lineno"> 352 </span><span class="decl"><span class="nottickedoff">requireRaster raster = do</span> <span class="lineno"> 352 </span>rasterTemplate :: Raster -&gt; String
<span class="lineno"> 353 </span><span class="spaces"> </span><span class="nottickedoff">raster' &lt;- selectRaster (if raster == RasterNone then RasterAuto else raster)</span> <span class="lineno"> 353 </span><span class="decl"><span class="nottickedoff">rasterTemplate RasterNone = &quot;render-%05d.svg&quot;</span>
<span class="lineno"> 354 </span><span class="spaces"> </span><span class="nottickedoff">case raster' of</span> <span class="lineno"> 354 </span><span class="spaces"></span><span class="nottickedoff">rasterTemplate RasterAuto = &quot;render-%05d.svg&quot;</span>
<span class="lineno"> 355 </span><span class="spaces"> </span><span class="nottickedoff">RasterNone -&gt; do</span> <span class="lineno"> 355 </span><span class="spaces"></span><span class="nottickedoff">rasterTemplate _ = &quot;render-%05d.png&quot;</span></span>
<span class="lineno"> 356 </span><span class="spaces"> </span><span class="nottickedoff">hPutStrLn</span> <span class="lineno"> 356 </span>
<span class="lineno"> 357 </span><span class="spaces"> </span><span class="nottickedoff">stderr</span> <span class="lineno"> 357 </span>-- | Resolve RasterNone and RasterAuto. If no valid raster can
<span class="lineno"> 358 </span><span class="spaces"> </span><span class="nottickedoff">&quot;Raster required but none could be found. \</span> <span class="lineno"> 358 </span>-- be found, exit with an error message.
<span class="lineno"> 359 </span><span class="spaces"> </span><span class="nottickedoff">\Please install either inkscape, imagemagick, or rsvg-convert.&quot;</span> <span class="lineno"> 359 </span>requireRaster :: Raster -&gt; IO Raster
<span class="lineno"> 360 </span><span class="spaces"> </span><span class="nottickedoff">exitWith (ExitFailure 1)</span> <span class="lineno"> 360 </span><span class="decl"><span class="nottickedoff">requireRaster raster = do</span>
<span class="lineno"> 361 </span><span class="spaces"> </span><span class="nottickedoff">_ -&gt; pure raster'</span></span> <span class="lineno"> 361 </span><span class="spaces"> </span><span class="nottickedoff">raster' &lt;- selectRaster (if raster == RasterNone then RasterAuto else raster)</span>
<span class="lineno"> 362 </span> <span class="lineno"> 362 </span><span class="spaces"> </span><span class="nottickedoff">case raster' of</span>
<span class="lineno"> 363 </span>-- | Resolve RasterNone and RasterAuto. If no valid raster can <span class="lineno"> 363 </span><span class="spaces"> </span><span class="nottickedoff">RasterNone -&gt; do</span>
<span class="lineno"> 364 </span>-- be found, return RasterNone. <span class="lineno"> 364 </span><span class="spaces"> </span><span class="nottickedoff">hPutStrLn</span>
<span class="lineno"> 365 </span>selectRaster :: Raster -&gt; IO Raster <span class="lineno"> 365 </span><span class="spaces"> </span><span class="nottickedoff">stderr</span>
<span class="lineno"> 366 </span><span class="decl"><span class="nottickedoff">selectRaster RasterAuto = do</span> <span class="lineno"> 366 </span><span class="spaces"> </span><span class="nottickedoff">&quot;Raster required but none could be found. \</span>
<span class="lineno"> 367 </span><span class="spaces"> </span><span class="nottickedoff">rsvg &lt;- hasRSvg</span> <span class="lineno"> 367 </span><span class="spaces"> </span><span class="nottickedoff">\Please install either inkscape, imagemagick, or rsvg-convert.&quot;</span>
<span class="lineno"> 368 </span><span class="spaces"> </span><span class="nottickedoff">ink &lt;- hasInkscape</span> <span class="lineno"> 368 </span><span class="spaces"> </span><span class="nottickedoff">exitWith (ExitFailure 1)</span>
<span class="lineno"> 369 </span><span class="spaces"> </span><span class="nottickedoff">magick &lt;- hasMagick</span> <span class="lineno"> 369 </span><span class="spaces"> </span><span class="nottickedoff">_ -&gt; pure raster'</span></span>
<span class="lineno"> 370 </span><span class="spaces"> </span><span class="nottickedoff">if</span> <span class="lineno"> 370 </span>
<span class="lineno"> 371 </span><span class="spaces"> </span><span class="nottickedoff">| isRight rsvg -&gt; pure RasterRSvg</span> <span class="lineno"> 371 </span>-- | Resolve RasterNone and RasterAuto. If no valid raster can
<span class="lineno"> 372 </span><span class="spaces"> </span><span class="nottickedoff">| isRight ink -&gt; pure RasterInkscape</span> <span class="lineno"> 372 </span>-- be found, return RasterNone.
<span class="lineno"> 373 </span><span class="spaces"> </span><span class="nottickedoff">| isRight magick -&gt; pure RasterMagick</span> <span class="lineno"> 373 </span>selectRaster :: Raster -&gt; IO Raster
<span class="lineno"> 374 </span><span class="spaces"> </span><span class="nottickedoff">| otherwise -&gt; pure RasterNone</span> <span class="lineno"> 374 </span><span class="decl"><span class="nottickedoff">selectRaster RasterAuto = do</span>
<span class="lineno"> 375 </span><span class="spaces"></span><span class="nottickedoff">selectRaster r = pure r</span></span> <span class="lineno"> 375 </span><span class="spaces"> </span><span class="nottickedoff">rsvg &lt;- hasRSvg</span>
<span class="lineno"> 376 </span> <span class="lineno"> 376 </span><span class="spaces"> </span><span class="nottickedoff">ink &lt;- hasInkscape</span>
<span class="lineno"> 377 </span>-- | Convert SVG file to a PNG file with selected raster engine. If <span class="lineno"> 377 </span><span class="spaces"> </span><span class="nottickedoff">magick &lt;- hasMagick</span>
<span class="lineno"> 378 </span>-- raster engine is RasterAuto or RasterNone, do nothing. <span class="lineno"> 378 </span><span class="spaces"> </span><span class="nottickedoff">if</span>
<span class="lineno"> 379 </span>applyRaster :: Raster -&gt; FilePath -&gt; IO () <span class="lineno"> 379 </span><span class="spaces"> </span><span class="nottickedoff">| isRight rsvg -&gt; pure RasterRSvg</span>
<span class="lineno"> 380 </span><span class="decl"><span class="nottickedoff">applyRaster RasterNone _ = return ()</span> <span class="lineno"> 380 </span><span class="spaces"> </span><span class="nottickedoff">| isRight ink -&gt; pure RasterInkscape</span>
<span class="lineno"> 381 </span><span class="spaces"></span><span class="nottickedoff">applyRaster RasterAuto _ = return ()</span> <span class="lineno"> 381 </span><span class="spaces"> </span><span class="nottickedoff">| isRight magick -&gt; pure RasterMagick</span>
<span class="lineno"> 382 </span><span class="spaces"></span><span class="nottickedoff">applyRaster RasterInkscape path = runCmd</span> <span class="lineno"> 382 </span><span class="spaces"> </span><span class="nottickedoff">| otherwise -&gt; pure RasterNone</span>
<span class="lineno"> 383 </span><span class="spaces"> </span><span class="nottickedoff">&quot;inkscape&quot;</span> <span class="lineno"> 383 </span><span class="spaces"></span><span class="nottickedoff">selectRaster r = pure r</span></span>
<span class="lineno"> 384 </span><span class="spaces"> </span><span class="nottickedoff">[ &quot;--without-gui&quot;</span> <span class="lineno"> 384 </span>
<span class="lineno"> 385 </span><span class="spaces"> </span><span class="nottickedoff">, &quot;--file=&quot; ++ path</span> <span class="lineno"> 385 </span>-- | Convert SVG file to a PNG file with selected raster engine. If
<span class="lineno"> 386 </span><span class="spaces"> </span><span class="nottickedoff">, &quot;--export-png=&quot; ++ replaceExtension path &quot;png&quot;</span> <span class="lineno"> 386 </span>-- raster engine is RasterAuto or RasterNone, do nothing.
<span class="lineno"> 387 </span><span class="spaces"> </span><span class="nottickedoff">]</span> <span class="lineno"> 387 </span>applyRaster :: Raster -&gt; FilePath -&gt; IO ()
<span class="lineno"> 388 </span><span class="spaces"></span><span class="nottickedoff">applyRaster RasterRSvg path = runCmd</span> <span class="lineno"> 388 </span><span class="decl"><span class="nottickedoff">applyRaster RasterNone _ = return ()</span>
<span class="lineno"> 389 </span><span class="spaces"> </span><span class="nottickedoff">&quot;rsvg-convert&quot;</span> <span class="lineno"> 389 </span><span class="spaces"></span><span class="nottickedoff">applyRaster RasterAuto _ = return ()</span>
<span class="lineno"> 390 </span><span class="spaces"> </span><span class="nottickedoff">[path, &quot;--unlimited&quot;, &quot;--output&quot;, replaceExtension path &quot;png&quot;]</span> <span class="lineno"> 390 </span><span class="spaces"></span><span class="nottickedoff">applyRaster RasterInkscape path = runCmd</span>
<span class="lineno"> 391 </span><span class="spaces"></span><span class="nottickedoff">applyRaster RasterMagick path =</span> <span class="lineno"> 391 </span><span class="spaces"> </span><span class="nottickedoff">&quot;inkscape&quot;</span>
<span class="lineno"> 392 </span><span class="spaces"> </span><span class="nottickedoff">runCmd magickCmd [path, replaceExtension path &quot;png&quot;]</span></span> <span class="lineno"> 392 </span><span class="spaces"> </span><span class="nottickedoff">[ &quot;--without-gui&quot;</span>
<span class="lineno"> 393 </span> <span class="lineno"> 393 </span><span class="spaces"> </span><span class="nottickedoff">, &quot;--file=&quot; ++ path</span>
<span class="lineno"> 394 </span>concurrentForM_ :: [a] -&gt; (a -&gt; IO ()) -&gt; IO () <span class="lineno"> 394 </span><span class="spaces"> </span><span class="nottickedoff">, &quot;--export-png=&quot; ++ replaceExtension path &quot;png&quot;</span>
<span class="lineno"> 395 </span><span class="decl"><span class="nottickedoff">concurrentForM_ lst action = do</span> <span class="lineno"> 395 </span><span class="spaces"> </span><span class="nottickedoff">]</span>
<span class="lineno"> 396 </span><span class="spaces"> </span><span class="nottickedoff">n &lt;- getNumCapabilities</span> <span class="lineno"> 396 </span><span class="spaces"></span><span class="nottickedoff">applyRaster RasterRSvg path = runCmd</span>
<span class="lineno"> 397 </span><span class="spaces"> </span><span class="nottickedoff">sem &lt;- newQSemN n</span> <span class="lineno"> 397 </span><span class="spaces"> </span><span class="nottickedoff">&quot;rsvg-convert&quot;</span>
<span class="lineno"> 398 </span><span class="spaces"> </span><span class="nottickedoff">eVar &lt;- newEmptyMVar</span> <span class="lineno"> 398 </span><span class="spaces"> </span><span class="nottickedoff">[path, &quot;--unlimited&quot;, &quot;--output&quot;, replaceExtension path &quot;png&quot;]</span>
<span class="lineno"> 399 </span><span class="spaces"> </span><span class="nottickedoff">forM_ lst $ \elt -&gt; do</span> <span class="lineno"> 399 </span><span class="spaces"></span><span class="nottickedoff">applyRaster RasterMagick path =</span>
<span class="lineno"> 400 </span><span class="spaces"> </span><span class="nottickedoff">waitQSemN sem 1</span> <span class="lineno"> 400 </span><span class="spaces"> </span><span class="nottickedoff">runCmd magickCmd [path, replaceExtension path &quot;png&quot;]</span></span>
<span class="lineno"> 401 </span><span class="spaces"> </span><span class="nottickedoff">emp &lt;- isEmptyMVar eVar</span> <span class="lineno"> 401 </span>
<span class="lineno"> 402 </span><span class="spaces"> </span><span class="nottickedoff">if emp</span> <span class="lineno"> 402 </span>concurrentForM_ :: [a] -&gt; (a -&gt; IO ()) -&gt; IO ()
<span class="lineno"> 403 </span><span class="spaces"> </span><span class="nottickedoff">then</span> <span class="lineno"> 403 </span><span class="decl"><span class="nottickedoff">concurrentForM_ lst action = do</span>
<span class="lineno"> 404 </span><span class="spaces"> </span><span class="nottickedoff">void</span> <span class="lineno"> 404 </span><span class="spaces"> </span><span class="nottickedoff">n &lt;- getNumCapabilities</span>
<span class="lineno"> 405 </span><span class="spaces"> </span><span class="nottickedoff">$ forkIO</span> <span class="lineno"> 405 </span><span class="spaces"> </span><span class="nottickedoff">sem &lt;- newQSemN n</span>
<span class="lineno"> 406 </span><span class="spaces"> </span><span class="nottickedoff">( catch (action elt) (void . tryPutMVar eVar)</span> <span class="lineno"> 406 </span><span class="spaces"> </span><span class="nottickedoff">eVar &lt;- newEmptyMVar</span>
<span class="lineno"> 407 </span><span class="spaces"> </span><span class="nottickedoff">`finally` signalQSemN sem 1</span> <span class="lineno"> 407 </span><span class="spaces"> </span><span class="nottickedoff">forM_ lst $ \elt -&gt; do</span>
<span class="lineno"> 408 </span><span class="spaces"> </span><span class="nottickedoff">)</span> <span class="lineno"> 408 </span><span class="spaces"> </span><span class="nottickedoff">waitQSemN sem 1</span>
<span class="lineno"> 409 </span><span class="spaces"> </span><span class="nottickedoff">else signalQSemN sem 1</span> <span class="lineno"> 409 </span><span class="spaces"> </span><span class="nottickedoff">emp &lt;- isEmptyMVar eVar</span>
<span class="lineno"> 410 </span><span class="spaces"> </span><span class="nottickedoff">waitQSemN sem n</span> <span class="lineno"> 410 </span><span class="spaces"> </span><span class="nottickedoff">if emp</span>
<span class="lineno"> 411 </span><span class="spaces"> </span><span class="nottickedoff">mbE &lt;- tryTakeMVar eVar</span> <span class="lineno"> 411 </span><span class="spaces"> </span><span class="nottickedoff">then</span>
<span class="lineno"> 412 </span><span class="spaces"> </span><span class="nottickedoff">case mbE of</span> <span class="lineno"> 412 </span><span class="spaces"> </span><span class="nottickedoff">void</span>
<span class="lineno"> 413 </span><span class="spaces"> </span><span class="nottickedoff">Nothing -&gt; return ()</span> <span class="lineno"> 413 </span><span class="spaces"> </span><span class="nottickedoff">$ forkIO</span>
<span class="lineno"> 414 </span><span class="spaces"> </span><span class="nottickedoff">Just e -&gt; throwIO (e :: SomeException)</span></span> <span class="lineno"> 414 </span><span class="spaces"> </span><span class="nottickedoff">( catch (action elt) (void . tryPutMVar eVar)</span>
<span class="lineno"> 415 </span><span class="spaces"> </span><span class="nottickedoff">`finally` signalQSemN sem 1</span>
<span class="lineno"> 416 </span><span class="spaces"> </span><span class="nottickedoff">)</span>
<span class="lineno"> 417 </span><span class="spaces"> </span><span class="nottickedoff">else signalQSemN sem 1</span>
<span class="lineno"> 418 </span><span class="spaces"> </span><span class="nottickedoff">waitQSemN sem n</span>
<span class="lineno"> 419 </span><span class="spaces"> </span><span class="nottickedoff">mbE &lt;- tryTakeMVar eVar</span>
<span class="lineno"> 420 </span><span class="spaces"> </span><span class="nottickedoff">case mbE of</span>
<span class="lineno"> 421 </span><span class="spaces"> </span><span class="nottickedoff">Nothing -&gt; return ()</span>
<span class="lineno"> 422 </span><span class="spaces"> </span><span class="nottickedoff">Just e -&gt; throwIO (e :: SomeException)</span></span>
</pre> </pre>
</body> </body>