Deploying to gh-pages from @ 1c7fa10f86 🚀

This commit is contained in:
Lemmih 2020-09-08 10:29:05 +00:00
commit 6e2d779766
10 changed files with 860 additions and 18 deletions

View file

@ -1,4 +1,4 @@
100% (155 /155) in 'Reanimate'
100% (154 /154) in 'Reanimate'
100% ( 55 / 55) in 'Reanimate.Svg.Constructors'
100% ( 41 / 41) in 'Reanimate.Animation'
100% ( 40 / 40) in 'Reanimate.GeoProjection'
@ -36,4 +36,4 @@
100% ( 3 / 3) in 'Reanimate.Math.Balloon'
100% ( 3 / 3) in 'Reanimate.Blender'
100% ( 2 / 2) in 'Reanimate.Builtin.CirclePlot'
90% (113 /126) in 'Reanimate.Scene'
89% (111 /125) in 'Reanimate.Scene'

View file

@ -1 +1 @@
{ "schemaVersion": 1, "label": "api tests", "message": "30%", "color": "success" }
{ "schemaVersion": 1, "label": "api tests", "message": "35%", "color": "success" }

View file

@ -100,8 +100,14 @@ table.dashboard { border-collapse: collapse ; border: solid 1px black }
<td>&nbsp;&nbsp;<tt>module <a href="reanimate-0.4.3.0-inplace/Reanimate.Render.hs.html">reanimate-0.4.3.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/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>
<td>&nbsp;&nbsp;<tt>module <a href="reanimate-0.4.3.0-inplace/Reanimate.Scene.hs.html">reanimate-0.4.3.0-inplace/Reanimate.Scene</a></tt></td>
<td align="right">27%</td><td>40/146</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="27%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">55%</td><td>15/27</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="55%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">31%</td><td>543/1700</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></tr>
<td>&nbsp;&nbsp;<tt>module <a href="reanimate-0.4.3.0-inplace/Reanimate.Scene.Core.hs.html">reanimate-0.4.3.0-inplace/Reanimate.Scene.Core</a></tt></td>
<td align="right">63%</td><td>12/19</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="63%"><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">72%</td><td>172/237</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="72%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
<tr>
<td>&nbsp;&nbsp;<tt>module <a href="reanimate-0.4.3.0-inplace/Reanimate.Scene.Sprite.hs.html">reanimate-0.4.3.0-inplace/Reanimate.Scene.Sprite</a></tt></td>
<td align="right">85%</td><td>23/27</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="85%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">57%</td><td>11/19</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="57%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">78%</td><td>314/400</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="78%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
<tr>
<td>&nbsp;&nbsp;<tt>module <a href="reanimate-0.4.3.0-inplace/Reanimate.Scene.Var.hs.html">reanimate-0.4.3.0-inplace/Reanimate.Scene.Var</a></tt></td>
<td align="right">89%</td><td>17/19</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="89%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">60%</td><td>14/23</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">68%</td><td>220/319</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="68%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
<tr>
<td>&nbsp;&nbsp;<tt>module <a href="reanimate-0.4.3.0-inplace/Reanimate.Svg.hs.html">reanimate-0.4.3.0-inplace/Reanimate.Svg</a></tt></td>
<td align="right">38%</td><td>5/13</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="38%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">18%</td><td>15/80</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="18%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">41%</td><td>323/777</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="41%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
@ -125,5 +131,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>
<tr></tr><tr style="background: #e0e0e0">
<th align=left>&nbsp;&nbsp;Program Coverage Total</tt></th>
<td align="right">30%</td><td>249/820</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">16%</td><td>134/829</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">29%</td><td>4680/15725</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="29%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
<td align="right">35%</td><td>261/739</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="35%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">17%</td><td>144/844</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="17%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">32%</td><td>4843/14981</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="32%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
</table></body></html>

View file

@ -16,14 +16,17 @@ table.dashboard { border-collapse: collapse ; border: solid 1px black }
<td>&nbsp;&nbsp;<tt>module <a href="reanimate-0.4.3.0-inplace/Reanimate.ColorMap.hs.html">reanimate-0.4.3.0-inplace/Reanimate.ColorMap</a></tt></td>
<td align="right">100%</td><td>14/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="bar"></td></tr></table></td></tr></table></td><td align="right">60%</td><td>3/5</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">99%</td><td>1176/1180</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="99%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
<tr>
<td>&nbsp;&nbsp;<tt>module <a href="reanimate-0.4.3.0-inplace/Reanimate.Scene.Var.hs.html">reanimate-0.4.3.0-inplace/Reanimate.Scene.Var</a></tt></td>
<td align="right">89%</td><td>17/19</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="89%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">60%</td><td>14/23</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">68%</td><td>220/319</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="68%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
<tr>
<td>&nbsp;&nbsp;<tt>module <a href="reanimate-0.4.3.0-inplace/Reanimate.Svg.LineCommand.hs.html">reanimate-0.4.3.0-inplace/Reanimate.Svg.LineCommand</a></tt></td>
<td align="right">80%</td><td>12/15</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="80%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">58%</td><td>43/74</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="58%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">70%</td><td>659/937</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="70%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
<tr>
<td>&nbsp;&nbsp;<tt>module <a href="reanimate-0.4.3.0-inplace/Reanimate.Animation.hs.html">reanimate-0.4.3.0-inplace/Reanimate.Animation</a></tt></td>
<td align="right">90%</td><td>28/31</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="90%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">57%</td><td>8/14</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="57%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">87%</td><td>298/341</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="87%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
<tr>
<td>&nbsp;&nbsp;<tt>module <a href="reanimate-0.4.3.0-inplace/Reanimate.Scene.hs.html">reanimate-0.4.3.0-inplace/Reanimate.Scene</a></tt></td>
<td align="right">27%</td><td>40/146</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="27%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">55%</td><td>15/27</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="55%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">31%</td><td>543/1700</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></tr>
<td>&nbsp;&nbsp;<tt>module <a href="reanimate-0.4.3.0-inplace/Reanimate.Scene.Sprite.hs.html">reanimate-0.4.3.0-inplace/Reanimate.Scene.Sprite</a></tt></td>
<td align="right">85%</td><td>23/27</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="85%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">57%</td><td>11/19</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="57%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">78%</td><td>314/400</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="78%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
<tr>
<td>&nbsp;&nbsp;<tt>module <a href="reanimate-0.4.3.0-inplace/Reanimate.ColorComponents.hs.html">reanimate-0.4.3.0-inplace/Reanimate.ColorComponents</a></tt></td>
<td align="right">75%</td><td>9/12</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="75%"><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">81%</td><td>135/166</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="81%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
@ -123,7 +126,10 @@ table.dashboard { border-collapse: collapse ; border: solid 1px black }
<tr>
<td>&nbsp;&nbsp;<tt>module <a href="reanimate-0.4.3.0-inplace/Reanimate.Parameters.hs.html">reanimate-0.4.3.0-inplace/Reanimate.Parameters</a></tt></td>
<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>
<td>&nbsp;&nbsp;<tt>module <a href="reanimate-0.4.3.0-inplace/Reanimate.Scene.Core.hs.html">reanimate-0.4.3.0-inplace/Reanimate.Scene.Core</a></tt></td>
<td align="right">63%</td><td>12/19</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="63%"><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">72%</td><td>172/237</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="72%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
<tr></tr><tr style="background: #e0e0e0">
<th align=left>&nbsp;&nbsp;Program Coverage Total</tt></th>
<td align="right">30%</td><td>249/820</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">16%</td><td>134/829</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">29%</td><td>4680/15725</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="29%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
<td align="right">35%</td><td>261/739</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="35%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">17%</td><td>144/844</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="17%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">32%</td><td>4843/14981</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="32%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
</table></body></html>

View file

@ -28,9 +28,18 @@ table.dashboard { border-collapse: collapse ; border: solid 1px black }
<td>&nbsp;&nbsp;<tt>module <a href="reanimate-0.4.3.0-inplace/Reanimate.ColorComponents.hs.html">reanimate-0.4.3.0-inplace/Reanimate.ColorComponents</a></tt></td>
<td align="right">75%</td><td>9/12</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="75%"><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">81%</td><td>135/166</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="81%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
<tr>
<td>&nbsp;&nbsp;<tt>module <a href="reanimate-0.4.3.0-inplace/Reanimate.Scene.Sprite.hs.html">reanimate-0.4.3.0-inplace/Reanimate.Scene.Sprite</a></tt></td>
<td align="right">85%</td><td>23/27</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="85%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">57%</td><td>11/19</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="57%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">78%</td><td>314/400</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="78%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
<tr>
<td>&nbsp;&nbsp;<tt>module <a href="reanimate-0.4.3.0-inplace/Reanimate.Scene.Core.hs.html">reanimate-0.4.3.0-inplace/Reanimate.Scene.Core</a></tt></td>
<td align="right">63%</td><td>12/19</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="63%"><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">72%</td><td>172/237</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="72%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
<tr>
<td>&nbsp;&nbsp;<tt>module <a href="reanimate-0.4.3.0-inplace/Reanimate.Svg.LineCommand.hs.html">reanimate-0.4.3.0-inplace/Reanimate.Svg.LineCommand</a></tt></td>
<td align="right">80%</td><td>12/15</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="80%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">58%</td><td>43/74</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="58%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">70%</td><td>659/937</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="70%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
<tr>
<td>&nbsp;&nbsp;<tt>module <a href="reanimate-0.4.3.0-inplace/Reanimate.Scene.Var.hs.html">reanimate-0.4.3.0-inplace/Reanimate.Scene.Var</a></tt></td>
<td align="right">89%</td><td>17/19</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="89%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">60%</td><td>14/23</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">68%</td><td>220/319</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="68%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
<tr>
<td>&nbsp;&nbsp;<tt>module <a href="reanimate-0.4.3.0-inplace/Reanimate.Svg.Constructors.hs.html">reanimate-0.4.3.0-inplace/Reanimate.Svg.Constructors</a></tt></td>
<td align="right">67%</td><td>33/49</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="67%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">37%</td><td>3/8</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="37%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">65%</td><td>368/563</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="65%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
<tr>
@ -49,9 +58,6 @@ table.dashboard { border-collapse: collapse ; border: solid 1px black }
<td>&nbsp;&nbsp;<tt>module <a href="reanimate-0.4.3.0-inplace/Reanimate.Svg.hs.html">reanimate-0.4.3.0-inplace/Reanimate.Svg</a></tt></td>
<td align="right">38%</td><td>5/13</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="38%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">18%</td><td>15/80</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="18%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">41%</td><td>323/777</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="41%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
<tr>
<td>&nbsp;&nbsp;<tt>module <a href="reanimate-0.4.3.0-inplace/Reanimate.Scene.hs.html">reanimate-0.4.3.0-inplace/Reanimate.Scene</a></tt></td>
<td align="right">27%</td><td>40/146</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="27%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">55%</td><td>15/27</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="55%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">31%</td><td>543/1700</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></tr>
<tr>
<td>&nbsp;&nbsp;<tt>module <a href="reanimate-0.4.3.0-inplace/Geom2D.CubicBezier.Linear.hs.html">reanimate-0.4.3.0-inplace/Geom2D.CubicBezier.Linear</a></tt></td>
<td align="right">19%</td><td>20/101</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="19%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">5%</td><td>2/36</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">27%</td><td>97/347</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="27%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
<tr>
@ -125,5 +131,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>
<tr></tr><tr style="background: #e0e0e0">
<th align=left>&nbsp;&nbsp;Program Coverage Total</tt></th>
<td align="right">30%</td><td>249/820</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">16%</td><td>134/829</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">29%</td><td>4680/15725</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="29%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
<td align="right">35%</td><td>261/739</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="35%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">17%</td><td>144/844</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="17%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">32%</td><td>4843/14981</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="32%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
</table></body></html>

View file

@ -22,9 +22,15 @@ table.dashboard { border-collapse: collapse ; border: solid 1px black }
<td>&nbsp;&nbsp;<tt>module <a href="reanimate-0.4.3.0-inplace/Reanimate.Animation.hs.html">reanimate-0.4.3.0-inplace/Reanimate.Animation</a></tt></td>
<td align="right">90%</td><td>28/31</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="90%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">57%</td><td>8/14</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="57%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">87%</td><td>298/341</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="87%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
<tr>
<td>&nbsp;&nbsp;<tt>module <a href="reanimate-0.4.3.0-inplace/Reanimate.Scene.Var.hs.html">reanimate-0.4.3.0-inplace/Reanimate.Scene.Var</a></tt></td>
<td align="right">89%</td><td>17/19</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="89%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">60%</td><td>14/23</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">68%</td><td>220/319</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="68%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
<tr>
<td>&nbsp;&nbsp;<tt>module <a href="reanimate-0.4.3.0-inplace/Reanimate.Ease.hs.html">reanimate-0.4.3.0-inplace/Reanimate.Ease</a></tt></td>
<td align="right">87%</td><td>7/8</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="87%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">100%</td><td>4/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="bar"></td></tr></table></td></tr></table></td><td align="right">96%</td><td>85/88</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="96%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
<tr>
<td>&nbsp;&nbsp;<tt>module <a href="reanimate-0.4.3.0-inplace/Reanimate.Scene.Sprite.hs.html">reanimate-0.4.3.0-inplace/Reanimate.Scene.Sprite</a></tt></td>
<td align="right">85%</td><td>23/27</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="85%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">57%</td><td>11/19</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="57%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">78%</td><td>314/400</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="78%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
<tr>
<td>&nbsp;&nbsp;<tt>module <a href="reanimate-0.4.3.0-inplace/Reanimate.Transform.hs.html">reanimate-0.4.3.0-inplace/Reanimate.Transform</a></tt></td>
<td align="right">83%</td><td>5/6</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="83%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><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">45%</td><td>76/166</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="45%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
<tr>
@ -37,6 +43,9 @@ table.dashboard { border-collapse: collapse ; border: solid 1px black }
<td>&nbsp;&nbsp;<tt>module <a href="reanimate-0.4.3.0-inplace/Reanimate.Svg.Constructors.hs.html">reanimate-0.4.3.0-inplace/Reanimate.Svg.Constructors</a></tt></td>
<td align="right">67%</td><td>33/49</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="67%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">37%</td><td>3/8</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="37%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">65%</td><td>368/563</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="65%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
<tr>
<td>&nbsp;&nbsp;<tt>module <a href="reanimate-0.4.3.0-inplace/Reanimate.Scene.Core.hs.html">reanimate-0.4.3.0-inplace/Reanimate.Scene.Core</a></tt></td>
<td align="right">63%</td><td>12/19</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="63%"><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">72%</td><td>172/237</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="72%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
<tr>
<td>&nbsp;&nbsp;<tt>module <a href="reanimate-0.4.3.0-inplace/Reanimate.Builtin.Images.hs.html">reanimate-0.4.3.0-inplace/Reanimate.Builtin.Images</a></tt></td>
<td align="right">57%</td><td>4/7</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="57%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">25%</td><td>1/4</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="25%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">48%</td><td>24/49</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="48%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
<tr>
@ -64,9 +73,6 @@ table.dashboard { border-collapse: collapse ; border: solid 1px black }
<td>&nbsp;&nbsp;<tt>module <a href="reanimate-0.4.3.0-inplace/Reanimate.Svg.Unuse.hs.html">reanimate-0.4.3.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">22%</td><td>28/127</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="22%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
<tr>
<td>&nbsp;&nbsp;<tt>module <a href="reanimate-0.4.3.0-inplace/Reanimate.Scene.hs.html">reanimate-0.4.3.0-inplace/Reanimate.Scene</a></tt></td>
<td align="right">27%</td><td>40/146</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="27%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">55%</td><td>15/27</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="55%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">31%</td><td>543/1700</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></tr>
<tr>
<td>&nbsp;&nbsp;<tt>module <a href="reanimate-0.4.3.0-inplace/Reanimate.PolyShape.hs.html">reanimate-0.4.3.0-inplace/Reanimate.PolyShape</a></tt></td>
<td align="right">22%</td><td>8/35</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="22%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">27%</td><td>13/48</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="27%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">18%</td><td>127/691</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="18%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
<tr>
@ -125,5 +131,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>
<tr></tr><tr style="background: #e0e0e0">
<th align=left>&nbsp;&nbsp;Program Coverage Total</tt></th>
<td align="right">30%</td><td>249/820</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">16%</td><td>134/829</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">29%</td><td>4680/15725</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="29%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
<td align="right">35%</td><td>261/739</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="35%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">17%</td><td>144/844</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="17%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">32%</td><td>4843/14981</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="32%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
</table></body></html>

View file

@ -9,4 +9,4 @@ const snippets = [{"title": "Hello World","url": "https://reanimate.clozecards.c
,{"title": "Object Positions","url": "https://reanimate.clozecards.com/Mf4zcImo+I7/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 $ oHideWith src oFadeOut\n oShowWith dst oFadeIn\n wait 1\n\nnewText txt =\n newObject $ scale 1.5 $ centerX $ latex txt\n"}
,{"title": "Camera","url": "https://reanimate.clozecards.com/Hcx00P+aeph/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 $ withFillColor \"blue\" $ mkCircle 1\n cameraAttach cam circle\n circleRight <- oRead circle oRightX\n\n box <- newObject $ withFillColor \"green\" $ mkRect 2 2\n cameraAttach cam box\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-09-08 (f2070)";
const playgroundVersion = "2020-09-08 (1c7fa)";

View file

@ -0,0 +1,186 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<style type="text/css">
span.lineno { color: white; background: #aaaaaa; border-right: solid white 12px }
span.nottickedoff { background: yellow}
span.istickedoff { background: white }
span.tickonlyfalse { margin: -1px; border: 1px solid #f20913; background: #f20913 }
span.tickonlytrue { margin: -1px; border: 1px solid #60de51; background: #60de51 }
span.funcount { font-size: small; color: orange; z-index: 2; position: absolute; right: 20 }
span.decl { font-weight: bold }
span.spaces { background: white }
</style>
</head>
<body>
<pre>
<span class="decl"><span class="nottickedoff">never executed</span> <span class="tickonlytrue">always true</span> <span class="tickonlyfalse">always false</span></span>
</pre>
<pre>
<span class="lineno"> 1 </span>{-# LANGUAGE RankNTypes #-}
<span class="lineno"> 2 </span>
<span class="lineno"> 3 </span>module Reanimate.Scene.Core where
<span class="lineno"> 4 </span>
<span class="lineno"> 5 </span>import Control.Monad.Fix (MonadFix (..))
<span class="lineno"> 6 </span>import Control.Monad.ST
<span class="lineno"> 7 </span>import Data.List
<span class="lineno"> 8 </span>import Reanimate.Animation
<span class="lineno"> 9 </span>import Reanimate.Svg.Constructors
<span class="lineno"> 10 </span>
<span class="lineno"> 11 </span>-- | The ZIndex property specifies the stack order of sprites and animations. Elements
<span class="lineno"> 12 </span>-- with a higher ZIndex will be drawn on top of elements with a lower index.
<span class="lineno"> 13 </span>type ZIndex = Int
<span class="lineno"> 14 </span>
<span class="lineno"> 15 </span>-- (seq duration, par duration)
<span class="lineno"> 16 </span>-- [(Time, Animation, ZIndex)]
<span class="lineno"> 17 </span>-- Map Time [(Animation, ZIndex)]
<span class="lineno"> 18 </span>type Gen s = ST s (Duration -&gt; Time -&gt; (SVG, ZIndex))
<span class="lineno"> 19 </span>
<span class="lineno"> 20 </span>-- | A 'Scene' represents a sequence of animations and variables
<span class="lineno"> 21 </span>-- that change over time.
<span class="lineno"> 22 </span>newtype Scene s a = M {<span class="istickedoff"><span class="decl"><span class="istickedoff">unM</span></span></span> :: Time -&gt; ST s (a, Duration, Duration, [Gen s])}
<span class="lineno"> 23 </span>
<span class="lineno"> 24 </span>instance Functor (Scene s) where
<span class="lineno"> 25 </span> <span class="decl"><span class="istickedoff">fmap f action = M $ \t -&gt; do</span>
<span class="lineno"> 26 </span><span class="spaces"> </span><span class="istickedoff">(a, d1, d2, gens) &lt;- unM action t</span>
<span class="lineno"> 27 </span><span class="spaces"> </span><span class="istickedoff">return (f a, d1, d2, gens)</span></span>
<span class="lineno"> 28 </span>
<span class="lineno"> 29 </span>instance Applicative (Scene s) where
<span class="lineno"> 30 </span> <span class="decl"><span class="istickedoff">pure a = M $ \_ -&gt; return (a, 0, 0, [])</span></span>
<span class="lineno"> 31 </span> <span class="decl"><span class="istickedoff">f &lt;*&gt; g = M $ \t -&gt; do</span>
<span class="lineno"> 32 </span><span class="spaces"> </span><span class="istickedoff">(f', s1, p1, gen1) &lt;- unM f t</span>
<span class="lineno"> 33 </span><span class="spaces"> </span><span class="istickedoff">(g', s2, p2, gen2) &lt;- unM g (t + s1)</span>
<span class="lineno"> 34 </span><span class="spaces"> </span><span class="istickedoff">return (f' g', s1 + s2, max p1 (s1 + p2), gen1 ++ gen2)</span></span>
<span class="lineno"> 35 </span>
<span class="lineno"> 36 </span>instance Monad (Scene s) where
<span class="lineno"> 37 </span> <span class="decl"><span class="nottickedoff">return = pure</span></span>
<span class="lineno"> 38 </span> <span class="decl"><span class="istickedoff">f &gt;&gt;= g = M $ \t -&gt; do</span>
<span class="lineno"> 39 </span><span class="spaces"> </span><span class="istickedoff">(a, s1, p1, gen1) &lt;- unM f t</span>
<span class="lineno"> 40 </span><span class="spaces"> </span><span class="istickedoff">(b, s2, p2, gen2) &lt;- unM (g a) (t + s1)</span>
<span class="lineno"> 41 </span><span class="spaces"> </span><span class="istickedoff">return (b, s1 + s2, max p1 (s1 + p2), gen1 ++ gen2)</span></span>
<span class="lineno"> 42 </span>
<span class="lineno"> 43 </span>instance MonadFix (Scene s) where
<span class="lineno"> 44 </span> <span class="decl"><span class="nottickedoff">mfix fn = M $ \t -&gt; mfix (\v -&gt; let (a, _s, _p, _gens) = v in unM (fn a) t)</span></span>
<span class="lineno"> 45 </span>
<span class="lineno"> 46 </span>liftST :: ST s a -&gt; Scene s a
<span class="lineno"> 47 </span><span class="decl"><span class="istickedoff">liftST action = M $ \_ -&gt; action &gt;&gt;= \a -&gt; return (a, 0, 0, [])</span></span>
<span class="lineno"> 48 </span>
<span class="lineno"> 49 </span>-- | Evaluate the value of a scene.
<span class="lineno"> 50 </span>evalScene :: (forall s. Scene s a) -&gt; a
<span class="lineno"> 51 </span><span class="decl"><span class="nottickedoff">evalScene action = runST $ do</span>
<span class="lineno"> 52 </span><span class="spaces"> </span><span class="nottickedoff">(val, _, _, _) &lt;- unM action 0</span>
<span class="lineno"> 53 </span><span class="spaces"> </span><span class="nottickedoff">return val</span></span>
<span class="lineno"> 54 </span>
<span class="lineno"> 55 </span>-- | Render a 'Scene' to an 'Animation'.
<span class="lineno"> 56 </span>scene :: (forall s. Scene s a) -&gt; Animation
<span class="lineno"> 57 </span><span class="decl"><span class="nottickedoff">scene = sceneAnimation</span></span>
<span class="lineno"> 58 </span>
<span class="lineno"> 59 </span>-- | Render a 'Scene' to an 'Animation'.
<span class="lineno"> 60 </span>sceneAnimation :: (forall s. Scene s a) -&gt; Animation
<span class="lineno"> 61 </span><span class="decl"><span class="istickedoff">sceneAnimation action =</span>
<span class="lineno"> 62 </span><span class="spaces"> </span><span class="istickedoff">runST</span>
<span class="lineno"> 63 </span><span class="spaces"> </span><span class="istickedoff">( do</span>
<span class="lineno"> 64 </span><span class="spaces"> </span><span class="istickedoff">(_, s, p, gens) &lt;- unM action 0</span>
<span class="lineno"> 65 </span><span class="spaces"> </span><span class="istickedoff">let dur = max s p</span>
<span class="lineno"> 66 </span><span class="spaces"> </span><span class="istickedoff">genFns &lt;- sequence gens</span>
<span class="lineno"> 67 </span><span class="spaces"> </span><span class="istickedoff">return $</span>
<span class="lineno"> 68 </span><span class="spaces"> </span><span class="istickedoff">mkAnimation</span>
<span class="lineno"> 69 </span><span class="spaces"> </span><span class="istickedoff">dur</span>
<span class="lineno"> 70 </span><span class="spaces"> </span><span class="istickedoff">( \t -&gt;</span>
<span class="lineno"> 71 </span><span class="spaces"> </span><span class="istickedoff">mkGroup $</span>
<span class="lineno"> 72 </span><span class="spaces"> </span><span class="istickedoff">map fst $</span>
<span class="lineno"> 73 </span><span class="spaces"> </span><span class="istickedoff">sortOn</span>
<span class="lineno"> 74 </span><span class="spaces"> </span><span class="istickedoff">snd</span>
<span class="lineno"> 75 </span><span class="spaces"> </span><span class="istickedoff">[spriteRender dur (t * dur) | spriteRender &lt;- genFns]</span>
<span class="lineno"> 76 </span><span class="spaces"> </span><span class="istickedoff">)</span>
<span class="lineno"> 77 </span><span class="spaces"> </span><span class="istickedoff">)</span></span>
<span class="lineno"> 78 </span>
<span class="lineno"> 79 </span>-- | Execute actions in a scene without advancing the clock. Note that scenes do not end before
<span class="lineno"> 80 </span>-- all forked actions have completed.
<span class="lineno"> 81 </span>--
<span class="lineno"> 82 </span>-- Example:
<span class="lineno"> 83 </span>--
<span class="lineno"> 84 </span>-- @
<span class="lineno"> 85 </span>-- do 'fork' $ 'play' 'Reanimate.Builtin.Documentation.drawBox'
<span class="lineno"> 86 </span>-- 'play' 'Reanimate.Builtin.Documentation.drawCircle'
<span class="lineno"> 87 </span>-- @
<span class="lineno"> 88 </span>--
<span class="lineno"> 89 </span>-- &lt;&lt;docs/gifs/doc_fork.gif&gt;&gt;
<span class="lineno"> 90 </span>fork :: Scene s a -&gt; Scene s a
<span class="lineno"> 91 </span><span class="decl"><span class="istickedoff">fork (M action) = M $ \t -&gt; do</span>
<span class="lineno"> 92 </span><span class="spaces"> </span><span class="istickedoff">(a, s, p, gens) &lt;- action t</span>
<span class="lineno"> 93 </span><span class="spaces"> </span><span class="istickedoff">return (a, 0, max s p, gens)</span></span>
<span class="lineno"> 94 </span>
<span class="lineno"> 95 </span>-- | Query the current clock timestamp.
<span class="lineno"> 96 </span>--
<span class="lineno"> 97 </span>-- Example:
<span class="lineno"> 98 </span>--
<span class="lineno"> 99 </span>-- @
<span class="lineno"> 100 </span>-- do now \&lt;- 'play' 'Reanimate.Builtin.Documentation.drawCircle' *\&gt; 'queryNow'
<span class="lineno"> 101 </span>-- 'play' $ 'staticFrame' 1 $ 'scale' 2 $ 'withStrokeWidth' 0.05 $
<span class="lineno"> 102 </span>-- 'mkText' $ &quot;Now=&quot; &lt;&gt; T.pack (show now)
<span class="lineno"> 103 </span>-- @
<span class="lineno"> 104 </span>--
<span class="lineno"> 105 </span>-- &lt;&lt;docs/gifs/doc_queryNow.gif&gt;&gt;
<span class="lineno"> 106 </span>queryNow :: Scene s Time
<span class="lineno"> 107 </span><span class="decl"><span class="istickedoff">queryNow = M $ \t -&gt; return (t, 0, 0, [])</span></span>
<span class="lineno"> 108 </span>
<span class="lineno"> 109 </span>-- | Advance the clock by a given number of seconds.
<span class="lineno"> 110 </span>--
<span class="lineno"> 111 </span>-- Example:
<span class="lineno"> 112 </span>--
<span class="lineno"> 113 </span>-- @
<span class="lineno"> 114 </span>-- do 'fork' $ 'play' 'Reanimate.Builtin.Documentation.drawBox'
<span class="lineno"> 115 </span>-- 'wait' 1
<span class="lineno"> 116 </span>-- 'play' 'Reanimate.Builtin.Documentation.drawCircle'
<span class="lineno"> 117 </span>-- @
<span class="lineno"> 118 </span>--
<span class="lineno"> 119 </span>-- &lt;&lt;docs/gifs/doc_wait.gif&gt;&gt;
<span class="lineno"> 120 </span>wait :: Duration -&gt; Scene s ()
<span class="lineno"> 121 </span><span class="decl"><span class="istickedoff">wait d = M $ \_ -&gt; return (<span class="nottickedoff">()</span>, d, 0, [])</span></span>
<span class="lineno"> 122 </span>
<span class="lineno"> 123 </span>-- | Wait until the clock is equal to the given timestamp.
<span class="lineno"> 124 </span>waitUntil :: Time -&gt; Scene s ()
<span class="lineno"> 125 </span><span class="decl"><span class="nottickedoff">waitUntil tNew = do</span>
<span class="lineno"> 126 </span><span class="spaces"> </span><span class="nottickedoff">now &lt;- queryNow</span>
<span class="lineno"> 127 </span><span class="spaces"> </span><span class="nottickedoff">wait (max 0 (tNew - now))</span></span>
<span class="lineno"> 128 </span>
<span class="lineno"> 129 </span>-- | Wait until all forked and sequential animations have finished.
<span class="lineno"> 130 </span>--
<span class="lineno"> 131 </span>-- Example:
<span class="lineno"> 132 </span>--
<span class="lineno"> 133 </span>-- @
<span class="lineno"> 134 </span>-- do 'waitOn' $ 'fork' $ 'play' 'Reanimate.Builtin.Documentation.drawBox'
<span class="lineno"> 135 </span>-- 'play' 'Reanimate.Builtin.Documentation.drawCircle'
<span class="lineno"> 136 </span>-- @
<span class="lineno"> 137 </span>--
<span class="lineno"> 138 </span>-- &lt;&lt;docs/gifs/doc_waitOn.gif&gt;&gt;
<span class="lineno"> 139 </span>waitOn :: Scene s a -&gt; Scene s a
<span class="lineno"> 140 </span><span class="decl"><span class="istickedoff">waitOn (M action) = M $ \t -&gt; do</span>
<span class="lineno"> 141 </span><span class="spaces"> </span><span class="istickedoff">(a, s, p, gens) &lt;- action t</span>
<span class="lineno"> 142 </span><span class="spaces"> </span><span class="istickedoff">return (<span class="nottickedoff">a</span>, max s p, 0, gens)</span></span>
<span class="lineno"> 143 </span>
<span class="lineno"> 144 </span>-- | Change the ZIndex of a scene.
<span class="lineno"> 145 </span>adjustZ :: (ZIndex -&gt; ZIndex) -&gt; Scene s a -&gt; Scene s a
<span class="lineno"> 146 </span><span class="decl"><span class="nottickedoff">adjustZ fn (M action) = M $ \t -&gt; do</span>
<span class="lineno"> 147 </span><span class="spaces"> </span><span class="nottickedoff">(a, s, p, gens) &lt;- action t</span>
<span class="lineno"> 148 </span><span class="spaces"> </span><span class="nottickedoff">return (a, s, p, map genFn gens)</span>
<span class="lineno"> 149 </span><span class="spaces"> </span><span class="nottickedoff">where</span>
<span class="lineno"> 150 </span><span class="spaces"> </span><span class="nottickedoff">genFn gen = do</span>
<span class="lineno"> 151 </span><span class="spaces"> </span><span class="nottickedoff">frameGen &lt;- gen</span>
<span class="lineno"> 152 </span><span class="spaces"> </span><span class="nottickedoff">return $ \d t -&gt; let (svg, z) = frameGen d t in (svg, fn z)</span></span>
<span class="lineno"> 153 </span>
<span class="lineno"> 154 </span>-- | Query the duration of a scene.
<span class="lineno"> 155 </span>withSceneDuration :: Scene s () -&gt; Scene s Duration
<span class="lineno"> 156 </span><span class="decl"><span class="nottickedoff">withSceneDuration s = do</span>
<span class="lineno"> 157 </span><span class="spaces"> </span><span class="nottickedoff">t1 &lt;- queryNow</span>
<span class="lineno"> 158 </span><span class="spaces"> </span><span class="nottickedoff">s</span>
<span class="lineno"> 159 </span><span class="spaces"> </span><span class="nottickedoff">t2 &lt;- queryNow</span>
<span class="lineno"> 160 </span><span class="spaces"> </span><span class="nottickedoff">return (t2 - t1)</span></span>
<span class="lineno"> 161 </span>
<span class="lineno"> 162 </span>addGen :: Gen s -&gt; Scene s ()
<span class="lineno"> 163 </span><span class="decl"><span class="istickedoff">addGen gen = M $ \_ -&gt; return (<span class="nottickedoff">()</span>, 0, 0, [gen])</span></span>
</pre>
</body>
</html>

View file

@ -0,0 +1,439 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<style type="text/css">
span.lineno { color: white; background: #aaaaaa; border-right: solid white 12px }
span.nottickedoff { background: yellow}
span.istickedoff { background: white }
span.tickonlyfalse { margin: -1px; border: 1px solid #f20913; background: #f20913 }
span.tickonlytrue { margin: -1px; border: 1px solid #60de51; background: #60de51 }
span.funcount { font-size: small; color: orange; z-index: 2; position: absolute; right: 20 }
span.decl { font-weight: bold }
span.spaces { background: white }
</style>
</head>
<body>
<pre>
<span class="decl"><span class="nottickedoff">never executed</span> <span class="tickonlytrue">always true</span> <span class="tickonlyfalse">always false</span></span>
</pre>
<pre>
<span class="lineno"> 1 </span>{-# LANGUAGE ApplicativeDo #-}
<span class="lineno"> 2 </span>{-# LANGUAGE PatternSynonyms #-}
<span class="lineno"> 3 </span>{-# LANGUAGE RankNTypes #-}
<span class="lineno"> 4 </span>
<span class="lineno"> 5 </span>module Reanimate.Scene.Sprite where
<span class="lineno"> 6 </span>
<span class="lineno"> 7 </span>import Control.Monad (void)
<span class="lineno"> 8 </span>import Control.Monad.ST (ST)
<span class="lineno"> 9 </span>import Data.Bifunctor (Bifunctor (first))
<span class="lineno"> 10 </span>import Data.STRef (STRef, modifySTRef, newSTRef, readSTRef)
<span class="lineno"> 11 </span>import Graphics.SvgTree
<span class="lineno"> 12 </span> ( pattern None,
<span class="lineno"> 13 </span> )
<span class="lineno"> 14 </span>import Reanimate.Animation
<span class="lineno"> 15 </span> ( Animation,
<span class="lineno"> 16 </span> Duration,
<span class="lineno"> 17 </span> SVG,
<span class="lineno"> 18 </span> Sync (SyncStretch),
<span class="lineno"> 19 </span> Time,
<span class="lineno"> 20 </span> dropA,
<span class="lineno"> 21 </span> duration,
<span class="lineno"> 22 </span> getAnimationFrame,
<span class="lineno"> 23 </span> )
<span class="lineno"> 24 </span>import Reanimate.Effect (Effect, delayE)
<span class="lineno"> 25 </span>import Reanimate.Scene.Core
<span class="lineno"> 26 </span> ( Scene (M),
<span class="lineno"> 27 </span> ZIndex,
<span class="lineno"> 28 </span> addGen,
<span class="lineno"> 29 </span> fork,
<span class="lineno"> 30 </span> liftST,
<span class="lineno"> 31 </span> queryNow,
<span class="lineno"> 32 </span> sceneAnimation,
<span class="lineno"> 33 </span> wait,
<span class="lineno"> 34 </span> )
<span class="lineno"> 35 </span>import Reanimate.Scene.Var (unpackVar, Var (..), newVar, readVar)
<span class="lineno"> 36 </span>import Reanimate.Transition (Transition, overlapT)
<span class="lineno"> 37 </span>
<span class="lineno"> 38 </span>-- | Create and render a variable. The rendering will be born at the current timestamp
<span class="lineno"> 39 </span>-- and will persist until the end of the scene.
<span class="lineno"> 40 </span>--
<span class="lineno"> 41 </span>-- Example:
<span class="lineno"> 42 </span>--
<span class="lineno"> 43 </span>-- @
<span class="lineno"> 44 </span>-- do var \&lt;- 'simpleVar' 'mkCircle' 0
<span class="lineno"> 45 </span>-- 'tweenVar' var 2 $ \\val -&gt; 'fromToS' val ('Reanimate.Constants.screenHeight'/2)
<span class="lineno"> 46 </span>-- @
<span class="lineno"> 47 </span>--
<span class="lineno"> 48 </span>-- &lt;&lt;docs/gifs/doc_simpleVar.gif&gt;&gt;
<span class="lineno"> 49 </span>simpleVar :: (a -&gt; SVG) -&gt; a -&gt; Scene s (Var s a)
<span class="lineno"> 50 </span><span class="decl"><span class="istickedoff">simpleVar render def = do</span>
<span class="lineno"> 51 </span><span class="spaces"> </span><span class="istickedoff">v &lt;- newVar def</span>
<span class="lineno"> 52 </span><span class="spaces"> </span><span class="istickedoff">_ &lt;- newSprite $ render &lt;$&gt; unVar v</span>
<span class="lineno"> 53 </span><span class="spaces"> </span><span class="istickedoff">return v</span></span>
<span class="lineno"> 54 </span>
<span class="lineno"> 55 </span>-- | Helper function for filtering variables.
<span class="lineno"> 56 </span>findVar :: (a -&gt; Bool) -&gt; [Var s a] -&gt; Scene s (Var s a)
<span class="lineno"> 57 </span><span class="decl"><span class="nottickedoff">findVar _cond [] = error &quot;Variable not found.&quot;</span>
<span class="lineno"> 58 </span><span class="spaces"></span><span class="nottickedoff">findVar cond (v : vs) = do</span>
<span class="lineno"> 59 </span><span class="spaces"> </span><span class="nottickedoff">val &lt;- readVar v</span>
<span class="lineno"> 60 </span><span class="spaces"> </span><span class="nottickedoff">if cond val then return v else findVar cond vs</span></span>
<span class="lineno"> 61 </span>
<span class="lineno"> 62 </span>-- | Play an animation once and then remove it. This advances the clock by the duration of the
<span class="lineno"> 63 </span>-- animation.
<span class="lineno"> 64 </span>--
<span class="lineno"> 65 </span>-- Example:
<span class="lineno"> 66 </span>--
<span class="lineno"> 67 </span>-- @
<span class="lineno"> 68 </span>-- do 'play' 'Reanimate.Builtin.Documentation.drawBox'
<span class="lineno"> 69 </span>-- 'play' 'Reanimate.Builtin.Documentation.drawCircle'
<span class="lineno"> 70 </span>-- @
<span class="lineno"> 71 </span>--
<span class="lineno"> 72 </span>-- &lt;&lt;docs/gifs/doc_play.gif&gt;&gt;
<span class="lineno"> 73 </span>play :: Animation -&gt; Scene s ()
<span class="lineno"> 74 </span><span class="decl"><span class="istickedoff">play ani = newSpriteA ani &gt;&gt;= destroySprite</span></span>
<span class="lineno"> 75 </span>
<span class="lineno"> 76 </span>-- | Sprites are animations with a given time of birth as well as a time of death.
<span class="lineno"> 77 </span>-- They can be controlled using variables, tweening, and effects.
<span class="lineno"> 78 </span>data Sprite s = Sprite Time (STRef s (Duration, ST s (Duration -&gt; Time -&gt; SVG -&gt; (SVG, ZIndex))))
<span class="lineno"> 79 </span>
<span class="lineno"> 80 </span>-- | Sprite frame generator. Generates frames over time in a stateful environment.
<span class="lineno"> 81 </span>newtype Frame s a = Frame {<span class="istickedoff"><span class="decl"><span class="istickedoff">unFrame</span></span></span> :: ST s (Time -&gt; Duration -&gt; Time -&gt; a)}
<span class="lineno"> 82 </span>
<span class="lineno"> 83 </span>instance Functor (Frame s) where
<span class="lineno"> 84 </span> <span class="decl"><span class="istickedoff">fmap fn (Frame gen) = Frame $ do</span>
<span class="lineno"> 85 </span><span class="spaces"> </span><span class="istickedoff">m &lt;- gen</span>
<span class="lineno"> 86 </span><span class="spaces"> </span><span class="istickedoff">return (\real_t d t -&gt; fn $ m real_t <span class="nottickedoff">d</span> t)</span></span>
<span class="lineno"> 87 </span>
<span class="lineno"> 88 </span>instance Applicative (Frame s) where
<span class="lineno"> 89 </span> <span class="decl"><span class="istickedoff">pure v = Frame $ return (\_ _ _ -&gt; v)</span></span>
<span class="lineno"> 90 </span> <span class="decl"><span class="istickedoff">Frame f &lt;*&gt; Frame g = Frame $ do</span>
<span class="lineno"> 91 </span><span class="spaces"> </span><span class="istickedoff">m1 &lt;- f</span>
<span class="lineno"> 92 </span><span class="spaces"> </span><span class="istickedoff">m2 &lt;- g</span>
<span class="lineno"> 93 </span><span class="spaces"> </span><span class="istickedoff">return $ \real_t d t -&gt; m1 real_t <span class="nottickedoff">d</span> t (m2 real_t d <span class="nottickedoff">t</span>)</span></span>
<span class="lineno"> 94 </span>
<span class="lineno"> 95 </span>-- | Dereference a variable as a Sprite frame.
<span class="lineno"> 96 </span>--
<span class="lineno"> 97 </span>-- Example:
<span class="lineno"> 98 </span>--
<span class="lineno"> 99 </span>-- @
<span class="lineno"> 100 </span>-- do v \&lt;- 'newVar' 0
<span class="lineno"> 101 </span>-- 'newSprite' $ 'mkCircle' \&lt;$\&gt; 'unVar' v
<span class="lineno"> 102 </span>-- 'tweenVar' v 1 $ \\val -&gt; 'fromToS' val 3
<span class="lineno"> 103 </span>-- 'tweenVar' v 1 $ \\val -&gt; 'fromToS' val 0
<span class="lineno"> 104 </span>-- @
<span class="lineno"> 105 </span>--
<span class="lineno"> 106 </span>-- &lt;&lt;docs/gifs/doc_unVar.gif&gt;&gt;
<span class="lineno"> 107 </span>unVar :: Var s a -&gt; Frame s a
<span class="lineno"> 108 </span><span class="decl"><span class="istickedoff">unVar var = Frame $ do</span>
<span class="lineno"> 109 </span><span class="spaces"> </span><span class="istickedoff">fn &lt;- unpackVar var</span>
<span class="lineno"> 110 </span><span class="spaces"> </span><span class="istickedoff">return $ \real_t _d _t -&gt; fn real_t</span></span>
<span class="lineno"> 111 </span>
<span class="lineno"> 112 </span>-- | Dereference seconds since sprite birth.
<span class="lineno"> 113 </span>spriteT :: Frame s Time
<span class="lineno"> 114 </span><span class="decl"><span class="istickedoff">spriteT = Frame $ return (\_real_t _d t -&gt; t)</span></span>
<span class="lineno"> 115 </span>
<span class="lineno"> 116 </span>-- | Dereference duration of the current sprite.
<span class="lineno"> 117 </span>spriteDuration :: Frame s Duration
<span class="lineno"> 118 </span><span class="decl"><span class="istickedoff">spriteDuration = Frame $ return (\_real_t d _t -&gt; d)</span></span>
<span class="lineno"> 119 </span>
<span class="lineno"> 120 </span>-- | Create new sprite defined by a frame generator. Unless otherwise specified using
<span class="lineno"> 121 </span>-- 'destroySprite', the sprite will die at the end of the scene.
<span class="lineno"> 122 </span>--
<span class="lineno"> 123 </span>-- Example:
<span class="lineno"> 124 </span>--
<span class="lineno"> 125 </span>-- @
<span class="lineno"> 126 </span>-- do 'newSprite' $ 'mkCircle' \&lt;$\&gt; 'spriteT' -- Circle sprite where radius=time.
<span class="lineno"> 127 </span>-- 'wait' 2
<span class="lineno"> 128 </span>-- @
<span class="lineno"> 129 </span>--
<span class="lineno"> 130 </span>-- &lt;&lt;docs/gifs/doc_newSprite.gif&gt;&gt;
<span class="lineno"> 131 </span>newSprite :: Frame s SVG -&gt; Scene s (Sprite s)
<span class="lineno"> 132 </span><span class="decl"><span class="istickedoff">newSprite render = do</span>
<span class="lineno"> 133 </span><span class="spaces"> </span><span class="istickedoff">now &lt;- queryNow</span>
<span class="lineno"> 134 </span><span class="spaces"> </span><span class="istickedoff">ref &lt;- liftST $ newSTRef (-1, return $ \_d _t svg -&gt; (svg, 0))</span>
<span class="lineno"> 135 </span><span class="spaces"> </span><span class="istickedoff">addGen $ do</span>
<span class="lineno"> 136 </span><span class="spaces"> </span><span class="istickedoff">fn &lt;- unFrame render</span>
<span class="lineno"> 137 </span><span class="spaces"> </span><span class="istickedoff">(spriteDur, spriteEffectGen) &lt;- readSTRef ref</span>
<span class="lineno"> 138 </span><span class="spaces"> </span><span class="istickedoff">spriteEffect &lt;- spriteEffectGen</span>
<span class="lineno"> 139 </span><span class="spaces"> </span><span class="istickedoff">return $ \d absT -&gt;</span>
<span class="lineno"> 140 </span><span class="spaces"> </span><span class="istickedoff">let relD = (if spriteDur &lt; 0 then d else spriteDur) - now</span>
<span class="lineno"> 141 </span><span class="spaces"> </span><span class="istickedoff">relT = absT - now</span>
<span class="lineno"> 142 </span><span class="spaces"> </span><span class="istickedoff">-- Sprite is live [now;duration[</span>
<span class="lineno"> 143 </span><span class="spaces"> </span><span class="istickedoff">-- If we're at the end of a scene, sprites</span>
<span class="lineno"> 144 </span><span class="spaces"> </span><span class="istickedoff">-- are live: [now;duration]</span>
<span class="lineno"> 145 </span><span class="spaces"> </span><span class="istickedoff">-- This behavior is difficult to get right. See the 'bug_*' examples for</span>
<span class="lineno"> 146 </span><span class="spaces"> </span><span class="istickedoff">-- automated tests.</span>
<span class="lineno"> 147 </span><span class="spaces"> </span><span class="istickedoff">inTimeSlice = relT &gt;= 0 &amp;&amp; relT &lt; relD</span>
<span class="lineno"> 148 </span><span class="spaces"> </span><span class="istickedoff">isLastFrame = d == absT &amp;&amp; relT == relD</span>
<span class="lineno"> 149 </span><span class="spaces"> </span><span class="istickedoff">in if inTimeSlice || isLastFrame</span>
<span class="lineno"> 150 </span><span class="spaces"> </span><span class="istickedoff">then spriteEffect relD relT (fn absT relD relT)</span>
<span class="lineno"> 151 </span><span class="spaces"> </span><span class="istickedoff">else (None, 0)</span>
<span class="lineno"> 152 </span><span class="spaces"> </span><span class="istickedoff">return $ Sprite now ref</span></span>
<span class="lineno"> 153 </span>
<span class="lineno"> 154 </span>-- | Create new sprite defined by a frame generator. The sprite will die at
<span class="lineno"> 155 </span>-- the end of the scene.
<span class="lineno"> 156 </span>newSprite_ :: Frame s SVG -&gt; Scene s ()
<span class="lineno"> 157 </span><span class="decl"><span class="istickedoff">newSprite_ = void . newSprite</span></span>
<span class="lineno"> 158 </span>
<span class="lineno"> 159 </span>-- | Create a new sprite from an animation. This advances the clock by the
<span class="lineno"> 160 </span>-- duration of the animation. Unless otherwise specified using
<span class="lineno"> 161 </span>-- 'destroySprite', the sprite will die at the end of the scene.
<span class="lineno"> 162 </span>--
<span class="lineno"> 163 </span>-- Note: If the scene doesn't end immediately after the duration of the
<span class="lineno"> 164 </span>-- animation, the animation will be stretched to match the lifetime of the
<span class="lineno"> 165 </span>-- sprite. See 'newSpriteA'' and 'play'.
<span class="lineno"> 166 </span>--
<span class="lineno"> 167 </span>-- Example:
<span class="lineno"> 168 </span>--
<span class="lineno"> 169 </span>-- @
<span class="lineno"> 170 </span>-- do 'fork' $ 'newSpriteA' 'Reanimate.Builtin.Documentation.drawCircle'
<span class="lineno"> 171 </span>-- 'play' 'Reanimate.Builtin.Documentation.drawBox'
<span class="lineno"> 172 </span>-- 'play' $ 'reverseA' 'Reanimate.Builtin.Documentation.drawBox'
<span class="lineno"> 173 </span>-- @
<span class="lineno"> 174 </span>--
<span class="lineno"> 175 </span>-- &lt;&lt;docs/gifs/doc_newSpriteA.gif&gt;&gt;
<span class="lineno"> 176 </span>newSpriteA :: Animation -&gt; Scene s (Sprite s)
<span class="lineno"> 177 </span><span class="decl"><span class="istickedoff">newSpriteA = newSpriteA' SyncStretch</span></span>
<span class="lineno"> 178 </span>
<span class="lineno"> 179 </span>-- | Create a new sprite from an animation and specify the synchronization policy. This advances
<span class="lineno"> 180 </span>-- the clock by the duration of the animation.
<span class="lineno"> 181 </span>--
<span class="lineno"> 182 </span>-- Example:
<span class="lineno"> 183 </span>--
<span class="lineno"> 184 </span>-- @
<span class="lineno"> 185 </span>-- do 'fork' $ 'newSpriteA'' 'SyncFreeze' 'Reanimate.Builtin.Documentation.drawCircle'
<span class="lineno"> 186 </span>-- 'play' 'Reanimate.Builtin.Documentation.drawBox'
<span class="lineno"> 187 </span>-- 'play' $ 'reverseA' 'Reanimate.Builtin.Documentation.drawBox'
<span class="lineno"> 188 </span>-- @
<span class="lineno"> 189 </span>--
<span class="lineno"> 190 </span>-- &lt;&lt;docs/gifs/doc_newSpriteA'.gif&gt;&gt;
<span class="lineno"> 191 </span>newSpriteA' :: Sync -&gt; Animation -&gt; Scene s (Sprite s)
<span class="lineno"> 192 </span><span class="decl"><span class="istickedoff">newSpriteA' sync animation =</span>
<span class="lineno"> 193 </span><span class="spaces"> </span><span class="istickedoff">newSprite (getAnimationFrame sync animation &lt;$&gt; spriteT &lt;*&gt; spriteDuration)</span>
<span class="lineno"> 194 </span><span class="spaces"> </span><span class="istickedoff">&lt;* wait (duration animation)</span></span>
<span class="lineno"> 195 </span>
<span class="lineno"> 196 </span>-- | Create a sprite from a static SVG image.
<span class="lineno"> 197 </span>--
<span class="lineno"> 198 </span>-- Example:
<span class="lineno"> 199 </span>--
<span class="lineno"> 200 </span>-- @
<span class="lineno"> 201 </span>-- do 'newSpriteSVG' $ 'mkBackground' &quot;lightblue&quot;
<span class="lineno"> 202 </span>-- 'play' 'Reanimate.Builtin.Documentation.drawCircle'
<span class="lineno"> 203 </span>-- @
<span class="lineno"> 204 </span>--
<span class="lineno"> 205 </span>-- &lt;&lt;docs/gifs/doc_newSpriteSVG.gif&gt;&gt;
<span class="lineno"> 206 </span>newSpriteSVG :: SVG -&gt; Scene s (Sprite s)
<span class="lineno"> 207 </span><span class="decl"><span class="istickedoff">newSpriteSVG = newSprite . pure</span></span>
<span class="lineno"> 208 </span>
<span class="lineno"> 209 </span>-- | Create a permanent sprite from a static SVG image. Same as `newSpriteSVG`
<span class="lineno"> 210 </span>-- but the sprite isn't returned and thus cannot be destroyed.
<span class="lineno"> 211 </span>newSpriteSVG_ :: SVG -&gt; Scene s ()
<span class="lineno"> 212 </span><span class="decl"><span class="istickedoff">newSpriteSVG_ = void . newSpriteSVG</span></span>
<span class="lineno"> 213 </span>
<span class="lineno"> 214 </span>-- | Change the rendering of a sprite using data from a variable. If data from several variables
<span class="lineno"> 215 </span>-- is needed, use a frame generator instead.
<span class="lineno"> 216 </span>--
<span class="lineno"> 217 </span>-- Example:
<span class="lineno"> 218 </span>--
<span class="lineno"> 219 </span>-- @
<span class="lineno"> 220 </span>-- do s \&lt;- 'fork' $ 'newSpriteA' 'Reanimate.Builtin.Documentation.drawBox'
<span class="lineno"> 221 </span>-- v \&lt;- 'newVar' 0
<span class="lineno"> 222 </span>-- 'applyVar' v s 'rotate'
<span class="lineno"> 223 </span>-- 'tweenVar' v 2 $ \\val -&gt; 'fromToS' val 90
<span class="lineno"> 224 </span>-- @
<span class="lineno"> 225 </span>--
<span class="lineno"> 226 </span>-- &lt;&lt;docs/gifs/doc_applyVar.gif&gt;&gt;
<span class="lineno"> 227 </span>applyVar :: Var s a -&gt; Sprite s -&gt; (a -&gt; SVG -&gt; SVG) -&gt; Scene s ()
<span class="lineno"> 228 </span><span class="decl"><span class="istickedoff">applyVar var sprite fn = spriteModify sprite $ do</span>
<span class="lineno"> 229 </span><span class="spaces"> </span><span class="istickedoff">varFn &lt;- unVar var</span>
<span class="lineno"> 230 </span><span class="spaces"> </span><span class="istickedoff">return $ first $ fn varFn</span></span>
<span class="lineno"> 231 </span>
<span class="lineno"> 232 </span>-- | Destroy a sprite, preventing it from being rendered in the future of the scene.
<span class="lineno"> 233 </span>-- If 'destroySprite' is invoked multiple times, the earliest time-of-death is used.
<span class="lineno"> 234 </span>--
<span class="lineno"> 235 </span>-- Example:
<span class="lineno"> 236 </span>--
<span class="lineno"> 237 </span>-- @
<span class="lineno"> 238 </span>-- do s &lt;- 'newSpriteSVG' $ 'withFillOpacity' 1 $ 'mkCircle' 1
<span class="lineno"> 239 </span>-- 'fork' $ 'wait' 1 \&gt;\&gt; 'destroySprite' s
<span class="lineno"> 240 </span>-- 'play' 'Reanimate.Builtin.Documentation.drawBox'
<span class="lineno"> 241 </span>-- @
<span class="lineno"> 242 </span>--
<span class="lineno"> 243 </span>-- &lt;&lt;docs/gifs/doc_destroySprite.gif&gt;&gt;
<span class="lineno"> 244 </span>destroySprite :: Sprite s -&gt; Scene s ()
<span class="lineno"> 245 </span><span class="decl"><span class="istickedoff">destroySprite (Sprite _ ref) = do</span>
<span class="lineno"> 246 </span><span class="spaces"> </span><span class="istickedoff">now &lt;- queryNow</span>
<span class="lineno"> 247 </span><span class="spaces"> </span><span class="istickedoff">liftST $</span>
<span class="lineno"> 248 </span><span class="spaces"> </span><span class="istickedoff">modifySTRef ref $ \(ttl, render) -&gt;</span>
<span class="lineno"> 249 </span><span class="spaces"> </span><span class="istickedoff">(if <span class="tickonlytrue">ttl &lt; 0</span> then now else <span class="nottickedoff">min ttl now</span>, render)</span></span>
<span class="lineno"> 250 </span>
<span class="lineno"> 251 </span>-- | Low-level frame modifier.
<span class="lineno"> 252 </span>spriteModify :: Sprite s -&gt; Frame s ((SVG, ZIndex) -&gt; (SVG, ZIndex)) -&gt; Scene s ()
<span class="lineno"> 253 </span><span class="decl"><span class="istickedoff">spriteModify (Sprite born ref) modFn = liftST $</span>
<span class="lineno"> 254 </span><span class="spaces"> </span><span class="istickedoff">modifySTRef ref $ \(ttl, renderGen) -&gt;</span>
<span class="lineno"> 255 </span><span class="spaces"> </span><span class="istickedoff">( ttl,</span>
<span class="lineno"> 256 </span><span class="spaces"> </span><span class="istickedoff">do</span>
<span class="lineno"> 257 </span><span class="spaces"> </span><span class="istickedoff">render &lt;- renderGen</span>
<span class="lineno"> 258 </span><span class="spaces"> </span><span class="istickedoff">modRender &lt;- unFrame modFn</span>
<span class="lineno"> 259 </span><span class="spaces"> </span><span class="istickedoff">return $ \relD relT -&gt;</span>
<span class="lineno"> 260 </span><span class="spaces"> </span><span class="istickedoff">let absT = relT + born in modRender absT <span class="nottickedoff">relD</span> relT . render <span class="nottickedoff">relD</span> <span class="nottickedoff">relT</span></span>
<span class="lineno"> 261 </span><span class="spaces"> </span><span class="istickedoff">)</span></span>
<span class="lineno"> 262 </span>
<span class="lineno"> 263 </span>-- | Map the SVG output of a sprite.
<span class="lineno"> 264 </span>--
<span class="lineno"> 265 </span>-- Example:
<span class="lineno"> 266 </span>--
<span class="lineno"> 267 </span>-- @
<span class="lineno"> 268 </span>-- do s \&lt;- 'fork' $ 'newSpriteA' 'Reanimate.Builtin.Documentation.drawCircle'
<span class="lineno"> 269 </span>-- 'wait' 1
<span class="lineno"> 270 </span>-- 'spriteMap' s 'flipYAxis'
<span class="lineno"> 271 </span>-- @
<span class="lineno"> 272 </span>--
<span class="lineno"> 273 </span>-- &lt;&lt;docs/gifs/doc_spriteMap.gif&gt;&gt;
<span class="lineno"> 274 </span>spriteMap :: Sprite s -&gt; (SVG -&gt; SVG) -&gt; Scene s ()
<span class="lineno"> 275 </span><span class="decl"><span class="istickedoff">spriteMap sprite@(Sprite born _) fn = do</span>
<span class="lineno"> 276 </span><span class="spaces"> </span><span class="istickedoff">now &lt;- queryNow</span>
<span class="lineno"> 277 </span><span class="spaces"> </span><span class="istickedoff">let tDelta = now - born</span>
<span class="lineno"> 278 </span><span class="spaces"> </span><span class="istickedoff">spriteModify sprite $ do</span>
<span class="lineno"> 279 </span><span class="spaces"> </span><span class="istickedoff">t &lt;- spriteT</span>
<span class="lineno"> 280 </span><span class="spaces"> </span><span class="istickedoff">return $ \(svg, zindex) -&gt; (if (t - tDelta) &lt; 0 then svg else fn svg, zindex)</span></span>
<span class="lineno"> 281 </span>
<span class="lineno"> 282 </span>-- | Modify the output of a sprite between @now@ and @now+duration@.
<span class="lineno"> 283 </span>--
<span class="lineno"> 284 </span>-- Example:
<span class="lineno"> 285 </span>--
<span class="lineno"> 286 </span>-- @
<span class="lineno"> 287 </span>-- do s \&lt;- 'fork' $ 'newSpriteA' 'Reanimate.Builtin.Documentation.drawCircle'
<span class="lineno"> 288 </span>-- 'spriteTween' s 1 $ \\val -&gt; 'translate' ('Reanimate.Constants.screenWidth'*0.3*val) 0
<span class="lineno"> 289 </span>-- @
<span class="lineno"> 290 </span>--
<span class="lineno"> 291 </span>-- &lt;&lt;docs/gifs/doc_spriteTween.gif&gt;&gt;
<span class="lineno"> 292 </span>spriteTween :: Sprite s -&gt; Duration -&gt; (Double -&gt; SVG -&gt; SVG) -&gt; Scene s ()
<span class="lineno"> 293 </span><span class="decl"><span class="istickedoff">spriteTween sprite@(Sprite born _) dur fn = do</span>
<span class="lineno"> 294 </span><span class="spaces"> </span><span class="istickedoff">now &lt;- queryNow</span>
<span class="lineno"> 295 </span><span class="spaces"> </span><span class="istickedoff">let tDelta = now - born</span>
<span class="lineno"> 296 </span><span class="spaces"> </span><span class="istickedoff">spriteModify sprite $ do</span>
<span class="lineno"> 297 </span><span class="spaces"> </span><span class="istickedoff">t &lt;- spriteT</span>
<span class="lineno"> 298 </span><span class="spaces"> </span><span class="istickedoff">return $ first $ \svg -&gt; fn (clamp 0 1 $ (t - tDelta) / dur) svg</span>
<span class="lineno"> 299 </span><span class="spaces"> </span><span class="istickedoff">wait dur</span>
<span class="lineno"> 300 </span><span class="spaces"> </span><span class="istickedoff">where</span>
<span class="lineno"> 301 </span><span class="spaces"> </span><span class="istickedoff">clamp a b v</span>
<span class="lineno"> 302 </span><span class="spaces"> </span><span class="istickedoff">| <span class="tickonlyfalse">v &lt; a</span> = <span class="nottickedoff">a</span></span>
<span class="lineno"> 303 </span><span class="spaces"> </span><span class="istickedoff">| v &gt; b = b</span>
<span class="lineno"> 304 </span><span class="spaces"> </span><span class="istickedoff">| <span class="tickonlytrue">otherwise</span> = v</span></span>
<span class="lineno"> 305 </span>
<span class="lineno"> 306 </span>-- | Create a new variable and apply it to a sprite.
<span class="lineno"> 307 </span>--
<span class="lineno"> 308 </span>-- Example:
<span class="lineno"> 309 </span>--
<span class="lineno"> 310 </span>-- @
<span class="lineno"> 311 </span>-- do s \&lt;- 'fork' $ 'newSpriteA' 'Reanimate.Builtin.Documentation.drawBox'
<span class="lineno"> 312 </span>-- v \&lt;- 'spriteVar' s 0 'rotate'
<span class="lineno"> 313 </span>-- 'tweenVar' v 2 $ \\val -&gt; 'fromToS' val 90
<span class="lineno"> 314 </span>-- @
<span class="lineno"> 315 </span>--
<span class="lineno"> 316 </span>-- &lt;&lt;docs/gifs/doc_spriteVar.gif&gt;&gt;
<span class="lineno"> 317 </span>spriteVar :: Sprite s -&gt; a -&gt; (a -&gt; SVG -&gt; SVG) -&gt; Scene s (Var s a)
<span class="lineno"> 318 </span><span class="decl"><span class="istickedoff">spriteVar sprite def fn = do</span>
<span class="lineno"> 319 </span><span class="spaces"> </span><span class="istickedoff">v &lt;- newVar def</span>
<span class="lineno"> 320 </span><span class="spaces"> </span><span class="istickedoff">applyVar v sprite fn</span>
<span class="lineno"> 321 </span><span class="spaces"> </span><span class="istickedoff">return v</span></span>
<span class="lineno"> 322 </span>
<span class="lineno"> 323 </span>-- | Apply an effect to a sprite.
<span class="lineno"> 324 </span>--
<span class="lineno"> 325 </span>-- Example:
<span class="lineno"> 326 </span>--
<span class="lineno"> 327 </span>-- @
<span class="lineno"> 328 </span>-- do s &lt;- 'fork' $ 'newSpriteA' 'Reanimate.Builtin.Documentation.drawCircle'
<span class="lineno"> 329 </span>-- 'spriteE' s $ 'overBeginning' 1 'fadeInE'
<span class="lineno"> 330 </span>-- 'spriteE' s $ 'overEnding' 0.5 'fadeOutE'
<span class="lineno"> 331 </span>-- @
<span class="lineno"> 332 </span>--
<span class="lineno"> 333 </span>-- &lt;&lt;docs/gifs/doc_spriteE.gif&gt;&gt;
<span class="lineno"> 334 </span>spriteE :: Sprite s -&gt; Effect -&gt; Scene s ()
<span class="lineno"> 335 </span><span class="decl"><span class="istickedoff">spriteE (Sprite born ref) effect = do</span>
<span class="lineno"> 336 </span><span class="spaces"> </span><span class="istickedoff">now &lt;- queryNow</span>
<span class="lineno"> 337 </span><span class="spaces"> </span><span class="istickedoff">liftST $</span>
<span class="lineno"> 338 </span><span class="spaces"> </span><span class="istickedoff">modifySTRef ref $ \(ttl, renderGen) -&gt;</span>
<span class="lineno"> 339 </span><span class="spaces"> </span><span class="istickedoff">( ttl,</span>
<span class="lineno"> 340 </span><span class="spaces"> </span><span class="istickedoff">do</span>
<span class="lineno"> 341 </span><span class="spaces"> </span><span class="istickedoff">render &lt;- renderGen</span>
<span class="lineno"> 342 </span><span class="spaces"> </span><span class="istickedoff">return $ \d t svg -&gt;</span>
<span class="lineno"> 343 </span><span class="spaces"> </span><span class="istickedoff">let (svg', z) = render d t svg</span>
<span class="lineno"> 344 </span><span class="spaces"> </span><span class="istickedoff">in (delayE (max 0 $ now - born) effect d t svg', z)</span>
<span class="lineno"> 345 </span><span class="spaces"> </span><span class="istickedoff">)</span></span>
<span class="lineno"> 346 </span>
<span class="lineno"> 347 </span>-- | Set new ZIndex of a sprite.
<span class="lineno"> 348 </span>--
<span class="lineno"> 349 </span>-- Example:
<span class="lineno"> 350 </span>--
<span class="lineno"> 351 </span>-- @
<span class="lineno"> 352 </span>-- do s1 \&lt;- 'newSpriteSVG' $ 'withFillOpacity' 1 $ 'withFillColor' &quot;blue&quot; $ 'mkCircle' 3
<span class="lineno"> 353 </span>-- 'newSpriteSVG' $ 'withFillOpacity' 1 $ 'withFillColor' &quot;red&quot; $ 'mkRect' 8 3
<span class="lineno"> 354 </span>-- 'wait' 1
<span class="lineno"> 355 </span>-- 'spriteZ' s1 1
<span class="lineno"> 356 </span>-- 'wait' 1
<span class="lineno"> 357 </span>-- @
<span class="lineno"> 358 </span>--
<span class="lineno"> 359 </span>-- &lt;&lt;docs/gifs/doc_spriteZ.gif&gt;&gt;
<span class="lineno"> 360 </span>spriteZ :: Sprite s -&gt; ZIndex -&gt; Scene s ()
<span class="lineno"> 361 </span><span class="decl"><span class="istickedoff">spriteZ (Sprite born ref) zindex = do</span>
<span class="lineno"> 362 </span><span class="spaces"> </span><span class="istickedoff">now &lt;- queryNow</span>
<span class="lineno"> 363 </span><span class="spaces"> </span><span class="istickedoff">liftST $</span>
<span class="lineno"> 364 </span><span class="spaces"> </span><span class="istickedoff">modifySTRef ref $ \(ttl, renderGen) -&gt;</span>
<span class="lineno"> 365 </span><span class="spaces"> </span><span class="istickedoff">( ttl,</span>
<span class="lineno"> 366 </span><span class="spaces"> </span><span class="istickedoff">do</span>
<span class="lineno"> 367 </span><span class="spaces"> </span><span class="istickedoff">render &lt;- renderGen</span>
<span class="lineno"> 368 </span><span class="spaces"> </span><span class="istickedoff">return $ \d t svg -&gt;</span>
<span class="lineno"> 369 </span><span class="spaces"> </span><span class="istickedoff">let (svg', z) = render <span class="nottickedoff">d</span> <span class="nottickedoff">t</span> svg in (svg', if t &lt; now - born then z else zindex)</span>
<span class="lineno"> 370 </span><span class="spaces"> </span><span class="istickedoff">)</span></span>
<span class="lineno"> 371 </span>
<span class="lineno"> 372 </span>-- | Destroy all local sprites at the end of a scene.
<span class="lineno"> 373 </span>--
<span class="lineno"> 374 </span>-- Example:
<span class="lineno"> 375 </span>--
<span class="lineno"> 376 </span>-- @
<span class="lineno"> 377 </span>-- do -- the rect lives through the entire 3s animation
<span class="lineno"> 378 </span>-- 'newSpriteSVG_' $ 'translate' (-3) 0 $ 'mkRect' 4 4
<span class="lineno"> 379 </span>-- 'wait' 1
<span class="lineno"> 380 </span>-- 'spriteScope' $ do
<span class="lineno"> 381 </span>-- -- the circle only lives for 1 second.
<span class="lineno"> 382 </span>-- local \&lt;- 'newSpriteSVG' $ 'translate' 3 0 $ 'mkCircle' 2
<span class="lineno"> 383 </span>-- 'spriteE' local $ 'overBeginning' 0.3 'fadeInE'
<span class="lineno"> 384 </span>-- 'spriteE' local $ 'overEnding' 0.3 'fadeOutE'
<span class="lineno"> 385 </span>-- 'wait' 1
<span class="lineno"> 386 </span>-- 'wait' 1
<span class="lineno"> 387 </span>-- @
<span class="lineno"> 388 </span>--
<span class="lineno"> 389 </span>-- &lt;&lt;docs/gifs/doc_spriteScope.gif&gt;&gt;
<span class="lineno"> 390 </span>spriteScope :: Scene s a -&gt; Scene s a
<span class="lineno"> 391 </span><span class="decl"><span class="nottickedoff">spriteScope (M action) = M $ \t -&gt; do</span>
<span class="lineno"> 392 </span><span class="spaces"> </span><span class="nottickedoff">(a, s, p, gens) &lt;- action t</span>
<span class="lineno"> 393 </span><span class="spaces"> </span><span class="nottickedoff">return (a, s, p, map (genFn (t + max s p)) gens)</span>
<span class="lineno"> 394 </span><span class="spaces"> </span><span class="nottickedoff">where</span>
<span class="lineno"> 395 </span><span class="spaces"> </span><span class="nottickedoff">genFn maxT gen = do</span>
<span class="lineno"> 396 </span><span class="spaces"> </span><span class="nottickedoff">frameGen &lt;- gen</span>
<span class="lineno"> 397 </span><span class="spaces"> </span><span class="nottickedoff">return $ \_ t -&gt;</span>
<span class="lineno"> 398 </span><span class="spaces"> </span><span class="nottickedoff">if t &lt; maxT</span>
<span class="lineno"> 399 </span><span class="spaces"> </span><span class="nottickedoff">then frameGen maxT t</span>
<span class="lineno"> 400 </span><span class="spaces"> </span><span class="nottickedoff">else (None, 0)</span></span>
<span class="lineno"> 401 </span>
<span class="lineno"> 402 </span>asAnimation :: (forall s'. Scene s' a) -&gt; Scene s Animation
<span class="lineno"> 403 </span><span class="decl"><span class="nottickedoff">asAnimation s = do</span>
<span class="lineno"> 404 </span><span class="spaces"> </span><span class="nottickedoff">now &lt;- queryNow</span>
<span class="lineno"> 405 </span><span class="spaces"> </span><span class="nottickedoff">return $ dropA now (sceneAnimation (wait now &gt;&gt; s))</span></span>
<span class="lineno"> 406 </span>
<span class="lineno"> 407 </span>-- | Apply a transformation with a given overlap. This makes sure
<span class="lineno"> 408 </span>-- to keep timestamps intact such that events can still be timed
<span class="lineno"> 409 </span>-- by transcripts.
<span class="lineno"> 410 </span>transitionO :: Transition -&gt; Double -&gt; (forall s'. Scene s' a) -&gt; (forall s'. Scene s' b) -&gt; Scene s ()
<span class="lineno"> 411 </span><span class="decl"><span class="nottickedoff">transitionO t o a b = do</span>
<span class="lineno"> 412 </span><span class="spaces"> </span><span class="nottickedoff">aA &lt;- asAnimation a</span>
<span class="lineno"> 413 </span><span class="spaces"> </span><span class="nottickedoff">bA &lt;- fork $ do</span>
<span class="lineno"> 414 </span><span class="spaces"> </span><span class="nottickedoff">wait (duration aA - o)</span>
<span class="lineno"> 415 </span><span class="spaces"> </span><span class="nottickedoff">asAnimation b</span>
<span class="lineno"> 416 </span><span class="spaces"> </span><span class="nottickedoff">play $ overlapT o t aA bA</span></span>
</pre>
</body>
</html>

View file

@ -0,0 +1,193 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<style type="text/css">
span.lineno { color: white; background: #aaaaaa; border-right: solid white 12px }
span.nottickedoff { background: yellow}
span.istickedoff { background: white }
span.tickonlyfalse { margin: -1px; border: 1px solid #f20913; background: #f20913 }
span.tickonlytrue { margin: -1px; border: 1px solid #60de51; background: #60de51 }
span.funcount { font-size: small; color: orange; z-index: 2; position: absolute; right: 20 }
span.decl { font-weight: bold }
span.spaces { background: white }
</style>
</head>
<body>
<pre>
<span class="decl"><span class="nottickedoff">never executed</span> <span class="tickonlytrue">always true</span> <span class="tickonlyfalse">always false</span></span>
</pre>
<pre>
<span class="lineno"> 1 </span>{-# LANGUAGE LambdaCase #-}
<span class="lineno"> 2 </span>{-# LANGUAGE RecordWildCards #-}
<span class="lineno"> 3 </span>
<span class="lineno"> 4 </span>module Reanimate.Scene.Var where
<span class="lineno"> 5 </span>
<span class="lineno"> 6 </span>import Control.Monad.ST (ST)
<span class="lineno"> 7 </span>import qualified Data.Map as M
<span class="lineno"> 8 </span>import Data.Maybe (fromMaybe)
<span class="lineno"> 9 </span>import Data.STRef
<span class="lineno"> 10 </span>import Reanimate.Animation (Duration, Time)
<span class="lineno"> 11 </span>import Reanimate.Scene.Core (Scene, liftST, queryNow, wait)
<span class="lineno"> 12 </span>
<span class="lineno"> 13 </span>-- | Time dependent variable.
<span class="lineno"> 14 </span>newtype Var s a = Var (STRef s (VarData a))
<span class="lineno"> 15 </span>
<span class="lineno"> 16 </span>-- Note: We must ensure that upon transforming an VarData,
<span class="lineno"> 17 </span>-- 1. evarDefault old == evarDefault new
<span class="lineno"> 18 </span>-- 2. isNothing (evarLastTime old) || isJust (evarLastTime new) i.e. once evarLastValue has a Just value,
<span class="lineno"> 19 </span>-- it shouldn't be Nothing again.
<span class="lineno"> 20 </span>-- 3. isNothing (evarLastTime var) =&gt; M.null (evarTimeline var)
<span class="lineno"> 21 </span>data VarData a = VarData
<span class="lineno"> 22 </span> { <span class="istickedoff"><span class="decl"><span class="istickedoff">evarDefault</span></span></span> :: a,
<span class="lineno"> 23 </span> <span class="istickedoff"><span class="decl"><span class="istickedoff">evarTimeline</span></span></span> :: Timeline a,
<span class="lineno"> 24 </span> <span class="istickedoff"><span class="decl"><span class="istickedoff">evarLastTime</span></span></span> :: Maybe Time,
<span class="lineno"> 25 </span> <span class="istickedoff"><span class="decl"><span class="istickedoff">evarLastValue</span></span></span> :: a
<span class="lineno"> 26 </span> }
<span class="lineno"> 27 </span>
<span class="lineno"> 28 </span>data Modifier a = StaticValue a | TweenValue Duration (a -&gt; Time -&gt; a)
<span class="lineno"> 29 </span>
<span class="lineno"> 30 </span>type Timeline a = M.Map Time (Modifier a)
<span class="lineno"> 31 </span>
<span class="lineno"> 32 </span>-- | Create a new variable with a default value.
<span class="lineno"> 33 </span>-- Variables always have a defined value even if they are read at a timestamp that is
<span class="lineno"> 34 </span>-- earlier than when the variable was created. For example:
<span class="lineno"> 35 </span>--
<span class="lineno"> 36 </span>-- @
<span class="lineno"> 37 </span>-- do v \&lt;- 'fork' ('wait' 10 \&gt;\&gt; 'newVar' 0) -- Create a variable at timestamp '10'.
<span class="lineno"> 38 </span>-- 'readVar' v -- Read the variable at timestamp '0'.
<span class="lineno"> 39 </span>-- -- The value of the variable will be '0'.
<span class="lineno"> 40 </span>-- @
<span class="lineno"> 41 </span>newVar :: a -&gt; Scene s (Var s a)
<span class="lineno"> 42 </span><span class="decl"><span class="istickedoff">newVar def = Var &lt;$&gt; liftST (newSTRef $ VarData def M.empty Nothing <span class="nottickedoff">def</span>)</span></span>
<span class="lineno"> 43 </span>
<span class="lineno"> 44 </span>-- | Read the value of a variable at the current timestamp.
<span class="lineno"> 45 </span>readVar :: Var s a -&gt; Scene s a
<span class="lineno"> 46 </span><span class="decl"><span class="istickedoff">readVar (Var ref) = readVarData &lt;$&gt; liftST (readSTRef ref) &lt;*&gt; queryNow</span></span>
<span class="lineno"> 47 </span>
<span class="lineno"> 48 </span>unpackVar :: Var s a -&gt; ST s (Time -&gt; a)
<span class="lineno"> 49 </span><span class="decl"><span class="istickedoff">unpackVar (Var ref) = readVarData &lt;$&gt; readSTRef ref</span></span>
<span class="lineno"> 50 </span>
<span class="lineno"> 51 </span>-- | Write the value of a variable at the current timestamp.
<span class="lineno"> 52 </span>--
<span class="lineno"> 53 </span>-- Example:
<span class="lineno"> 54 </span>--
<span class="lineno"> 55 </span>-- @
<span class="lineno"> 56 </span>-- do v \&lt;- 'newVar' 0
<span class="lineno"> 57 </span>-- 'newSprite' $ 'mkCircle' \&lt;$\&gt; 'unVar' v
<span class="lineno"> 58 </span>-- 'writeVar' v 1; 'wait' 1
<span class="lineno"> 59 </span>-- 'writeVar' v 2; 'wait' 1
<span class="lineno"> 60 </span>-- 'writeVar' v 3; 'wait' 1
<span class="lineno"> 61 </span>-- @
<span class="lineno"> 62 </span>--
<span class="lineno"> 63 </span>-- &lt;&lt;docs/gifs/doc_writeVar.gif&gt;&gt;
<span class="lineno"> 64 </span>writeVar :: Var s a -&gt; a -&gt; Scene s ()
<span class="lineno"> 65 </span><span class="decl"><span class="istickedoff">writeVar (Var ref) val = do</span>
<span class="lineno"> 66 </span><span class="spaces"> </span><span class="istickedoff">now &lt;- queryNow</span>
<span class="lineno"> 67 </span><span class="spaces"> </span><span class="istickedoff">liftST $ modifySTRef ref $ writeVarData now val</span></span>
<span class="lineno"> 68 </span>
<span class="lineno"> 69 </span>-- | Modify the value of a variable at the current timestamp and all future timestamps.
<span class="lineno"> 70 </span>modifyVar :: Var s a -&gt; (a -&gt; a) -&gt; Scene s ()
<span class="lineno"> 71 </span><span class="decl"><span class="nottickedoff">modifyVar (Var ref) fn = do</span>
<span class="lineno"> 72 </span><span class="spaces"> </span><span class="nottickedoff">now &lt;- queryNow</span>
<span class="lineno"> 73 </span><span class="spaces"> </span><span class="nottickedoff">liftST $ modifySTRef ref $ modifyVarData now fn</span></span>
<span class="lineno"> 74 </span>
<span class="lineno"> 75 </span>-- | Modify a variable between @now@ and @now+duration@.
<span class="lineno"> 76 </span>tweenVar :: Var s a -&gt; Duration -&gt; (a -&gt; Time -&gt; a) -&gt; Scene s ()
<span class="lineno"> 77 </span><span class="decl"><span class="istickedoff">tweenVar _ dur _ | <span class="tickonlyfalse">dur &lt; 0</span> = <span class="nottickedoff">error &quot;Reanimate.tweenVar: durations must be non-negative&quot;</span></span>
<span class="lineno"> 78 </span><span class="spaces"></span><span class="istickedoff">tweenVar (Var ref) dur fn = do</span>
<span class="lineno"> 79 </span><span class="spaces"> </span><span class="istickedoff">now &lt;- queryNow</span>
<span class="lineno"> 80 </span><span class="spaces"> </span><span class="istickedoff">liftST $ modifySTRef ref $ tweenVarData now dur fn</span>
<span class="lineno"> 81 </span><span class="spaces"> </span><span class="istickedoff">wait dur</span></span>
<span class="lineno"> 82 </span>
<span class="lineno"> 83 </span>readVarData :: VarData a -&gt; Time -&gt; a
<span class="lineno"> 84 </span><span class="decl"><span class="istickedoff">readVarData (VarData def _ Nothing _) _ = def</span>
<span class="lineno"> 85 </span><span class="spaces"></span><span class="istickedoff">readVarData (VarData def timeline (Just lastTime) lastValue) now</span>
<span class="lineno"> 86 </span><span class="spaces"> </span><span class="istickedoff">| now &lt; lastTime = lookupTimeline timeline def now</span>
<span class="lineno"> 87 </span><span class="spaces"> </span><span class="istickedoff">| <span class="tickonlytrue">otherwise</span> = lastValue</span></span>
<span class="lineno"> 88 </span>
<span class="lineno"> 89 </span>lookupTimeline :: Timeline a -&gt; a -&gt; Time -&gt; a
<span class="lineno"> 90 </span><span class="decl"><span class="istickedoff">lookupTimeline timeline def now = case M.lookupLE now timeline of</span>
<span class="lineno"> 91 </span><span class="spaces"> </span><span class="istickedoff">Just (_, StaticValue sVal) -&gt; sVal</span>
<span class="lineno"> 92 </span><span class="spaces"> </span><span class="istickedoff">Just (t, TweenValue dur f)</span>
<span class="lineno"> 93 </span><span class="spaces"> </span><span class="istickedoff">| <span class="tickonlytrue">t + dur &gt; now</span> -&gt; f <span class="nottickedoff">def</span> now</span>
<span class="lineno"> 94 </span><span class="spaces"> </span><span class="istickedoff">_ -&gt; def</span></span>
<span class="lineno"> 95 </span>
<span class="lineno"> 96 </span>writeVarData :: Time -&gt; a -&gt; VarData a -&gt; VarData a
<span class="lineno"> 97 </span><span class="decl"><span class="istickedoff">writeVarData now x var =</span>
<span class="lineno"> 98 </span><span class="spaces"> </span><span class="istickedoff">let before = keepBefore now var</span>
<span class="lineno"> 99 </span><span class="spaces"> </span><span class="istickedoff">after = VarData (evarDefault var) M.empty (Just now) x</span>
<span class="lineno"> 100 </span><span class="spaces"> </span><span class="istickedoff">in after `elseVar` before</span></span>
<span class="lineno"> 101 </span>
<span class="lineno"> 102 </span>modifyVarData :: Time -&gt; (a -&gt; a) -&gt; VarData a -&gt; VarData a
<span class="lineno"> 103 </span><span class="decl"><span class="nottickedoff">modifyVarData now fn var =</span>
<span class="lineno"> 104 </span><span class="spaces"> </span><span class="nottickedoff">let before = keepBefore now var</span>
<span class="lineno"> 105 </span><span class="spaces"> </span><span class="nottickedoff">after = keepFrom now var</span>
<span class="lineno"> 106 </span><span class="spaces"> </span><span class="nottickedoff">timeline = flip M.map (evarTimeline after) $ \case</span>
<span class="lineno"> 107 </span><span class="spaces"> </span><span class="nottickedoff">StaticValue s -&gt; StaticValue $ fn s</span>
<span class="lineno"> 108 </span><span class="spaces"> </span><span class="nottickedoff">TweenValue dur f -&gt; TweenValue dur $ \a t -&gt; fn (f a t)</span>
<span class="lineno"> 109 </span><span class="spaces"> </span><span class="nottickedoff">in after {evarTimeline = timeline, evarLastValue = fn $ evarLastValue after} `elseVar` before</span></span>
<span class="lineno"> 110 </span>
<span class="lineno"> 111 </span>-- Note: The function passed here takes time on the scale 0 to 1
<span class="lineno"> 112 </span>-- while the function in `TweenValue` takes time on an absolute scale.
<span class="lineno"> 113 </span>tweenVarData :: Time -&gt; Duration -&gt; (a -&gt; Time -&gt; a) -&gt; VarData a -&gt; VarData a
<span class="lineno"> 114 </span><span class="decl"><span class="istickedoff">tweenVarData st dur fn var@VarData {..} =</span>
<span class="lineno"> 115 </span><span class="spaces"> </span><span class="istickedoff">let nd = st + dur</span>
<span class="lineno"> 116 </span><span class="spaces"> </span><span class="istickedoff">before = keepBefore st var</span>
<span class="lineno"> 117 </span><span class="spaces"> </span><span class="istickedoff">during = keepInRange (Just st) (Just nd) var</span>
<span class="lineno"> 118 </span><span class="spaces"> </span><span class="istickedoff">tweenFn a t =</span>
<span class="lineno"> 119 </span><span class="spaces"> </span><span class="istickedoff">let idx = (t - st) / dur</span>
<span class="lineno"> 120 </span><span class="spaces"> </span><span class="istickedoff">idx' = if <span class="tickonlyfalse">isNaN idx</span> then <span class="nottickedoff">1</span> else idx</span>
<span class="lineno"> 121 </span><span class="spaces"> </span><span class="istickedoff">in fn (readVarData (during {evarDefault = <span class="nottickedoff">a</span>}) t) idx'</span>
<span class="lineno"> 122 </span><span class="spaces"> </span><span class="istickedoff">valueTweenEnd = tweenFn <span class="nottickedoff">evarDefault</span> nd -- we'll never use the def here, replace with error?</span>
<span class="lineno"> 123 </span><span class="spaces"> </span><span class="istickedoff">after = VarData evarDefault (M.singleton st $ TweenValue dur tweenFn) (Just nd) valueTweenEnd</span>
<span class="lineno"> 124 </span><span class="spaces"> </span><span class="istickedoff">in after `elseVar` before</span></span>
<span class="lineno"> 125 </span>
<span class="lineno"> 126 </span>-- Returns the union of two vars such that we use the second var if first var doesn't have a value.
<span class="lineno"> 127 </span>-- Assumes both vars have same default value.
<span class="lineno"> 128 </span>elseVar :: VarData a -&gt; VarData a -&gt; VarData a
<span class="lineno"> 129 </span><span class="decl"><span class="istickedoff">elseVar var1 var2</span>
<span class="lineno"> 130 </span><span class="spaces"> </span><span class="istickedoff">| Just t &lt;- evarLastTime var1 =</span>
<span class="lineno"> 131 </span><span class="spaces"> </span><span class="istickedoff">let afterTimeline = evarTimeline var1</span>
<span class="lineno"> 132 </span><span class="spaces"> </span><span class="istickedoff">joinAt = fromMaybe t . fmap fst $ M.lookupMin afterTimeline</span>
<span class="lineno"> 133 </span><span class="spaces"> </span><span class="istickedoff">beforeTimeline = case keepBefore joinAt var2 of</span>
<span class="lineno"> 134 </span><span class="spaces"> </span><span class="istickedoff">x</span>
<span class="lineno"> 135 </span><span class="spaces"> </span><span class="istickedoff">| Just lastTime &lt;- evarLastTime x, lastTime &lt; joinAt -&gt; M.insert lastTime (StaticValue $ evarLastValue x) $ evarTimeline x</span>
<span class="lineno"> 136 </span><span class="spaces"> </span><span class="istickedoff">| <span class="tickonlytrue">otherwise</span> -&gt; evarTimeline x</span>
<span class="lineno"> 137 </span><span class="spaces"> </span><span class="istickedoff">in var1 {evarTimeline = M.union afterTimeline beforeTimeline}</span>
<span class="lineno"> 138 </span><span class="spaces"> </span><span class="istickedoff">| <span class="nottickedoff">otherwise</span> = <span class="nottickedoff">var2</span></span></span>
<span class="lineno"> 139 </span>
<span class="lineno"> 140 </span>-- Restrict a var to a given time interval.
<span class="lineno"> 141 </span>keepInRange :: Maybe Time -&gt; Maybe Time -&gt; VarData a -&gt; VarData a
<span class="lineno"> 142 </span><span class="decl"><span class="istickedoff">keepInRange st nd = fromMaybe <span class="nottickedoff">id</span> (keepFrom &lt;$&gt; st) . fromMaybe <span class="nottickedoff">id</span> (keepBefore &lt;$&gt; nd)</span></span>
<span class="lineno"> 143 </span>
<span class="lineno"> 144 </span>-- Restrict a var to start at given timestamp.
<span class="lineno"> 145 </span>keepFrom :: Time -&gt; VarData a -&gt; VarData a
<span class="lineno"> 146 </span><span class="decl"><span class="istickedoff">keepFrom st VarData {..} =</span>
<span class="lineno"> 147 </span><span class="spaces"> </span><span class="istickedoff">let <span class="nottickedoff">timeline' = M.dropWhileAntitone (&lt; st) evarTimeline</span></span>
<span class="lineno"> 148 </span><span class="spaces"> </span><span class="istickedoff">-- if there is no modifier in timeline starting at st,</span>
<span class="lineno"> 149 </span><span class="spaces"> </span><span class="istickedoff">-- we must get the modifier that starts before and truncate it to start at st.</span>
<span class="lineno"> 150 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">timeline'' = case M.lookupLE st evarTimeline of</span></span>
<span class="lineno"> 151 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">Just (t, val@(StaticValue _))</span></span>
<span class="lineno"> 152 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">| t &lt; st -&gt; M.insert st val timeline'</span></span>
<span class="lineno"> 153 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">Just (t, TweenValue dur fn)</span></span>
<span class="lineno"> 154 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">| t &lt; st, t + dur &gt; st -&gt; M.insert st (TweenValue (t + dur - st) fn) timeline'</span></span>
<span class="lineno"> 155 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">_ -&gt; timeline'</span></span>
<span class="lineno"> 156 </span><span class="spaces"> </span><span class="istickedoff">in VarData <span class="nottickedoff">evarDefault</span> <span class="nottickedoff">timeline''</span> (max evarLastTime $ Just st) evarLastValue</span></span>
<span class="lineno"> 157 </span>
<span class="lineno"> 158 </span>-- Restrict a var to end(clamp) at given timestamp.
<span class="lineno"> 159 </span>keepBefore :: Time -&gt; VarData a -&gt; VarData a
<span class="lineno"> 160 </span><span class="decl"><span class="istickedoff">keepBefore nd var@VarData {..} =</span>
<span class="lineno"> 161 </span><span class="spaces"> </span><span class="istickedoff">let timeline' = M.takeWhileAntitone (&lt; nd) evarTimeline</span>
<span class="lineno"> 162 </span><span class="spaces"> </span><span class="istickedoff">lastModifier = M.lookupMax timeline'</span>
<span class="lineno"> 163 </span><span class="spaces"> </span><span class="istickedoff">timeline'' = case lastModifier of</span>
<span class="lineno"> 164 </span><span class="spaces"> </span><span class="istickedoff">Just (t, TweenValue dur fn)</span>
<span class="lineno"> 165 </span><span class="spaces"> </span><span class="istickedoff">| <span class="tickonlyfalse">t + dur &gt; nd</span> -&gt; <span class="nottickedoff">M.insert t (TweenValue (nd - t) fn) timeline'</span></span>
<span class="lineno"> 166 </span><span class="spaces"> </span><span class="istickedoff">_ -&gt; timeline'</span>
<span class="lineno"> 167 </span><span class="spaces"> </span><span class="istickedoff">lastTime = case lastModifier of</span>
<span class="lineno"> 168 </span><span class="spaces"> </span><span class="istickedoff">Just (t, TweenValue dur _) -&gt; Just $ min nd (t + dur)</span>
<span class="lineno"> 169 </span><span class="spaces"> </span><span class="istickedoff">_ -&gt; min nd &lt;$&gt; evarLastTime</span>
<span class="lineno"> 170 </span><span class="spaces"> </span><span class="istickedoff">in VarData <span class="nottickedoff">evarDefault</span> timeline'' lastTime (fromMaybe evarDefault $ fmap (readVarData var) lastTime)</span></span>
</pre>
</body>
</html>