mu/html/081print.mu.html
Kartik Agaram 08a0eed699 4891
Couple more tweaks to html rendering:
a) SubX definitions no longer link redundantly to themselves. This long-standing
issue turns out to be tractable to solve for SubX files since the syntax
is so simple.
b) Fix links to SubX definitions in other directories. I forgot that I
have to always generate tags from the directory of the file being linkified.
c) Fix link colors. Before we lost all syntax highlighting for functions
and Globals. Now they maintain their colors, just add an underline.
2018-12-30 00:02:42 -08:00

980 lines
111 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Mu - 081print.mu</title>
<meta name="Generator" content="Vim/8.0">
<meta name="plugin-version" content="vim7.4_v2">
<meta name="syntax" content="none">
<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
<meta name="colorscheme" content="minimal-light">
<style type="text/css">
<!--
pre { white-space: pre-wrap; font-family: monospace; color: #000000; background-color: #c6c6c6; }
body { font-size:12pt; font-family: monospace; color: #000000; background-color: #c6c6c6; }
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.CommentedCode { color: #8a8a8a; }
.muControl { color: #804000; }
.muRecipe { color: #ff8700; }
.muScenario { color: #00af00; }
.LineNr { }
.muData { color: #ffff00; }
.Delimiter { color: #c000c0; }
.Constant { color: #008787; }
.Special { color: #ff6060; }
.Comment { color: #005faf; }
-->
</style>
<script type='text/javascript'>
<!--
/* function to open any folds containing a jumped-to line before jumping to it */
function JumpToLine()
{
var lineNum;
lineNum = window.location.hash;
lineNum = lineNum.substr(1); /* strip off '#' */
if (lineNum.indexOf('L') == -1) {
lineNum = 'L'+lineNum;
}
lineElem = document.getElementById(lineNum);
/* Always jump to new location even if the line was hidden inside a fold, or
* we corrected the raw number to a line ID.
*/
if (lineElem) {
lineElem.scrollIntoView(true);
}
return true;
}
if ('onhashchange' in window) {
window.onhashchange = JumpToLine;
}
-->
</script>
</head>
<body onload='JumpToLine();'>
<a href='https://github.com/akkartik/mu/blob/master/081print.mu'>https://github.com/akkartik/mu/blob/master/081print.mu</a>
<pre id='vimCodeElement'>
<span id="L1" class="LineNr"> 1 </span><span class="Comment"># Wrappers around print primitives that take a 'screen' object and are thus</span>
<span id="L2" class="LineNr"> 2 </span><span class="Comment"># easier to test.</span>
<span id="L3" class="LineNr"> 3 </span><span class="Comment">#</span>
<span id="L4" class="LineNr"> 4 </span><span class="Comment"># Screen objects are intended to exactly mimic the behavior of traditional</span>
<span id="L5" class="LineNr"> 5 </span><span class="Comment"># terminals. Moving a cursor too far right wraps it to the next line,</span>
<span id="L6" class="LineNr"> 6 </span><span class="Comment"># scrolling if necessary. The details are subtle:</span>
<span id="L7" class="LineNr"> 7 </span><span class="Comment">#</span>
<span id="L8" class="LineNr"> 8 </span><span class="Comment"># a) Rows can take unbounded values. When printing, large values for the row</span>
<span id="L9" class="LineNr"> 9 </span><span class="Comment"># saturate to the bottom row (because scrolling).</span>
<span id="L10" class="LineNr"> 10 </span><span class="Comment">#</span>
<span id="L11" class="LineNr"> 11 </span><span class="Comment"># b) If you print to a square (row, right) on the right margin, the cursor</span>
<span id="L12" class="LineNr"> 12 </span><span class="Comment"># position depends on whether 'row' is in range. If it is, the new cursor</span>
<span id="L13" class="LineNr"> 13 </span><span class="Comment"># position is (row+1, 0). If it isn't, the new cursor position is (row, 0).</span>
<span id="L14" class="LineNr"> 14 </span><span class="Comment"># Because scrolling.</span>
<span id="L15" class="LineNr"> 15 </span>
<span id="L16" class="LineNr"> 16 </span><span class="muData">container</span> <a href='081print.mu.html#L16'>screen</a> [
<span id="L17" class="LineNr"> 17 </span> num-rows:num
<span id="L18" class="LineNr"> 18 </span> num-columns:num
<span id="L19" class="LineNr"> 19 </span> cursor-row:num
<span id="L20" class="LineNr"> 20 </span> cursor-column:num
<span id="L21" class="LineNr"> 21 </span> data:&amp;:@:<a href='081print.mu.html#L27'>screen-cell</a> <span class="Comment"># capacity num-rows*num-columns</span>
<span id="L22" class="LineNr"> 22 </span> pending-scroll?:bool
<span id="L23" class="LineNr"> 23 </span> top-idx:num <span class="Comment"># index inside data that corresponds to top-left of screen</span>
<span id="L24" class="LineNr"> 24 </span> <span class="Comment"># modified on scroll, wrapping around to the top of data</span>
<span id="L25" class="LineNr"> 25 </span>]
<span id="L26" class="LineNr"> 26 </span>
<span id="L27" class="LineNr"> 27 </span><span class="muData">container</span> <a href='081print.mu.html#L27'>screen-cell</a> [
<span id="L28" class="LineNr"> 28 </span> contents:char
<span id="L29" class="LineNr"> 29 </span> color:num
<span id="L30" class="LineNr"> 30 </span>]
<span id="L31" class="LineNr"> 31 </span>
<span id="L32" class="LineNr"> 32 </span><span class="muRecipe">def</span> <a href='081print.mu.html#L32'>new-fake-screen</a> w:num, h:num<span class="muRecipe"> -&gt; </span>result:&amp;:<a href='081print.mu.html#L16'>screen</a> [
<span id="L33" class="LineNr"> 33 </span> <span class="Constant">local-scope</span>
<span id="L34" class="LineNr"> 34 </span> <span class="Constant">load-inputs</span>
<span id="L35" class="LineNr"> 35 </span> result <span class="Special">&lt;-</span> new <span class="Constant"><a href='081print.mu.html#L16'>screen</a>:type</span>
<span id="L36" class="LineNr"> 36 </span> non-zero-width?:bool <span class="Special">&lt;-</span> greater-than w,<span class="Constant"> 0</span>
<span id="L37" class="LineNr"> 37 </span> assert non-zero-width?, <span class="Constant">[screen can't have zero width]</span>
<span id="L38" class="LineNr"> 38 </span> non-zero-height?:bool <span class="Special">&lt;-</span> greater-than h,<span class="Constant"> 0</span>
<span id="L39" class="LineNr"> 39 </span> assert non-zero-height?, <span class="Constant">[screen can't have zero height]</span>
<span id="L40" class="LineNr"> 40 </span> bufsize:num <span class="Special">&lt;-</span> multiply w, h
<span id="L41" class="LineNr"> 41 </span> data:&amp;:@:<a href='081print.mu.html#L27'>screen-cell</a> <span class="Special">&lt;-</span> new <span class="Constant"><a href='081print.mu.html#L27'>screen-cell</a>:type</span>, bufsize
<span id="L42" class="LineNr"> 42 </span> *result <span class="Special">&lt;-</span> merge h/num-rows, w/num-columns, <span class="Constant">0/cursor-row</span>, <span class="Constant">0/cursor-column</span>, data,<span class="Constant"> false/pending-scroll?,</span> <span class="Constant">0/top-idx</span>
<span id="L43" class="LineNr"> 43 </span> result <span class="Special">&lt;-</span> <a href='081print.mu.html#L46'>clear-screen</a> result
<span id="L44" class="LineNr"> 44 </span>]
<span id="L45" class="LineNr"> 45 </span>
<span id="L46" class="LineNr"> 46 </span><span class="muRecipe">def</span> <a href='081print.mu.html#L46'>clear-screen</a> <a href='081print.mu.html#L16'>screen</a>:&amp;:<a href='081print.mu.html#L16'>screen</a><span class="muRecipe"> -&gt; </span><a href='081print.mu.html#L16'>screen</a>:&amp;:<a href='081print.mu.html#L16'>screen</a> [
<span id="L47" class="LineNr"> 47 </span> <span class="Constant">local-scope</span>
<span id="L48" class="LineNr"> 48 </span> <span class="Constant">load-inputs</span>
<span id="L49" class="LineNr"> 49 </span><span class="CommentedCode">#? stash [clear-screen]</span>
<span id="L50" class="LineNr"> 50 </span> <span class="Delimiter">{</span>
<span id="L51" class="LineNr"> 51 </span> <span class="muControl">break-if</span> <a href='081print.mu.html#L16'>screen</a>
<span id="L52" class="LineNr"> 52 </span> <span class="Comment"># real screen</span>
<span id="L53" class="LineNr"> 53 </span> clear-display
<span id="L54" class="LineNr"> 54 </span> <span class="muControl"> return</span>
<span id="L55" class="LineNr"> 55 </span> <span class="Delimiter">}</span>
<span id="L56" class="LineNr"> 56 </span> <span class="Comment"># fake screen</span>
<span id="L57" class="LineNr"> 57 </span> buf:&amp;:@:<a href='081print.mu.html#L27'>screen-cell</a> <span class="Special">&lt;-</span> get *screen, <span class="Constant">data:offset</span>
<span id="L58" class="LineNr"> 58 </span> max:num <span class="Special">&lt;-</span> length *buf
<span id="L59" class="LineNr"> 59 </span> i:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
<span id="L60" class="LineNr"> 60 </span> <span class="Delimiter">{</span>
<span id="L61" class="LineNr"> 61 </span> done?:bool <span class="Special">&lt;-</span> greater-or-equal i, max
<span id="L62" class="LineNr"> 62 </span> <span class="muControl">break-if</span> done?
<span id="L63" class="LineNr"> 63 </span> curr:<a href='081print.mu.html#L27'>screen-cell</a> <span class="Special">&lt;-</span> merge <span class="Constant">0/empty</span>, <span class="Constant">7/white</span>
<span id="L64" class="LineNr"> 64 </span> *buf <span class="Special">&lt;-</span> put-index *buf, i, curr
<span id="L65" class="LineNr"> 65 </span> i <span class="Special">&lt;-</span> add i,<span class="Constant"> 1</span>
<span id="L66" class="LineNr"> 66 </span> <span class="muControl"> loop</span>
<span id="L67" class="LineNr"> 67 </span> <span class="Delimiter">}</span>
<span id="L68" class="LineNr"> 68 </span> <span class="Comment"># reset cursor</span>
<span id="L69" class="LineNr"> 69 </span> *screen <span class="Special">&lt;-</span> put *screen, <span class="Constant">cursor-row:offset</span>,<span class="Constant"> 0</span>
<span id="L70" class="LineNr"> 70 </span> *screen <span class="Special">&lt;-</span> put *screen, <span class="Constant">cursor-column:offset</span>,<span class="Constant"> 0</span>
<span id="L71" class="LineNr"> 71 </span> *screen <span class="Special">&lt;-</span> put *screen, <span class="Constant">top-idx:offset</span>,<span class="Constant"> 0</span>
<span id="L72" class="LineNr"> 72 </span>]
<span id="L73" class="LineNr"> 73 </span>
<span id="L74" class="LineNr"> 74 </span><span class="muRecipe">def</span> <a href='081print.mu.html#L74'>fake-screen-is-empty?</a> <a href='081print.mu.html#L16'>screen</a>:&amp;:<a href='081print.mu.html#L16'>screen</a><span class="muRecipe"> -&gt; </span>result:bool [
<span id="L75" class="LineNr"> 75 </span> <span class="Constant">local-scope</span>
<span id="L76" class="LineNr"> 76 </span> <span class="Constant">load-inputs</span>
<span id="L77" class="LineNr"> 77 </span><span class="CommentedCode">#? stash [fake-screen-is-empty?]</span>
<span id="L78" class="LineNr"> 78 </span> <span class="muControl">return-unless</span> <a href='081print.mu.html#L16'>screen</a>,<span class="Constant"> true</span> <span class="Comment"># do nothing for real screens</span>
<span id="L79" class="LineNr"> 79 </span> buf:&amp;:@:<a href='081print.mu.html#L27'>screen-cell</a> <span class="Special">&lt;-</span> get *screen, <span class="Constant">data:offset</span>
<span id="L80" class="LineNr"> 80 </span> i:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
<span id="L81" class="LineNr"> 81 </span> len:num <span class="Special">&lt;-</span> length *buf
<span id="L82" class="LineNr"> 82 </span> <span class="Delimiter">{</span>
<span id="L83" class="LineNr"> 83 </span> done?:bool <span class="Special">&lt;-</span> greater-or-equal i, len
<span id="L84" class="LineNr"> 84 </span> <span class="muControl">break-if</span> done?
<span id="L85" class="LineNr"> 85 </span> curr:<a href='081print.mu.html#L27'>screen-cell</a> <span class="Special">&lt;-</span> index *buf, i
<span id="L86" class="LineNr"> 86 </span> curr-contents:char <span class="Special">&lt;-</span> get curr, <span class="Constant">contents:offset</span>
<span id="L87" class="LineNr"> 87 </span> i <span class="Special">&lt;-</span> add i,<span class="Constant"> 1</span>
<span id="L88" class="LineNr"> 88 </span> <span class="muControl">loop-unless</span> curr-contents
<span id="L89" class="LineNr"> 89 </span> <span class="Comment"># not 0</span>
<span id="L90" class="LineNr"> 90 </span> <span class="muControl"> return</span><span class="Constant"> false</span>
<span id="L91" class="LineNr"> 91 </span> <span class="Delimiter">}</span>
<span id="L92" class="LineNr"> 92 </span> <span class="muControl"> return</span><span class="Constant"> true</span>
<span id="L93" class="LineNr"> 93 </span>]
<span id="L94" class="LineNr"> 94 </span>
<span id="L95" class="LineNr"> 95 </span><span class="muRecipe">def</span> print <a href='081print.mu.html#L16'>screen</a>:&amp;:<a href='081print.mu.html#L16'>screen</a>, c:char<span class="muRecipe"> -&gt; </span><a href='081print.mu.html#L16'>screen</a>:&amp;:<a href='081print.mu.html#L16'>screen</a> [
<span id="L96" class="LineNr"> 96 </span> <span class="Constant">local-scope</span>
<span id="L97" class="LineNr"> 97 </span> <span class="Constant">load-inputs</span>
<span id="L98" class="LineNr"> 98 </span> color:num, color-found?:bool <span class="Special">&lt;-</span> <span class="Constant">next-input</span>
<span id="L99" class="LineNr"> 99 </span> <span class="Delimiter">{</span>
<span id="L100" class="LineNr">100 </span> <span class="Comment"># default color to white</span>
<span id="L101" class="LineNr">101 </span> <span class="muControl">break-if</span> color-found?
<span id="L102" class="LineNr">102 </span> color <span class="Special">&lt;-</span> copy <span class="Constant">7/white</span>
<span id="L103" class="LineNr">103 </span> <span class="Delimiter">}</span>
<span id="L104" class="LineNr">104 </span> bg-color:num, bg-color-found?:bool <span class="Special">&lt;-</span> <span class="Constant">next-input</span>
<span id="L105" class="LineNr">105 </span> <span class="Delimiter">{</span>
<span id="L106" class="LineNr">106 </span> <span class="Comment"># default bg-color to black</span>
<span id="L107" class="LineNr">107 </span> <span class="muControl">break-if</span> bg-color-found?
<span id="L108" class="LineNr">108 </span> bg-color <span class="Special">&lt;-</span> copy <span class="Constant">0/black</span>
<span id="L109" class="LineNr">109 </span> <span class="Delimiter">}</span>
<span id="L110" class="LineNr">110 </span> c2:num <span class="Special">&lt;-</span> character-to-code c
<span id="L111" class="LineNr">111 </span> trace<span class="Constant"> 90</span>, <span class="Constant">[print-character]</span>, c2
<span id="L112" class="LineNr">112 </span> <span class="Delimiter">{</span>
<span id="L113" class="LineNr">113 </span> <span class="Comment"># real screen</span>
<span id="L114" class="LineNr">114 </span> <span class="muControl">break-if</span> <a href='081print.mu.html#L16'>screen</a>
<span id="L115" class="LineNr">115 </span> print-character-to-display c, color, bg-color
<span id="L116" class="LineNr">116 </span> <span class="muControl"> return</span>
<span id="L117" class="LineNr">117 </span> <span class="Delimiter">}</span>
<span id="L118" class="LineNr">118 </span> <span class="Comment"># fake screen</span>
<span id="L119" class="LineNr">119 </span> <span class="Comment"># (handle special cases exactly like in the real screen)</span>
<span id="L120" class="LineNr">120 </span> width:num <span class="Special">&lt;-</span> get *screen, <span class="Constant">num-columns:offset</span>
<span id="L121" class="LineNr">121 </span> height:num <span class="Special">&lt;-</span> get *screen, <span class="Constant">num-rows:offset</span>
<span id="L122" class="LineNr">122 </span> <a href='075channel.mu.html#L391'>capacity</a>:num <span class="Special">&lt;-</span> multiply width, height
<span id="L123" class="LineNr">123 </span> row:num <span class="Special">&lt;-</span> get *screen, <span class="Constant">cursor-row:offset</span>
<span id="L124" class="LineNr">124 </span> column:num <span class="Special">&lt;-</span> get *screen, <span class="Constant">cursor-column:offset</span>
<span id="L125" class="LineNr">125 </span> buf:&amp;:@:<a href='081print.mu.html#L27'>screen-cell</a> <span class="Special">&lt;-</span> get *screen, <span class="Constant">data:offset</span>
<span id="L126" class="LineNr">126 </span> <span class="Comment"># some potentially slow sanity checks for preconditions {</span>
<span id="L127" class="LineNr">127 </span> <span class="Comment"># eliminate fractions from column and row</span>
<span id="L128" class="LineNr">128 </span> row <span class="Special">&lt;-</span> round row
<span id="L129" class="LineNr">129 </span> column <span class="Special">&lt;-</span> round column
<span id="L130" class="LineNr">130 </span> <span class="Comment"># if cursor is past left margin (error), reset to left margin</span>
<span id="L131" class="LineNr">131 </span> <span class="Delimiter">{</span>
<span id="L132" class="LineNr">132 </span> too-far-left?:bool <span class="Special">&lt;-</span> lesser-than column,<span class="Constant"> 0</span>
<span id="L133" class="LineNr">133 </span> <span class="muControl">break-unless</span> too-far-left?
<span id="L134" class="LineNr">134 </span> column <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
<span id="L135" class="LineNr">135 </span> *screen <span class="Special">&lt;-</span> put *screen, <span class="Constant">cursor-column:offset</span>, column
<span id="L136" class="LineNr">136 </span> <span class="Delimiter">}</span>
<span id="L137" class="LineNr">137 </span> <span class="Comment"># if cursor is at or past right margin, wrap</span>
<span id="L138" class="LineNr">138 </span> <span class="Delimiter">{</span>
<span id="L139" class="LineNr">139 </span> at-right?:bool <span class="Special">&lt;-</span> greater-or-equal column, width
<span id="L140" class="LineNr">140 </span> <span class="muControl">break-unless</span> at-right?
<span id="L141" class="LineNr">141 </span> column <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
<span id="L142" class="LineNr">142 </span> *screen <span class="Special">&lt;-</span> put *screen, <span class="Constant">cursor-column:offset</span>, column
<span id="L143" class="LineNr">143 </span> row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
<span id="L144" class="LineNr">144 </span> *screen <span class="Special">&lt;-</span> put *screen, <span class="Constant">cursor-row:offset</span>, row
<span id="L145" class="LineNr">145 </span> <span class="Delimiter">}</span>
<span id="L146" class="LineNr">146 </span> <span class="Comment"># }</span>
<span id="L147" class="LineNr">147 </span> <span class="Comment"># if there's a pending scroll, perform it</span>
<span id="L148" class="LineNr">148 </span> <span class="Delimiter">{</span>
<span id="L149" class="LineNr">149 </span> pending-scroll?:bool <span class="Special">&lt;-</span> get *screen, <span class="Constant">pending-scroll?:offset</span>
<span id="L150" class="LineNr">150 </span> <span class="muControl">break-unless</span> pending-scroll?
<span id="L151" class="LineNr">151 </span><span class="CommentedCode">#? stash [scroll]</span>
<span id="L152" class="LineNr">152 </span> <a href='081print.mu.html#L225'>scroll-fake-screen</a> <a href='081print.mu.html#L16'>screen</a>
<span id="L153" class="LineNr">153 </span> *screen <span class="Special">&lt;-</span> put *screen, <span class="Constant">pending-scroll?:offset</span>,<span class="Constant"> false</span>
<span id="L154" class="LineNr">154 </span> <span class="Delimiter">}</span>
<span id="L155" class="LineNr">155 </span><span class="CommentedCode">#? $print [print-character (], row, [, ], column, [): ], c, 10/newline</span>
<span id="L156" class="LineNr">156 </span> <span class="Comment"># special-case: newline</span>
<span id="L157" class="LineNr">157 </span> <span class="Delimiter">{</span>
<span id="L158" class="LineNr">158 </span> newline?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">10/newline</span>
<span id="L159" class="LineNr">159 </span> <span class="muControl">break-unless</span> newline?
<span id="L160" class="LineNr">160 </span> <a href='081print.mu.html#L206'>cursor-down-on-fake-screen</a> <a href='081print.mu.html#L16'>screen</a> <span class="Comment"># doesn't modify column</span>
<span id="L161" class="LineNr">161 </span> <span class="muControl"> return</span>
<span id="L162" class="LineNr">162 </span> <span class="Delimiter">}</span>
<span id="L163" class="LineNr">163 </span> <span class="Comment"># special-case: linefeed</span>
<span id="L164" class="LineNr">164 </span> <span class="Delimiter">{</span>
<span id="L165" class="LineNr">165 </span> linefeed?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">13/linefeed</span>
<span id="L166" class="LineNr">166 </span> <span class="muControl">break-unless</span> linefeed?
<span id="L167" class="LineNr">167 </span> *screen <span class="Special">&lt;-</span> put *screen, <span class="Constant">cursor-column:offset</span>,<span class="Constant"> 0</span>
<span id="L168" class="LineNr">168 </span> <span class="muControl"> return</span>
<span id="L169" class="LineNr">169 </span> <span class="Delimiter">}</span>
<span id="L170" class="LineNr">170 </span> <span class="Comment"># special-case: backspace</span>
<span id="L171" class="LineNr">171 </span> <span class="Comment"># moves cursor left but does not erase</span>
<span id="L172" class="LineNr">172 </span> <span class="Delimiter">{</span>
<span id="L173" class="LineNr">173 </span> backspace?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">8/backspace</span>
<span id="L174" class="LineNr">174 </span> <span class="muControl">break-unless</span> backspace?
<span id="L175" class="LineNr">175 </span> <span class="Delimiter">{</span>
<span id="L176" class="LineNr">176 </span> <span class="muControl">break-unless</span> column
<span id="L177" class="LineNr">177 </span> column <span class="Special">&lt;-</span> subtract column,<span class="Constant"> 1</span>
<span id="L178" class="LineNr">178 </span> *screen <span class="Special">&lt;-</span> put *screen, <span class="Constant">cursor-column:offset</span>, column
<span id="L179" class="LineNr">179 </span> <span class="Delimiter">}</span>
<span id="L180" class="LineNr">180 </span> <span class="muControl"> return</span>
<span id="L181" class="LineNr">181 </span> <span class="Delimiter">}</span>
<span id="L182" class="LineNr">182 </span> <span class="Comment"># save character in fake screen</span>
<span id="L183" class="LineNr">183 </span> top-idx:num <span class="Special">&lt;-</span> get *screen, <span class="Constant">top-idx:offset</span>
<span id="L184" class="LineNr">184 </span> index:num <span class="Special">&lt;-</span> <a href='081print.mu.html#L253'>data-index</a> row, column, width, height, top-idx
<span id="L185" class="LineNr">185 </span> cursor:<a href='081print.mu.html#L27'>screen-cell</a> <span class="Special">&lt;-</span> merge c, color
<span id="L186" class="LineNr">186 </span> *buf <span class="Special">&lt;-</span> put-index *buf, index, cursor
<span id="L187" class="LineNr">187 </span> <span class="Comment"># move cursor to next character, wrapping as necessary</span>
<span id="L188" class="LineNr">188 </span> <span class="Comment"># however, don't scroll just yet</span>
<span id="L189" class="LineNr">189 </span> column <span class="Special">&lt;-</span> add column,<span class="Constant"> 1</span>
<span id="L190" class="LineNr">190 </span> <span class="Delimiter">{</span>
<span id="L191" class="LineNr">191 </span> past-right?:bool <span class="Special">&lt;-</span> greater-or-equal column, width
<span id="L192" class="LineNr">192 </span> <span class="muControl">break-unless</span> past-right?
<span id="L193" class="LineNr">193 </span> column <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
<span id="L194" class="LineNr">194 </span> row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
<span id="L195" class="LineNr">195 </span> past-bottom?:bool <span class="Special">&lt;-</span> greater-or-equal row, height
<span id="L196" class="LineNr">196 </span> <span class="muControl">break-unless</span> past-bottom?
<span id="L197" class="LineNr">197 </span> <span class="Comment"># queue up a scroll</span>
<span id="L198" class="LineNr">198 </span><span class="CommentedCode">#? stash [pending scroll]</span>
<span id="L199" class="LineNr">199 </span> *screen <span class="Special">&lt;-</span> put *screen, <span class="Constant">pending-scroll?:offset</span>,<span class="Constant"> true</span>
<span id="L200" class="LineNr">200 </span> row <span class="Special">&lt;-</span> subtract row,<span class="Constant"> 1</span> <span class="Comment"># update cursor as if scroll already happened</span>
<span id="L201" class="LineNr">201 </span> <span class="Delimiter">}</span>
<span id="L202" class="LineNr">202 </span> *screen <span class="Special">&lt;-</span> put *screen, <span class="Constant">cursor-row:offset</span>, row
<span id="L203" class="LineNr">203 </span> *screen <span class="Special">&lt;-</span> put *screen, <span class="Constant">cursor-column:offset</span>, column
<span id="L204" class="LineNr">204 </span>]
<span id="L205" class="LineNr">205 </span>
<span id="L206" class="LineNr">206 </span><span class="muRecipe">def</span> <a href='081print.mu.html#L206'>cursor-down-on-fake-screen</a> <a href='081print.mu.html#L16'>screen</a>:&amp;:<a href='081print.mu.html#L16'>screen</a><span class="muRecipe"> -&gt; </span><a href='081print.mu.html#L16'>screen</a>:&amp;:<a href='081print.mu.html#L16'>screen</a> [
<span id="L207" class="LineNr">207 </span> <span class="Constant">local-scope</span>
<span id="L208" class="LineNr">208 </span> <span class="Constant">load-inputs</span>
<span id="L209" class="LineNr">209 </span><span class="CommentedCode">#? stash [cursor-down]</span>
<span id="L210" class="LineNr">210 </span> row:num <span class="Special">&lt;-</span> get *screen, <span class="Constant">cursor-row:offset</span>
<span id="L211" class="LineNr">211 </span> height:num <span class="Special">&lt;-</span> get *screen, <span class="Constant">num-rows:offset</span>
<span id="L212" class="LineNr">212 </span> bottom:num <span class="Special">&lt;-</span> subtract height,<span class="Constant"> 1</span>
<span id="L213" class="LineNr">213 </span> at-bottom?:bool <span class="Special">&lt;-</span> greater-or-equal row, bottom
<span id="L214" class="LineNr">214 </span> <span class="Delimiter">{</span>
<span id="L215" class="LineNr">215 </span> <span class="muControl">break-if</span> at-bottom?
<span id="L216" class="LineNr">216 </span> row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
<span id="L217" class="LineNr">217 </span> *screen <span class="Special">&lt;-</span> put *screen, <span class="Constant">cursor-row:offset</span>, row
<span id="L218" class="LineNr">218 </span> <span class="Delimiter">}</span>
<span id="L219" class="LineNr">219 </span> <span class="Delimiter">{</span>
<span id="L220" class="LineNr">220 </span> <span class="muControl">break-unless</span> at-bottom?
<span id="L221" class="LineNr">221 </span> <a href='081print.mu.html#L225'>scroll-fake-screen</a> <a href='081print.mu.html#L16'>screen</a> <span class="Comment"># does not modify row</span>
<span id="L222" class="LineNr">222 </span> <span class="Delimiter">}</span>
<span id="L223" class="LineNr">223 </span>]
<span id="L224" class="LineNr">224 </span>
<span id="L225" class="LineNr">225 </span><span class="muRecipe">def</span> <a href='081print.mu.html#L225'>scroll-fake-screen</a> <a href='081print.mu.html#L16'>screen</a>:&amp;:<a href='081print.mu.html#L16'>screen</a><span class="muRecipe"> -&gt; </span><a href='081print.mu.html#L16'>screen</a>:&amp;:<a href='081print.mu.html#L16'>screen</a> [
<span id="L226" class="LineNr">226 </span> <span class="Constant">local-scope</span>
<span id="L227" class="LineNr">227 </span> <span class="Constant">load-inputs</span>
<span id="L228" class="LineNr">228 </span><span class="CommentedCode">#? stash [scroll-fake-screen]</span>
<span id="L229" class="LineNr">229 </span> width:num <span class="Special">&lt;-</span> get *screen, <span class="Constant">num-columns:offset</span>
<span id="L230" class="LineNr">230 </span> height:num <span class="Special">&lt;-</span> get *screen, <span class="Constant">num-rows:offset</span>
<span id="L231" class="LineNr">231 </span> buf:&amp;:@:<a href='081print.mu.html#L27'>screen-cell</a> <span class="Special">&lt;-</span> get *screen, <span class="Constant">data:offset</span>
<span id="L232" class="LineNr">232 </span> <span class="Comment"># clear top line and 'rotate' it to the bottom</span>
<span id="L233" class="LineNr">233 </span> top-idx:num <span class="Special">&lt;-</span> get *screen, <span class="Constant">top-idx:offset</span> <span class="Comment"># 0 &lt;= top-idx &lt; len(buf)</span>
<span id="L234" class="LineNr">234 </span> next-top-idx:num <span class="Special">&lt;-</span> add top-idx, width <span class="Comment"># 0 &lt;= next-top-idx &lt;= len(buf)</span>
<span id="L235" class="LineNr">235 </span> empty-cell:<a href='081print.mu.html#L27'>screen-cell</a> <span class="Special">&lt;-</span> merge <span class="Constant">0/empty</span>, <span class="Constant">7/white</span>
<span id="L236" class="LineNr">236 </span> <span class="Delimiter">{</span>
<span id="L237" class="LineNr">237 </span> done?:bool <span class="Special">&lt;-</span> greater-or-equal top-idx, next-top-idx
<span id="L238" class="LineNr">238 </span> <span class="muControl">break-if</span> done?
<span id="L239" class="LineNr">239 </span> put-index *buf, top-idx, empty-cell
<span id="L240" class="LineNr">240 </span> top-idx <span class="Special">&lt;-</span> add top-idx,<span class="Constant"> 1</span>
<span id="L241" class="LineNr">241 </span> <span class="Comment"># no modulo; top-idx is always a multiple of width,</span>
<span id="L242" class="LineNr">242 </span> <span class="Comment"># so it can never wrap around inside this loop</span>
<span id="L243" class="LineNr">243 </span> <span class="muControl"> loop</span>
<span id="L244" class="LineNr">244 </span> <span class="Delimiter">}</span>
<span id="L245" class="LineNr">245 </span> <span class="Comment"># top-idx now same as next-top-idx; wrap around if necessary</span>
<span id="L246" class="LineNr">246 </span> <a href='075channel.mu.html#L391'>capacity</a>:num <span class="Special">&lt;-</span> multiply width, height
<span id="L247" class="LineNr">247 </span> _, top-idx <span class="Special">&lt;-</span> divide-with-remainder, top-idx, <a href='075channel.mu.html#L391'>capacity</a>
<span id="L248" class="LineNr">248 </span> *screen <span class="Special">&lt;-</span> put *screen, <span class="Constant">top-idx:offset</span>, top-idx
<span id="L249" class="LineNr">249 </span>]
<span id="L250" class="LineNr">250 </span>
<span id="L251" class="LineNr">251 </span><span class="Comment"># translate from screen (row, column) coordinates to an index into data</span>
<span id="L252" class="LineNr">252 </span><span class="Comment"># while accounting for scrolling (sliding top-idx)</span>
<span id="L253" class="LineNr">253 </span><span class="muRecipe">def</span> <a href='081print.mu.html#L253'>data-index</a> row:num, column:num, width:num, height:num, top-idx:num<span class="muRecipe"> -&gt; </span>result:num [
<span id="L254" class="LineNr">254 </span> <span class="Constant">local-scope</span>
<span id="L255" class="LineNr">255 </span> <span class="Constant">load-inputs</span>
<span id="L256" class="LineNr">256 </span> <span class="Delimiter">{</span>
<span id="L257" class="LineNr">257 </span> overflow?:bool <span class="Special">&lt;-</span> greater-or-equal row, height
<span id="L258" class="LineNr">258 </span> <span class="muControl">break-unless</span> overflow?
<span id="L259" class="LineNr">259 </span> row <span class="Special">&lt;-</span> subtract height,<span class="Constant"> 1</span>
<span id="L260" class="LineNr">260 </span> <span class="Delimiter">}</span>
<span id="L261" class="LineNr">261 </span> result <span class="Special">&lt;-</span> multiply width, row
<span id="L262" class="LineNr">262 </span> result <span class="Special">&lt;-</span> add result, column, top-idx
<span id="L263" class="LineNr">263 </span> <a href='075channel.mu.html#L391'>capacity</a>:num <span class="Special">&lt;-</span> multiply width, height
<span id="L264" class="LineNr">264 </span> _, result <span class="Special">&lt;-</span> divide-with-remainder result, <a href='075channel.mu.html#L391'>capacity</a>
<span id="L265" class="LineNr">265 </span>]
<span id="L266" class="LineNr">266 </span>
<span id="L267" class="LineNr">267 </span><span class="muScenario">scenario</span> print-character-at-top-left [
<span id="L268" class="LineNr">268 </span> <span class="Constant">local-scope</span>
<span id="L269" class="LineNr">269 </span> fake-screen:&amp;:<a href='081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> <a href='081print.mu.html#L32'>new-fake-screen</a> <span class="Constant">3/width</span>, <span class="Constant">2/height</span>
<span id="L270" class="LineNr">270 </span> run [
<span id="L271" class="LineNr">271 </span> a:char <span class="Special">&lt;-</span> copy <span class="Constant">97/a</span>
<span id="L272" class="LineNr">272 </span> fake-screen <span class="Special">&lt;-</span> print fake-screen, a:char
<span id="L273" class="LineNr">273 </span> cell:&amp;:@:<a href='081print.mu.html#L27'>screen-cell</a> <span class="Special">&lt;-</span> get *fake-screen, <span class="Constant">data:offset</span>
<span id="L274" class="LineNr">274 </span> 1:@:<a href='081print.mu.html#L27'>screen-cell</a>/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *cell
<span id="L275" class="LineNr">275 </span> ]
<span id="L276" class="LineNr">276 </span> memory-should-contain [
<span id="L277" class="LineNr">277 </span> <span class="Constant"> 1</span> <span class="Special">&lt;-</span><span class="Constant"> 6</span> <span class="Comment"># width*height</span>
<span id="L278" class="LineNr">278 </span> <span class="Constant"> 2</span> <span class="Special">&lt;-</span><span class="Constant"> 97</span> <span class="Comment"># 'a'</span>
<span id="L279" class="LineNr">279 </span> <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span> <span class="Comment"># white</span>
<span id="L280" class="LineNr">280 </span> <span class="Comment"># rest of screen is empty</span>
<span id="L281" class="LineNr">281 </span> <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
<span id="L282" class="LineNr">282 </span> ]
<span id="L283" class="LineNr">283 </span>]
<span id="L284" class="LineNr">284 </span>
<span id="L285" class="LineNr">285 </span><span class="muScenario">scenario</span> print-character-at-fractional-coordinate [
<span id="L286" class="LineNr">286 </span> <span class="Constant">local-scope</span>
<span id="L287" class="LineNr">287 </span> fake-screen:&amp;:<a href='081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> <a href='081print.mu.html#L32'>new-fake-screen</a> <span class="Constant">3/width</span>, <span class="Constant">2/height</span>
<span id="L288" class="LineNr">288 </span> a:char <span class="Special">&lt;-</span> copy <span class="Constant">97/a</span>
<span id="L289" class="LineNr">289 </span> run [
<span id="L290" class="LineNr">290 </span> <a href='081print.mu.html#L591'>move-cursor</a> fake-screen, 0.5,<span class="Constant"> 0</span>
<span id="L291" class="LineNr">291 </span> fake-screen <span class="Special">&lt;-</span> print fake-screen, a:char
<span id="L292" class="LineNr">292 </span> cell:&amp;:@:<a href='081print.mu.html#L27'>screen-cell</a> <span class="Special">&lt;-</span> get *fake-screen, <span class="Constant">data:offset</span>
<span id="L293" class="LineNr">293 </span> 1:@:<a href='081print.mu.html#L27'>screen-cell</a>/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *cell
<span id="L294" class="LineNr">294 </span> ]
<span id="L295" class="LineNr">295 </span> memory-should-contain [
<span id="L296" class="LineNr">296 </span> <span class="Constant"> 1</span> <span class="Special">&lt;-</span><span class="Constant"> 6</span> <span class="Comment"># width*height</span>
<span id="L297" class="LineNr">297 </span> <span class="Constant"> 2</span> <span class="Special">&lt;-</span><span class="Constant"> 97</span> <span class="Comment"># 'a'</span>
<span id="L298" class="LineNr">298 </span> <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span> <span class="Comment"># white</span>
<span id="L299" class="LineNr">299 </span> <span class="Comment"># rest of screen is empty</span>
<span id="L300" class="LineNr">300 </span> <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
<span id="L301" class="LineNr">301 </span> ]
<span id="L302" class="LineNr">302 </span>]
<span id="L303" class="LineNr">303 </span>
<span id="L304" class="LineNr">304 </span><span class="muScenario">scenario</span> print-character-in-color [
<span id="L305" class="LineNr">305 </span> <span class="Constant">local-scope</span>
<span id="L306" class="LineNr">306 </span> fake-screen:&amp;:<a href='081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> <a href='081print.mu.html#L32'>new-fake-screen</a> <span class="Constant">3/width</span>, <span class="Constant">2/height</span>
<span id="L307" class="LineNr">307 </span> run [
<span id="L308" class="LineNr">308 </span> a:char <span class="Special">&lt;-</span> copy <span class="Constant">97/a</span>
<span id="L309" class="LineNr">309 </span> fake-screen <span class="Special">&lt;-</span> print fake-screen, a:char, <span class="Constant">1/red</span>
<span id="L310" class="LineNr">310 </span> cell:&amp;:@:<a href='081print.mu.html#L27'>screen-cell</a> <span class="Special">&lt;-</span> get *fake-screen, <span class="Constant">data:offset</span>
<span id="L311" class="LineNr">311 </span> 1:@:<a href='081print.mu.html#L27'>screen-cell</a>/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *cell
<span id="L312" class="LineNr">312 </span> ]
<span id="L313" class="LineNr">313 </span> memory-should-contain [
<span id="L314" class="LineNr">314 </span> <span class="Constant"> 1</span> <span class="Special">&lt;-</span><span class="Constant"> 6</span> <span class="Comment"># width*height</span>
<span id="L315" class="LineNr">315 </span> <span class="Constant"> 2</span> <span class="Special">&lt;-</span><span class="Constant"> 97</span> <span class="Comment"># 'a'</span>
<span id="L316" class="LineNr">316 </span> <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span> <span class="Comment"># red</span>
<span id="L317" class="LineNr">317 </span> <span class="Comment"># rest of screen is empty</span>
<span id="L318" class="LineNr">318 </span> <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
<span id="L319" class="LineNr">319 </span> ]
<span id="L320" class="LineNr">320 </span>]
<span id="L321" class="LineNr">321 </span>
<span id="L322" class="LineNr">322 </span><span class="muScenario">scenario</span> print-backspace-character [
<span id="L323" class="LineNr">323 </span> <span class="Constant">local-scope</span>
<span id="L324" class="LineNr">324 </span> fake-screen:&amp;:<a href='081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> <a href='081print.mu.html#L32'>new-fake-screen</a> <span class="Constant">3/width</span>, <span class="Constant">2/height</span>
<span id="L325" class="LineNr">325 </span> a:char <span class="Special">&lt;-</span> copy <span class="Constant">97/a</span>
<span id="L326" class="LineNr">326 </span> fake-screen <span class="Special">&lt;-</span> print fake-screen, a
<span id="L327" class="LineNr">327 </span> run [
<span id="L328" class="LineNr">328 </span> backspace:char <span class="Special">&lt;-</span> copy <span class="Constant">8/backspace</span>
<span id="L329" class="LineNr">329 </span> fake-screen <span class="Special">&lt;-</span> print fake-screen, backspace
<span id="L330" class="LineNr">330 </span> 10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *fake-screen, <span class="Constant">cursor-column:offset</span>
<span id="L331" class="LineNr">331 </span> cell:&amp;:@:<a href='081print.mu.html#L27'>screen-cell</a> <span class="Special">&lt;-</span> get *fake-screen, <span class="Constant">data:offset</span>
<span id="L332" class="LineNr">332 </span> 11:@:<a href='081print.mu.html#L27'>screen-cell</a>/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *cell
<span id="L333" class="LineNr">333 </span> ]
<span id="L334" class="LineNr">334 </span> memory-should-contain [
<span id="L335" class="LineNr">335 </span> <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span> <span class="Comment"># cursor column</span>
<span id="L336" class="LineNr">336 </span> <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 6</span> <span class="Comment"># width*height</span>
<span id="L337" class="LineNr">337 </span> <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 97</span> <span class="Comment"># still 'a'</span>
<span id="L338" class="LineNr">338 </span> <span class="Constant"> 13</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span> <span class="Comment"># white</span>
<span id="L339" class="LineNr">339 </span> <span class="Comment"># rest of screen is empty</span>
<span id="L340" class="LineNr">340 </span> <span class="Constant"> 14</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
<span id="L341" class="LineNr">341 </span> ]
<span id="L342" class="LineNr">342 </span>]
<span id="L343" class="LineNr">343 </span>
<span id="L344" class="LineNr">344 </span><span class="muScenario">scenario</span> print-extra-backspace-character [
<span id="L345" class="LineNr">345 </span> <span class="Constant">local-scope</span>
<span id="L346" class="LineNr">346 </span> fake-screen:&amp;:<a href='081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> <a href='081print.mu.html#L32'>new-fake-screen</a> <span class="Constant">3/width</span>, <span class="Constant">2/height</span>
<span id="L347" class="LineNr">347 </span> a:char <span class="Special">&lt;-</span> copy <span class="Constant">97/a</span>
<span id="L348" class="LineNr">348 </span> fake-screen <span class="Special">&lt;-</span> print fake-screen, a
<span id="L349" class="LineNr">349 </span> run [
<span id="L350" class="LineNr">350 </span> backspace:char <span class="Special">&lt;-</span> copy <span class="Constant">8/backspace</span>
<span id="L351" class="LineNr">351 </span> fake-screen <span class="Special">&lt;-</span> print fake-screen, backspace
<span id="L352" class="LineNr">352 </span> fake-screen <span class="Special">&lt;-</span> print fake-screen, backspace <span class="Comment"># cursor already at left margin</span>
<span id="L353" class="LineNr">353 </span> 1:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *fake-screen, <span class="Constant">cursor-column:offset</span>
<span id="L354" class="LineNr">354 </span> cell:&amp;:@:<a href='081print.mu.html#L27'>screen-cell</a> <span class="Special">&lt;-</span> get *fake-screen, <span class="Constant">data:offset</span>
<span id="L355" class="LineNr">355 </span> 3:@:<a href='081print.mu.html#L27'>screen-cell</a>/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *cell
<span id="L356" class="LineNr">356 </span> ]
<span id="L357" class="LineNr">357 </span> memory-should-contain [
<span id="L358" class="LineNr">358 </span> <span class="Constant"> 1</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span> <span class="Comment"># cursor column</span>
<span id="L359" class="LineNr">359 </span> <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 6</span> <span class="Comment"># width*height</span>
<span id="L360" class="LineNr">360 </span> <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 97</span> <span class="Comment"># still 'a'</span>
<span id="L361" class="LineNr">361 </span> <span class="Constant"> 5</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span> <span class="Comment"># white</span>
<span id="L362" class="LineNr">362 </span> <span class="Comment"># rest of screen is empty</span>
<span id="L363" class="LineNr">363 </span> <span class="Constant"> 6</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
<span id="L364" class="LineNr">364 </span> ]
<span id="L365" class="LineNr">365 </span>]
<span id="L366" class="LineNr">366 </span>
<span id="L367" class="LineNr">367 </span><span class="muScenario">scenario</span> print-character-at-right-margin [
<span id="L368" class="LineNr">368 </span> <span class="Comment"># fill top row of screen with text</span>
<span id="L369" class="LineNr">369 </span> <span class="Constant">local-scope</span>
<span id="L370" class="LineNr">370 </span> fake-screen:&amp;:<a href='081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> <a href='081print.mu.html#L32'>new-fake-screen</a> <span class="Constant">2/width</span>, <span class="Constant">2/height</span>
<span id="L371" class="LineNr">371 </span> a:char <span class="Special">&lt;-</span> copy <span class="Constant">97/a</span>
<span id="L372" class="LineNr">372 </span> fake-screen <span class="Special">&lt;-</span> print fake-screen, a
<span id="L373" class="LineNr">373 </span> b:char <span class="Special">&lt;-</span> copy <span class="Constant">98/b</span>
<span id="L374" class="LineNr">374 </span> fake-screen <span class="Special">&lt;-</span> print fake-screen, b
<span id="L375" class="LineNr">375 </span> run [
<span id="L376" class="LineNr">376 </span> <span class="Comment"># cursor now at next row</span>
<span id="L377" class="LineNr">377 </span> c:char <span class="Special">&lt;-</span> copy <span class="Constant">99/c</span>
<span id="L378" class="LineNr">378 </span> fake-screen <span class="Special">&lt;-</span> print fake-screen, c
<span id="L379" class="LineNr">379 </span> 10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *fake-screen, <span class="Constant">cursor-row:offset</span>
<span id="L380" class="LineNr">380 </span> 11:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *fake-screen, <span class="Constant">cursor-column:offset</span>
<span id="L381" class="LineNr">381 </span> cell:&amp;:@:<a href='081print.mu.html#L27'>screen-cell</a> <span class="Special">&lt;-</span> get *fake-screen, <span class="Constant">data:offset</span>
<span id="L382" class="LineNr">382 </span> 12:@:<a href='081print.mu.html#L27'>screen-cell</a>/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *cell
<span id="L383" class="LineNr">383 </span> ]
<span id="L384" class="LineNr">384 </span> memory-should-contain [
<span id="L385" class="LineNr">385 </span> <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span> <span class="Comment"># cursor row</span>
<span id="L386" class="LineNr">386 </span> <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span> <span class="Comment"># cursor column</span>
<span id="L387" class="LineNr">387 </span> <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 4</span> <span class="Comment"># width*height</span>
<span id="L388" class="LineNr">388 </span> <span class="Constant"> 13</span> <span class="Special">&lt;-</span><span class="Constant"> 97</span> <span class="Comment"># 'a'</span>
<span id="L389" class="LineNr">389 </span> <span class="Constant"> 14</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span> <span class="Comment"># white</span>
<span id="L390" class="LineNr">390 </span> <span class="Constant"> 15</span> <span class="Special">&lt;-</span><span class="Constant"> 98</span> <span class="Comment"># 'b'</span>
<span id="L391" class="LineNr">391 </span> <span class="Constant"> 16</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span> <span class="Comment"># white</span>
<span id="L392" class="LineNr">392 </span> <span class="Constant"> 17</span> <span class="Special">&lt;-</span><span class="Constant"> 99</span> <span class="Comment"># 'c'</span>
<span id="L393" class="LineNr">393 </span> <span class="Constant"> 18</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span> <span class="Comment"># white</span>
<span id="L394" class="LineNr">394 </span> <span class="Constant"> 19</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span> <span class="Comment"># ' '</span>
<span id="L395" class="LineNr">395 </span> <span class="Constant"> 20</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span> <span class="Comment"># white</span>
<span id="L396" class="LineNr">396 </span> ]
<span id="L397" class="LineNr">397 </span>]
<span id="L398" class="LineNr">398 </span>
<span id="L399" class="LineNr">399 </span><span class="muScenario">scenario</span> print-newline-character [
<span id="L400" class="LineNr">400 </span> <span class="Constant">local-scope</span>
<span id="L401" class="LineNr">401 </span> fake-screen:&amp;:<a href='081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> <a href='081print.mu.html#L32'>new-fake-screen</a> <span class="Constant">3/width</span>, <span class="Constant">2/height</span>
<span id="L402" class="LineNr">402 </span> a:char <span class="Special">&lt;-</span> copy <span class="Constant">97/a</span>
<span id="L403" class="LineNr">403 </span> fake-screen <span class="Special">&lt;-</span> print fake-screen, a
<span id="L404" class="LineNr">404 </span> run [
<span id="L405" class="LineNr">405 </span> newline:char <span class="Special">&lt;-</span> copy <span class="Constant">10/newline</span>
<span id="L406" class="LineNr">406 </span> fake-screen <span class="Special">&lt;-</span> print fake-screen, newline
<span id="L407" class="LineNr">407 </span> 10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *fake-screen, <span class="Constant">cursor-row:offset</span>
<span id="L408" class="LineNr">408 </span> 11:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *fake-screen, <span class="Constant">cursor-column:offset</span>
<span id="L409" class="LineNr">409 </span> cell:&amp;:@:<a href='081print.mu.html#L27'>screen-cell</a> <span class="Special">&lt;-</span> get *fake-screen, <span class="Constant">data:offset</span>
<span id="L410" class="LineNr">410 </span> 12:@:<a href='081print.mu.html#L27'>screen-cell</a>/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *cell
<span id="L411" class="LineNr">411 </span> ]
<span id="L412" class="LineNr">412 </span> memory-should-contain [
<span id="L413" class="LineNr">413 </span> <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span> <span class="Comment"># cursor row</span>
<span id="L414" class="LineNr">414 </span> <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span> <span class="Comment"># cursor column</span>
<span id="L415" class="LineNr">415 </span> <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 6</span> <span class="Comment"># width*height</span>
<span id="L416" class="LineNr">416 </span> <span class="Constant"> 13</span> <span class="Special">&lt;-</span><span class="Constant"> 97</span> <span class="Comment"># 'a'</span>
<span id="L417" class="LineNr">417 </span> <span class="Constant"> 14</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span> <span class="Comment"># white</span>
<span id="L418" class="LineNr">418 </span> <span class="Comment"># rest of screen is empty</span>
<span id="L419" class="LineNr">419 </span> <span class="Constant"> 15</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
<span id="L420" class="LineNr">420 </span> ]
<span id="L421" class="LineNr">421 </span>]
<span id="L422" class="LineNr">422 </span>
<span id="L423" class="LineNr">423 </span><span class="muScenario">scenario</span> print-newline-at-bottom-line [
<span id="L424" class="LineNr">424 </span> <span class="Constant">local-scope</span>
<span id="L425" class="LineNr">425 </span> fake-screen:&amp;:<a href='081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> <a href='081print.mu.html#L32'>new-fake-screen</a> <span class="Constant">3/width</span>, <span class="Constant">2/height</span>
<span id="L426" class="LineNr">426 </span> newline:char <span class="Special">&lt;-</span> copy <span class="Constant">10/newline</span>
<span id="L427" class="LineNr">427 </span> fake-screen <span class="Special">&lt;-</span> print fake-screen, newline
<span id="L428" class="LineNr">428 </span> fake-screen <span class="Special">&lt;-</span> print fake-screen, newline
<span id="L429" class="LineNr">429 </span> run [
<span id="L430" class="LineNr">430 </span> <span class="Comment"># cursor now at bottom of screen</span>
<span id="L431" class="LineNr">431 </span> fake-screen <span class="Special">&lt;-</span> print fake-screen, newline
<span id="L432" class="LineNr">432 </span> 10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *fake-screen, <span class="Constant">cursor-row:offset</span>
<span id="L433" class="LineNr">433 </span> 11:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *fake-screen, <span class="Constant">cursor-column:offset</span>
<span id="L434" class="LineNr">434 </span> ]
<span id="L435" class="LineNr">435 </span> <span class="Comment"># doesn't move further down</span>
<span id="L436" class="LineNr">436 </span> memory-should-contain [
<span id="L437" class="LineNr">437 </span> <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span> <span class="Comment"># cursor row</span>
<span id="L438" class="LineNr">438 </span> <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span> <span class="Comment"># cursor column</span>
<span id="L439" class="LineNr">439 </span> ]
<span id="L440" class="LineNr">440 </span>]
<span id="L441" class="LineNr">441 </span>
<span id="L442" class="LineNr">442 </span><span class="muScenario">scenario</span> print-character-at-bottom-right [
<span id="L443" class="LineNr">443 </span> <span class="Constant">local-scope</span>
<span id="L444" class="LineNr">444 </span> fake-screen:&amp;:<a href='081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> <a href='081print.mu.html#L32'>new-fake-screen</a> <span class="Constant">2/width</span>, <span class="Constant">2/height</span>
<span id="L445" class="LineNr">445 </span> a:char <span class="Special">&lt;-</span> copy <span class="Constant">97/a</span>
<span id="L446" class="LineNr">446 </span> fake-screen <span class="Special">&lt;-</span> print fake-screen, a
<span id="L447" class="LineNr">447 </span> b:char <span class="Special">&lt;-</span> copy <span class="Constant">98/b</span>
<span id="L448" class="LineNr">448 </span> fake-screen <span class="Special">&lt;-</span> print fake-screen, b
<span id="L449" class="LineNr">449 </span> c:char <span class="Special">&lt;-</span> copy <span class="Constant">99/c</span>
<span id="L450" class="LineNr">450 </span> fake-screen <span class="Special">&lt;-</span> print fake-screen, c
<span id="L451" class="LineNr">451 </span> run [
<span id="L452" class="LineNr">452 </span> <span class="Comment"># cursor now at bottom right</span>
<span id="L453" class="LineNr">453 </span> d:char <span class="Special">&lt;-</span> copy <span class="Constant">100/d</span>
<span id="L454" class="LineNr">454 </span> fake-screen <span class="Special">&lt;-</span> print fake-screen, d
<span id="L455" class="LineNr">455 </span> 10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *fake-screen, <span class="Constant">cursor-row:offset</span>
<span id="L456" class="LineNr">456 </span> 11:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *fake-screen, <span class="Constant">cursor-column:offset</span>
<span id="L457" class="LineNr">457 </span> 12:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *fake-screen, <span class="Constant">top-idx:offset</span>
<span id="L458" class="LineNr">458 </span> 13:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *fake-screen, <span class="Constant">pending-scroll?:offset</span>
<span id="L459" class="LineNr">459 </span> cell:&amp;:@:<a href='081print.mu.html#L27'>screen-cell</a> <span class="Special">&lt;-</span> get *fake-screen, <span class="Constant">data:offset</span>
<span id="L460" class="LineNr">460 </span> 20:@:<a href='081print.mu.html#L27'>screen-cell</a>/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *cell
<span id="L461" class="LineNr">461 </span> ]
<span id="L462" class="LineNr">462 </span> <span class="Comment"># cursor column wraps but the screen doesn't scroll yet</span>
<span id="L463" class="LineNr">463 </span> memory-should-contain [
<span id="L464" class="LineNr">464 </span> <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span> <span class="Comment"># cursor row</span>
<span id="L465" class="LineNr">465 </span> <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span> <span class="Comment"># cursor column -- outside screen</span>
<span id="L466" class="LineNr">466 </span> <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span> <span class="Comment"># top-idx -- not yet scrolled</span>
<span id="L467" class="LineNr">467 </span> <span class="Constant"> 13</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span> <span class="Comment"># pending-scroll?</span>
<span id="L468" class="LineNr">468 </span> <span class="Constant"> 20</span> <span class="Special">&lt;-</span><span class="Constant"> 4</span> <span class="Comment"># screen size (width*height)</span>
<span id="L469" class="LineNr">469 </span> <span class="Constant"> 21</span> <span class="Special">&lt;-</span><span class="Constant"> 97</span> <span class="Comment"># 'a'</span>
<span id="L470" class="LineNr">470 </span> <span class="Constant"> 22</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span> <span class="Comment"># white</span>
<span id="L471" class="LineNr">471 </span> <span class="Constant"> 23</span> <span class="Special">&lt;-</span><span class="Constant"> 98</span> <span class="Comment"># 'b'</span>
<span id="L472" class="LineNr">472 </span> <span class="Constant"> 24</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span> <span class="Comment"># white</span>
<span id="L473" class="LineNr">473 </span> <span class="Constant"> 25</span> <span class="Special">&lt;-</span><span class="Constant"> 99</span> <span class="Comment"># 'c'</span>
<span id="L474" class="LineNr">474 </span> <span class="Constant"> 26</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span> <span class="Comment"># white</span>
<span id="L475" class="LineNr">475 </span> <span class="Constant"> 27</span> <span class="Special">&lt;-</span><span class="Constant"> 100</span> <span class="Comment"># 'd'</span>
<span id="L476" class="LineNr">476 </span> <span class="Constant"> 28</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span> <span class="Comment"># white</span>
<span id="L477" class="LineNr">477 </span> ]
<span id="L478" class="LineNr">478 </span> run [
<span id="L479" class="LineNr">479 </span> e:char <span class="Special">&lt;-</span> copy <span class="Constant">101/e</span>
<span id="L480" class="LineNr">480 </span> print fake-screen, e
<span id="L481" class="LineNr">481 </span> 10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *fake-screen, <span class="Constant">cursor-row:offset</span>
<span id="L482" class="LineNr">482 </span> 11:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *fake-screen, <span class="Constant">cursor-column:offset</span>
<span id="L483" class="LineNr">483 </span> 12:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *fake-screen, <span class="Constant">top-idx:offset</span>
<span id="L484" class="LineNr">484 </span> cell:&amp;:@:<a href='081print.mu.html#L27'>screen-cell</a> <span class="Special">&lt;-</span> get *fake-screen, <span class="Constant">data:offset</span>
<span id="L485" class="LineNr">485 </span> 20:@:<a href='081print.mu.html#L27'>screen-cell</a>/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *cell
<span id="L486" class="LineNr">486 </span> ]
<span id="L487" class="LineNr">487 </span> memory-should-contain [
<span id="L488" class="LineNr">488 </span> <span class="Comment"># text scrolls by 1, we lose the top line</span>
<span id="L489" class="LineNr">489 </span> <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span> <span class="Comment"># cursor row</span>
<span id="L490" class="LineNr">490 </span> <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span> <span class="Comment"># cursor column -- wrapped</span>
<span id="L491" class="LineNr">491 </span> <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span> <span class="Comment"># top-idx -- scrolled</span>
<span id="L492" class="LineNr">492 </span> <span class="Constant"> 20</span> <span class="Special">&lt;-</span><span class="Constant"> 4</span> <span class="Comment"># screen size (width*height)</span>
<span id="L493" class="LineNr">493 </span> <span class="Comment"># screen now checked in rotated order</span>
<span id="L494" class="LineNr">494 </span> <span class="Constant"> 25</span> <span class="Special">&lt;-</span><span class="Constant"> 99</span> <span class="Comment"># 'c'</span>
<span id="L495" class="LineNr">495 </span> <span class="Constant"> 26</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span> <span class="Comment"># white</span>
<span id="L496" class="LineNr">496 </span> <span class="Constant"> 27</span> <span class="Special">&lt;-</span><span class="Constant"> 100</span> <span class="Comment"># 'd'</span>
<span id="L497" class="LineNr">497 </span> <span class="Constant"> 28</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span> <span class="Comment"># white</span>
<span id="L498" class="LineNr">498 </span> <span class="Comment"># screen wraps; bottom line is cleared of old contents</span>
<span id="L499" class="LineNr">499 </span> <span class="Constant"> 21</span> <span class="Special">&lt;-</span><span class="Constant"> 101</span> <span class="Comment"># 'e'</span>
<span id="L500" class="LineNr">500 </span> <span class="Constant"> 22</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span> <span class="Comment"># white</span>
<span id="L501" class="LineNr">501 </span> <span class="Constant"> 23</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span> <span class="Comment"># unused</span>
<span id="L502" class="LineNr">502 </span> <span class="Constant"> 24</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span> <span class="Comment"># white</span>
<span id="L503" class="LineNr">503 </span> ]
<span id="L504" class="LineNr">504 </span>]
<span id="L505" class="LineNr">505 </span>
<span id="L506" class="LineNr">506 </span><span class="Comment"># even though our screen supports scrolling, some apps may want to avoid</span>
<span id="L507" class="LineNr">507 </span><span class="Comment"># scrolling</span>
<span id="L508" class="LineNr">508 </span><span class="Comment"># these helpers help check for scrolling at development time</span>
<span id="L509" class="LineNr">509 </span><span class="muRecipe">def</span> <a href='081print.mu.html#L509'>save-top-idx</a> <a href='081print.mu.html#L16'>screen</a>:&amp;:<a href='081print.mu.html#L16'>screen</a><span class="muRecipe"> -&gt; </span>result:num [
<span id="L510" class="LineNr">510 </span> <span class="Constant">local-scope</span>
<span id="L511" class="LineNr">511 </span> <span class="Constant">load-inputs</span>
<span id="L512" class="LineNr">512 </span> <span class="muControl">return-unless</span> <a href='081print.mu.html#L16'>screen</a>,<span class="Constant"> 0</span> <span class="Comment"># check is only for fake screens</span>
<span id="L513" class="LineNr">513 </span> result <span class="Special">&lt;-</span> get *screen, <span class="Constant">top-idx:offset</span>
<span id="L514" class="LineNr">514 </span>]
<span id="L515" class="LineNr">515 </span><span class="muRecipe">def</span> <a href='081print.mu.html#L515'>assert-no-scroll</a> <a href='081print.mu.html#L16'>screen</a>:&amp;:<a href='081print.mu.html#L16'>screen</a>, old-top-idx:num [
<span id="L516" class="LineNr">516 </span> <span class="Constant">local-scope</span>
<span id="L517" class="LineNr">517 </span> <span class="Constant">load-inputs</span>
<span id="L518" class="LineNr">518 </span> <span class="muControl">return-unless</span> <a href='081print.mu.html#L16'>screen</a>
<span id="L519" class="LineNr">519 </span> new-top-idx:num <span class="Special">&lt;-</span> get *screen, <span class="Constant">top-idx:offset</span>
<span id="L520" class="LineNr">520 </span> no-scroll?:bool <span class="Special">&lt;-</span> equal old-top-idx, new-top-idx
<span id="L521" class="LineNr">521 </span> assert no-scroll?, <span class="Constant">[render should never use <a href='081print.mu.html#L16'>screen</a>'s scrolling capabilities]</span>
<span id="L522" class="LineNr">522 </span>]
<span id="L523" class="LineNr">523 </span>
<span id="L524" class="LineNr">524 </span><span class="muRecipe">def</span> <a href='081print.mu.html#L524'>clear-line</a> <a href='081print.mu.html#L16'>screen</a>:&amp;:<a href='081print.mu.html#L16'>screen</a><span class="muRecipe"> -&gt; </span><a href='081print.mu.html#L16'>screen</a>:&amp;:<a href='081print.mu.html#L16'>screen</a> [
<span id="L525" class="LineNr">525 </span> <span class="Constant">local-scope</span>
<span id="L526" class="LineNr">526 </span> <span class="Constant">load-inputs</span>
<span id="L527" class="LineNr">527 </span><span class="CommentedCode">#? stash [clear-line]</span>
<span id="L528" class="LineNr">528 </span> space:char <span class="Special">&lt;-</span> copy <span class="Constant">0/nul</span>
<span id="L529" class="LineNr">529 </span> <span class="Delimiter">{</span>
<span id="L530" class="LineNr">530 </span> <span class="muControl">break-if</span> <a href='081print.mu.html#L16'>screen</a>
<span id="L531" class="LineNr">531 </span> <span class="Comment"># real screen</span>
<span id="L532" class="LineNr">532 </span> clear-line-on-display
<span id="L533" class="LineNr">533 </span> <span class="muControl"> return</span>
<span id="L534" class="LineNr">534 </span> <span class="Delimiter">}</span>
<span id="L535" class="LineNr">535 </span> <span class="Comment"># fake screen</span>
<span id="L536" class="LineNr">536 </span> width:num <span class="Special">&lt;-</span> get *screen, <span class="Constant">num-columns:offset</span>
<span id="L537" class="LineNr">537 </span> column:num <span class="Special">&lt;-</span> get *screen, <span class="Constant">cursor-column:offset</span>
<span id="L538" class="LineNr">538 </span> original-column:num <span class="Special">&lt;-</span> copy column
<span id="L539" class="LineNr">539 </span> <span class="Comment"># space over the entire line</span>
<span id="L540" class="LineNr">540 </span> <span class="Delimiter">{</span>
<span id="L541" class="LineNr">541 </span> right:num <span class="Special">&lt;-</span> subtract width,<span class="Constant"> 1</span>
<span id="L542" class="LineNr">542 </span> done?:bool <span class="Special">&lt;-</span> greater-or-equal column, right
<span id="L543" class="LineNr">543 </span> <span class="muControl">break-if</span> done?
<span id="L544" class="LineNr">544 </span> print <a href='081print.mu.html#L16'>screen</a>, space
<span id="L545" class="LineNr">545 </span> column <span class="Special">&lt;-</span> add column,<span class="Constant"> 1</span>
<span id="L546" class="LineNr">546 </span> <span class="muControl"> loop</span>
<span id="L547" class="LineNr">547 </span> <span class="Delimiter">}</span>
<span id="L548" class="LineNr">548 </span> <span class="Comment"># now back to where the cursor was</span>
<span id="L549" class="LineNr">549 </span> *screen <span class="Special">&lt;-</span> put *screen, <span class="Constant">cursor-column:offset</span>, original-column
<span id="L550" class="LineNr">550 </span>]
<span id="L551" class="LineNr">551 </span>
<span id="L552" class="LineNr">552 </span><span class="Comment"># only for non-scrolling apps</span>
<span id="L553" class="LineNr">553 </span><span class="muRecipe">def</span> <a href='081print.mu.html#L553'>clear-line-until</a> <a href='081print.mu.html#L16'>screen</a>:&amp;:<a href='081print.mu.html#L16'>screen</a>, right:num/inclusive<span class="muRecipe"> -&gt; </span><a href='081print.mu.html#L16'>screen</a>:&amp;:<a href='081print.mu.html#L16'>screen</a> [
<span id="L554" class="LineNr">554 </span> <span class="Constant">local-scope</span>
<span id="L555" class="LineNr">555 </span> <span class="Constant">load-inputs</span>
<span id="L556" class="LineNr">556 </span> row:num, column:num <span class="Special">&lt;-</span> <a href='081print.mu.html#L577'>cursor-position</a> <a href='081print.mu.html#L16'>screen</a>
<span id="L557" class="LineNr">557 </span><span class="CommentedCode">#? stash [clear-line-until] row column</span>
<span id="L558" class="LineNr">558 </span> height:num <span class="Special">&lt;-</span> <a href='081print.mu.html#L782'>screen-height</a> <a href='081print.mu.html#L16'>screen</a>
<span id="L559" class="LineNr">559 </span> past-bottom?:bool <span class="Special">&lt;-</span> greater-or-equal row, height
<span id="L560" class="LineNr">560 </span> <span class="muControl">return-if</span> past-bottom?
<span id="L561" class="LineNr">561 </span> space:char <span class="Special">&lt;-</span> copy <span class="Constant">32/space</span>
<span id="L562" class="LineNr">562 </span> bg-color:num, bg-color-found?:bool <span class="Special">&lt;-</span> <span class="Constant">next-input</span>
<span id="L563" class="LineNr">563 </span> <span class="Delimiter">{</span>
<span id="L564" class="LineNr">564 </span> <span class="Comment"># default bg-color to black</span>
<span id="L565" class="LineNr">565 </span> <span class="muControl">break-if</span> bg-color-found?
<span id="L566" class="LineNr">566 </span> bg-color <span class="Special">&lt;-</span> copy <span class="Constant">0/black</span>
<span id="L567" class="LineNr">567 </span> <span class="Delimiter">}</span>
<span id="L568" class="LineNr">568 </span> <span class="Delimiter">{</span>
<span id="L569" class="LineNr">569 </span> done?:bool <span class="Special">&lt;-</span> greater-than column, right
<span id="L570" class="LineNr">570 </span> <span class="muControl">break-if</span> done?
<span id="L571" class="LineNr">571 </span> <a href='081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> print <a href='081print.mu.html#L16'>screen</a>, space, <span class="Constant">7/white</span>, bg-color <span class="Comment"># foreground color is mostly unused except if the cursor shows up at this cell</span>
<span id="L572" class="LineNr">572 </span> column <span class="Special">&lt;-</span> add column,<span class="Constant"> 1</span>
<span id="L573" class="LineNr">573 </span> <span class="muControl"> loop</span>
<span id="L574" class="LineNr">574 </span> <span class="Delimiter">}</span>
<span id="L575" class="LineNr">575 </span>]
<span id="L576" class="LineNr">576 </span>
<span id="L577" class="LineNr">577 </span><span class="muRecipe">def</span> <a href='081print.mu.html#L577'>cursor-position</a> <a href='081print.mu.html#L16'>screen</a>:&amp;:<a href='081print.mu.html#L16'>screen</a><span class="muRecipe"> -&gt; </span>row:num, column:num [
<span id="L578" class="LineNr">578 </span> <span class="Constant">local-scope</span>
<span id="L579" class="LineNr">579 </span> <span class="Constant">load-inputs</span>
<span id="L580" class="LineNr">580 </span> <span class="Delimiter">{</span>
<span id="L581" class="LineNr">581 </span> <span class="muControl">break-if</span> <a href='081print.mu.html#L16'>screen</a>
<span id="L582" class="LineNr">582 </span> <span class="Comment"># real screen</span>
<span id="L583" class="LineNr">583 </span> row, column <span class="Special">&lt;-</span> cursor-position-on-display
<span id="L584" class="LineNr">584 </span> <span class="muControl"> return</span>
<span id="L585" class="LineNr">585 </span> <span class="Delimiter">}</span>
<span id="L586" class="LineNr">586 </span> <span class="Comment"># fake screen</span>
<span id="L587" class="LineNr">587 </span> row:num <span class="Special">&lt;-</span> get *screen, <span class="Constant">cursor-row:offset</span>
<span id="L588" class="LineNr">588 </span> column:num <span class="Special">&lt;-</span> get *screen, <span class="Constant">cursor-column:offset</span>
<span id="L589" class="LineNr">589 </span>]
<span id="L590" class="LineNr">590 </span>
<span id="L591" class="LineNr">591 </span><span class="muRecipe">def</span> <a href='081print.mu.html#L591'>move-cursor</a> <a href='081print.mu.html#L16'>screen</a>:&amp;:<a href='081print.mu.html#L16'>screen</a>, new-row:num, new-column:num<span class="muRecipe"> -&gt; </span><a href='081print.mu.html#L16'>screen</a>:&amp;:<a href='081print.mu.html#L16'>screen</a> [
<span id="L592" class="LineNr">592 </span> <span class="Constant">local-scope</span>
<span id="L593" class="LineNr">593 </span> <span class="Constant">load-inputs</span>
<span id="L594" class="LineNr">594 </span><span class="CommentedCode">#? stash [move-cursor] new-row new-column</span>
<span id="L595" class="LineNr">595 </span> <span class="Delimiter">{</span>
<span id="L596" class="LineNr">596 </span> <span class="muControl">break-if</span> <a href='081print.mu.html#L16'>screen</a>
<span id="L597" class="LineNr">597 </span> <span class="Comment"># real screen</span>
<span id="L598" class="LineNr">598 </span> move-cursor-on-display new-row, new-column
<span id="L599" class="LineNr">599 </span> <span class="muControl"> return</span>
<span id="L600" class="LineNr">600 </span> <span class="Delimiter">}</span>
<span id="L601" class="LineNr">601 </span> <span class="Comment"># fake screen</span>
<span id="L602" class="LineNr">602 </span> *screen <span class="Special">&lt;-</span> put *screen, <span class="Constant">cursor-row:offset</span>, new-row
<span id="L603" class="LineNr">603 </span> *screen <span class="Special">&lt;-</span> put *screen, <span class="Constant">cursor-column:offset</span>, new-column
<span id="L604" class="LineNr">604 </span> <span class="Comment"># if cursor column is within bounds, reset 'pending-scroll?'</span>
<span id="L605" class="LineNr">605 </span> <span class="Delimiter">{</span>
<span id="L606" class="LineNr">606 </span> width:num <span class="Special">&lt;-</span> get *screen, <span class="Constant">num-columns:offset</span>
<span id="L607" class="LineNr">607 </span> scroll?:bool <span class="Special">&lt;-</span> greater-or-equal new-column, width
<span id="L608" class="LineNr">608 </span> <span class="muControl">break-if</span> scroll?
<span id="L609" class="LineNr">609 </span><span class="CommentedCode">#? stash [resetting pending-scroll?]</span>
<span id="L610" class="LineNr">610 </span> *screen <span class="Special">&lt;-</span> put *screen, <span class="Constant">pending-scroll?:offset</span>,<span class="Constant"> false</span>
<span id="L611" class="LineNr">611 </span> <span class="Delimiter">}</span>
<span id="L612" class="LineNr">612 </span>]
<span id="L613" class="LineNr">613 </span>
<span id="L614" class="LineNr">614 </span><span class="muScenario">scenario</span> clear-line-erases-printed-characters [
<span id="L615" class="LineNr">615 </span> <span class="Constant">local-scope</span>
<span id="L616" class="LineNr">616 </span> fake-screen:&amp;:<a href='081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> <a href='081print.mu.html#L32'>new-fake-screen</a> <span class="Constant">3/width</span>, <span class="Constant">2/height</span>
<span id="L617" class="LineNr">617 </span> <span class="Comment"># print a character</span>
<span id="L618" class="LineNr">618 </span> a:char <span class="Special">&lt;-</span> copy <span class="Constant">97/a</span>
<span id="L619" class="LineNr">619 </span> fake-screen <span class="Special">&lt;-</span> print fake-screen, a
<span id="L620" class="LineNr">620 </span> <span class="Comment"># move cursor to start of line</span>
<span id="L621" class="LineNr">621 </span> fake-screen <span class="Special">&lt;-</span> <a href='081print.mu.html#L591'>move-cursor</a> fake-screen, <span class="Constant">0/row</span>, <span class="Constant">0/column</span>
<span id="L622" class="LineNr">622 </span> run [
<span id="L623" class="LineNr">623 </span> fake-screen <span class="Special">&lt;-</span> <a href='081print.mu.html#L524'>clear-line</a> fake-screen
<span id="L624" class="LineNr">624 </span> cell:&amp;:@:<a href='081print.mu.html#L27'>screen-cell</a> <span class="Special">&lt;-</span> get *fake-screen, <span class="Constant">data:offset</span>
<span id="L625" class="LineNr">625 </span> 10:@:<a href='081print.mu.html#L27'>screen-cell</a>/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *cell
<span id="L626" class="LineNr">626 </span> ]
<span id="L627" class="LineNr">627 </span> <span class="Comment"># screen should be blank</span>
<span id="L628" class="LineNr">628 </span> memory-should-contain [
<span id="L629" class="LineNr">629 </span> <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 6</span> <span class="Comment"># width*height</span>
<span id="L630" class="LineNr">630 </span> <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
<span id="L631" class="LineNr">631 </span> <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span>
<span id="L632" class="LineNr">632 </span> <span class="Constant"> 13</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
<span id="L633" class="LineNr">633 </span> <span class="Constant"> 14</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span>
<span id="L634" class="LineNr">634 </span> <span class="Constant"> 15</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
<span id="L635" class="LineNr">635 </span> <span class="Constant"> 16</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span>
<span id="L636" class="LineNr">636 </span> <span class="Constant"> 17</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
<span id="L637" class="LineNr">637 </span> <span class="Constant"> 18</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span>
<span id="L638" class="LineNr">638 </span> <span class="Constant"> 19</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
<span id="L639" class="LineNr">639 </span> <span class="Constant"> 20</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span>
<span id="L640" class="LineNr">640 </span> <span class="Constant"> 21</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
<span id="L641" class="LineNr">641 </span> <span class="Constant"> 22</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span>
<span id="L642" class="LineNr">642 </span> ]
<span id="L643" class="LineNr">643 </span>]
<span id="L644" class="LineNr">644 </span>
<span id="L645" class="LineNr">645 </span><span class="muRecipe">def</span> <a href='081print.mu.html#L645'>cursor-down</a> <a href='081print.mu.html#L16'>screen</a>:&amp;:<a href='081print.mu.html#L16'>screen</a><span class="muRecipe"> -&gt; </span><a href='081print.mu.html#L16'>screen</a>:&amp;:<a href='081print.mu.html#L16'>screen</a> [
<span id="L646" class="LineNr">646 </span> <span class="Constant">local-scope</span>
<span id="L647" class="LineNr">647 </span> <span class="Constant">load-inputs</span>
<span id="L648" class="LineNr">648 </span><span class="CommentedCode">#? stash [cursor-down]</span>
<span id="L649" class="LineNr">649 </span> <span class="Delimiter">{</span>
<span id="L650" class="LineNr">650 </span> <span class="muControl">break-if</span> <a href='081print.mu.html#L16'>screen</a>
<span id="L651" class="LineNr">651 </span> <span class="Comment"># real screen</span>
<span id="L652" class="LineNr">652 </span> move-cursor-down-on-display
<span id="L653" class="LineNr">653 </span> <span class="muControl"> return</span>
<span id="L654" class="LineNr">654 </span> <span class="Delimiter">}</span>
<span id="L655" class="LineNr">655 </span> <span class="Comment"># fake screen</span>
<span id="L656" class="LineNr">656 </span> <a href='081print.mu.html#L206'>cursor-down-on-fake-screen</a> <a href='081print.mu.html#L16'>screen</a>
<span id="L657" class="LineNr">657 </span>]
<span id="L658" class="LineNr">658 </span>
<span id="L659" class="LineNr">659 </span><span class="muScenario">scenario</span> cursor-down-scrolls [
<span id="L660" class="LineNr">660 </span> <span class="Constant">local-scope</span>
<span id="L661" class="LineNr">661 </span> fake-screen:&amp;:<a href='081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> <a href='081print.mu.html#L32'>new-fake-screen</a> <span class="Constant">3/width</span>, <span class="Constant">2/height</span>
<span id="L662" class="LineNr">662 </span> <span class="Comment"># print something to screen and scroll</span>
<span id="L663" class="LineNr">663 </span> run [
<span id="L664" class="LineNr">664 </span> print fake-screen, <span class="Constant">[abc]</span>
<span id="L665" class="LineNr">665 </span> <a href='081print.mu.html#L752'>cursor-to-next-line</a> fake-screen
<span id="L666" class="LineNr">666 </span> <a href='081print.mu.html#L752'>cursor-to-next-line</a> fake-screen
<span id="L667" class="LineNr">667 </span> data:&amp;:@:<a href='081print.mu.html#L27'>screen-cell</a> <span class="Special">&lt;-</span> get *fake-screen, <span class="Constant">data:offset</span>
<span id="L668" class="LineNr">668 </span> 10:@:<a href='081print.mu.html#L27'>screen-cell</a>/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *data
<span id="L669" class="LineNr">669 </span> ]
<span id="L670" class="LineNr">670 </span> <span class="Comment"># screen is now blank</span>
<span id="L671" class="LineNr">671 </span> memory-should-contain [
<span id="L672" class="LineNr">672 </span> <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 6</span> <span class="Comment"># width*height</span>
<span id="L673" class="LineNr">673 </span> <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
<span id="L674" class="LineNr">674 </span> <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span> <span class="Comment"># white</span>
<span id="L675" class="LineNr">675 </span> <span class="Constant"> 13</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
<span id="L676" class="LineNr">676 </span> <span class="Constant"> 14</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span> <span class="Comment"># white</span>
<span id="L677" class="LineNr">677 </span> <span class="Constant"> 15</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
<span id="L678" class="LineNr">678 </span> <span class="Constant"> 16</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span> <span class="Comment"># white</span>
<span id="L679" class="LineNr">679 </span> <span class="Constant"> 17</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
<span id="L680" class="LineNr">680 </span> <span class="Constant"> 18</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span> <span class="Comment"># white</span>
<span id="L681" class="LineNr">681 </span> <span class="Constant"> 19</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
<span id="L682" class="LineNr">682 </span> <span class="Constant"> 20</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span> <span class="Comment"># white</span>
<span id="L683" class="LineNr">683 </span> <span class="Constant"> 21</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
<span id="L684" class="LineNr">684 </span> <span class="Constant"> 22</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span> <span class="Comment"># white</span>
<span id="L685" class="LineNr">685 </span> ]
<span id="L686" class="LineNr">686 </span>]
<span id="L687" class="LineNr">687 </span>
<span id="L688" class="LineNr">688 </span><span class="muRecipe">def</span> <a href='081print.mu.html#L688'>cursor-up</a> <a href='081print.mu.html#L16'>screen</a>:&amp;:<a href='081print.mu.html#L16'>screen</a><span class="muRecipe"> -&gt; </span><a href='081print.mu.html#L16'>screen</a>:&amp;:<a href='081print.mu.html#L16'>screen</a> [
<span id="L689" class="LineNr">689 </span> <span class="Constant">local-scope</span>
<span id="L690" class="LineNr">690 </span> <span class="Constant">load-inputs</span>
<span id="L691" class="LineNr">691 </span><span class="CommentedCode">#? stash [cursor-up]</span>
<span id="L692" class="LineNr">692 </span> <span class="Delimiter">{</span>
<span id="L693" class="LineNr">693 </span> <span class="muControl">break-if</span> <a href='081print.mu.html#L16'>screen</a>
<span id="L694" class="LineNr">694 </span> <span class="Comment"># real screen</span>
<span id="L695" class="LineNr">695 </span> move-cursor-up-on-display
<span id="L696" class="LineNr">696 </span> <span class="muControl"> return</span>
<span id="L697" class="LineNr">697 </span> <span class="Delimiter">}</span>
<span id="L698" class="LineNr">698 </span> <span class="Comment"># fake screen</span>
<span id="L699" class="LineNr">699 </span> row:num <span class="Special">&lt;-</span> get *screen, <span class="Constant">cursor-row:offset</span>
<span id="L700" class="LineNr">700 </span> at-top?:bool <span class="Special">&lt;-</span> lesser-or-equal row,<span class="Constant"> 0</span>
<span id="L701" class="LineNr">701 </span> <span class="muControl">return-if</span> at-top?
<span id="L702" class="LineNr">702 </span> row <span class="Special">&lt;-</span> subtract row,<span class="Constant"> 1</span>
<span id="L703" class="LineNr">703 </span> *screen <span class="Special">&lt;-</span> put *screen, <span class="Constant">cursor-row:offset</span>, row
<span id="L704" class="LineNr">704 </span>]
<span id="L705" class="LineNr">705 </span>
<span id="L706" class="LineNr">706 </span><span class="muRecipe">def</span> <a href='081print.mu.html#L706'>cursor-right</a> <a href='081print.mu.html#L16'>screen</a>:&amp;:<a href='081print.mu.html#L16'>screen</a><span class="muRecipe"> -&gt; </span><a href='081print.mu.html#L16'>screen</a>:&amp;:<a href='081print.mu.html#L16'>screen</a> [
<span id="L707" class="LineNr">707 </span> <span class="Constant">local-scope</span>
<span id="L708" class="LineNr">708 </span> <span class="Constant">load-inputs</span>
<span id="L709" class="LineNr">709 </span><span class="CommentedCode">#? stash [cursor-right]</span>
<span id="L710" class="LineNr">710 </span> <span class="Delimiter">{</span>
<span id="L711" class="LineNr">711 </span> <span class="muControl">break-if</span> <a href='081print.mu.html#L16'>screen</a>
<span id="L712" class="LineNr">712 </span> <span class="Comment"># real screen</span>
<span id="L713" class="LineNr">713 </span> move-cursor-right-on-display
<span id="L714" class="LineNr">714 </span> <span class="muControl"> return</span>
<span id="L715" class="LineNr">715 </span> <span class="Delimiter">}</span>
<span id="L716" class="LineNr">716 </span> <span class="Comment"># fake screen</span>
<span id="L717" class="LineNr">717 </span> width:num <span class="Special">&lt;-</span> get *screen, <span class="Constant">num-columns:offset</span>
<span id="L718" class="LineNr">718 </span> column:num <span class="Special">&lt;-</span> get *screen, <span class="Constant">cursor-column:offset</span>
<span id="L719" class="LineNr">719 </span> max:num <span class="Special">&lt;-</span> subtract width,<span class="Constant"> 1</span>
<span id="L720" class="LineNr">720 </span> at-bottom?:bool <span class="Special">&lt;-</span> greater-or-equal column, max
<span id="L721" class="LineNr">721 </span> <span class="muControl">return-if</span> at-bottom?
<span id="L722" class="LineNr">722 </span> column <span class="Special">&lt;-</span> add column,<span class="Constant"> 1</span>
<span id="L723" class="LineNr">723 </span> *screen <span class="Special">&lt;-</span> put *screen, <span class="Constant">cursor-column:offset</span>, column
<span id="L724" class="LineNr">724 </span>]
<span id="L725" class="LineNr">725 </span>
<span id="L726" class="LineNr">726 </span><span class="muRecipe">def</span> <a href='081print.mu.html#L726'>cursor-left</a> <a href='081print.mu.html#L16'>screen</a>:&amp;:<a href='081print.mu.html#L16'>screen</a><span class="muRecipe"> -&gt; </span><a href='081print.mu.html#L16'>screen</a>:&amp;:<a href='081print.mu.html#L16'>screen</a> [
<span id="L727" class="LineNr">727 </span> <span class="Constant">local-scope</span>
<span id="L728" class="LineNr">728 </span> <span class="Constant">load-inputs</span>
<span id="L729" class="LineNr">729 </span><span class="CommentedCode">#? stash [cursor-left]</span>
<span id="L730" class="LineNr">730 </span> <span class="Delimiter">{</span>
<span id="L731" class="LineNr">731 </span> <span class="muControl">break-if</span> <a href='081print.mu.html#L16'>screen</a>
<span id="L732" class="LineNr">732 </span> <span class="Comment"># real screen</span>
<span id="L733" class="LineNr">733 </span> move-cursor-left-on-display
<span id="L734" class="LineNr">734 </span> <span class="muControl"> return</span>
<span id="L735" class="LineNr">735 </span> <span class="Delimiter">}</span>
<span id="L736" class="LineNr">736 </span> <span class="Comment"># fake screen</span>
<span id="L737" class="LineNr">737 </span> column:num <span class="Special">&lt;-</span> get *screen, <span class="Constant">cursor-column:offset</span>
<span id="L738" class="LineNr">738 </span> at-top?:bool <span class="Special">&lt;-</span> lesser-or-equal column,<span class="Constant"> 0</span>
<span id="L739" class="LineNr">739 </span> <span class="muControl">return-if</span> at-top?
<span id="L740" class="LineNr">740 </span> column <span class="Special">&lt;-</span> subtract column,<span class="Constant"> 1</span>
<span id="L741" class="LineNr">741 </span> *screen <span class="Special">&lt;-</span> put *screen, <span class="Constant">cursor-column:offset</span>, column
<span id="L742" class="LineNr">742 </span>]
<span id="L743" class="LineNr">743 </span>
<span id="L744" class="LineNr">744 </span><span class="muRecipe">def</span> <a href='081print.mu.html#L744'>cursor-to-start-of-line</a> <a href='081print.mu.html#L16'>screen</a>:&amp;:<a href='081print.mu.html#L16'>screen</a><span class="muRecipe"> -&gt; </span><a href='081print.mu.html#L16'>screen</a>:&amp;:<a href='081print.mu.html#L16'>screen</a> [
<span id="L745" class="LineNr">745 </span> <span class="Constant">local-scope</span>
<span id="L746" class="LineNr">746 </span> <span class="Constant">load-inputs</span>
<span id="L747" class="LineNr">747 </span><span class="CommentedCode">#? stash [cursor-to-start-of-line]</span>
<span id="L748" class="LineNr">748 </span> row:num <span class="Special">&lt;-</span> <a href='081print.mu.html#L577'>cursor-position</a> <a href='081print.mu.html#L16'>screen</a>
<span id="L749" class="LineNr">749 </span> <a href='081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> <a href='081print.mu.html#L591'>move-cursor</a> <a href='081print.mu.html#L16'>screen</a>, row, <span class="Constant">0/column</span>
<span id="L750" class="LineNr">750 </span>]
<span id="L751" class="LineNr">751 </span>
<span id="L752" class="LineNr">752 </span><span class="muRecipe">def</span> <a href='081print.mu.html#L752'>cursor-to-next-line</a> <a href='081print.mu.html#L16'>screen</a>:&amp;:<a href='081print.mu.html#L16'>screen</a><span class="muRecipe"> -&gt; </span><a href='081print.mu.html#L16'>screen</a>:&amp;:<a href='081print.mu.html#L16'>screen</a> [
<span id="L753" class="LineNr">753 </span> <span class="Constant">local-scope</span>
<span id="L754" class="LineNr">754 </span> <span class="Constant">load-inputs</span>
<span id="L755" class="LineNr">755 </span><span class="CommentedCode">#? stash [cursor-to-next-line]</span>
<span id="L756" class="LineNr">756 </span> <a href='081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> <a href='081print.mu.html#L645'>cursor-down</a> <a href='081print.mu.html#L16'>screen</a>
<span id="L757" class="LineNr">757 </span> <a href='081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> <a href='081print.mu.html#L744'>cursor-to-start-of-line</a> <a href='081print.mu.html#L16'>screen</a>
<span id="L758" class="LineNr">758 </span>]
<span id="L759" class="LineNr">759 </span>
<span id="L760" class="LineNr">760 </span><span class="muRecipe">def</span> <a href='081print.mu.html#L760'>move-cursor-to-column</a> <a href='081print.mu.html#L16'>screen</a>:&amp;:<a href='081print.mu.html#L16'>screen</a>, column:num<span class="muRecipe"> -&gt; </span><a href='081print.mu.html#L16'>screen</a>:&amp;:<a href='081print.mu.html#L16'>screen</a> [
<span id="L761" class="LineNr">761 </span> <span class="Constant">local-scope</span>
<span id="L762" class="LineNr">762 </span> <span class="Constant">load-inputs</span>
<span id="L763" class="LineNr">763 </span> row:num, _ <span class="Special">&lt;-</span> <a href='081print.mu.html#L577'>cursor-position</a> <a href='081print.mu.html#L16'>screen</a>
<span id="L764" class="LineNr">764 </span><span class="CommentedCode">#? stash [move-cursor-to-column] row</span>
<span id="L765" class="LineNr">765 </span> <a href='081print.mu.html#L591'>move-cursor</a> <a href='081print.mu.html#L16'>screen</a>, row, column
<span id="L766" class="LineNr">766 </span>]
<span id="L767" class="LineNr">767 </span>
<span id="L768" class="LineNr">768 </span><span class="muRecipe">def</span> <a href='081print.mu.html#L768'>screen-width</a> <a href='081print.mu.html#L16'>screen</a>:&amp;:<a href='081print.mu.html#L16'>screen</a><span class="muRecipe"> -&gt; </span>width:num [
<span id="L769" class="LineNr">769 </span> <span class="Constant">local-scope</span>
<span id="L770" class="LineNr">770 </span> <span class="Constant">load-inputs</span>
<span id="L771" class="LineNr">771 </span><span class="CommentedCode">#? stash [screen-width]</span>
<span id="L772" class="LineNr">772 </span> <span class="Delimiter">{</span>
<span id="L773" class="LineNr">773 </span> <span class="muControl">break-unless</span> <a href='081print.mu.html#L16'>screen</a>
<span id="L774" class="LineNr">774 </span> <span class="Comment"># fake screen</span>
<span id="L775" class="LineNr">775 </span> width <span class="Special">&lt;-</span> get *screen, <span class="Constant">num-columns:offset</span>
<span id="L776" class="LineNr">776 </span> <span class="muControl"> return</span>
<span id="L777" class="LineNr">777 </span> <span class="Delimiter">}</span>
<span id="L778" class="LineNr">778 </span> <span class="Comment"># real screen</span>
<span id="L779" class="LineNr">779 </span> width <span class="Special">&lt;-</span> display-width
<span id="L780" class="LineNr">780 </span>]
<span id="L781" class="LineNr">781 </span>
<span id="L782" class="LineNr">782 </span><span class="muRecipe">def</span> <a href='081print.mu.html#L782'>screen-height</a> <a href='081print.mu.html#L16'>screen</a>:&amp;:<a href='081print.mu.html#L16'>screen</a><span class="muRecipe"> -&gt; </span>height:num [
<span id="L783" class="LineNr">783 </span> <span class="Constant">local-scope</span>
<span id="L784" class="LineNr">784 </span> <span class="Constant">load-inputs</span>
<span id="L785" class="LineNr">785 </span><span class="CommentedCode">#? stash [screen-height]</span>
<span id="L786" class="LineNr">786 </span> <span class="Delimiter">{</span>
<span id="L787" class="LineNr">787 </span> <span class="muControl">break-unless</span> <a href='081print.mu.html#L16'>screen</a>
<span id="L788" class="LineNr">788 </span> <span class="Comment"># fake screen</span>
<span id="L789" class="LineNr">789 </span> height <span class="Special">&lt;-</span> get *screen, <span class="Constant">num-rows:offset</span>
<span id="L790" class="LineNr">790 </span> <span class="muControl"> return</span>
<span id="L791" class="LineNr">791 </span> <span class="Delimiter">}</span>
<span id="L792" class="LineNr">792 </span> <span class="Comment"># real screen</span>
<span id="L793" class="LineNr">793 </span> height <span class="Special">&lt;-</span> display-height
<span id="L794" class="LineNr">794 </span>]
<span id="L795" class="LineNr">795 </span>
<span id="L796" class="LineNr">796 </span><span class="muRecipe">def</span> print <a href='081print.mu.html#L16'>screen</a>:&amp;:<a href='081print.mu.html#L16'>screen</a>, s:text<span class="muRecipe"> -&gt; </span><a href='081print.mu.html#L16'>screen</a>:&amp;:<a href='081print.mu.html#L16'>screen</a> [
<span id="L797" class="LineNr">797 </span> <span class="Constant">local-scope</span>
<span id="L798" class="LineNr">798 </span> <span class="Constant">load-inputs</span>
<span id="L799" class="LineNr">799 </span> color:num, color-found?:bool <span class="Special">&lt;-</span> <span class="Constant">next-input</span>
<span id="L800" class="LineNr">800 </span> <span class="Delimiter">{</span>
<span id="L801" class="LineNr">801 </span> <span class="Comment"># default color to white</span>
<span id="L802" class="LineNr">802 </span> <span class="muControl">break-if</span> color-found?
<span id="L803" class="LineNr">803 </span> color <span class="Special">&lt;-</span> copy <span class="Constant">7/white</span>
<span id="L804" class="LineNr">804 </span> <span class="Delimiter">}</span>
<span id="L805" class="LineNr">805 </span> bg-color:num, bg-color-found?:bool <span class="Special">&lt;-</span> <span class="Constant">next-input</span>
<span id="L806" class="LineNr">806 </span> <span class="Delimiter">{</span>
<span id="L807" class="LineNr">807 </span> <span class="Comment"># default bg-color to black</span>
<span id="L808" class="LineNr">808 </span> <span class="muControl">break-if</span> bg-color-found?
<span id="L809" class="LineNr">809 </span> bg-color <span class="Special">&lt;-</span> copy <span class="Constant">0/black</span>
<span id="L810" class="LineNr">810 </span> <span class="Delimiter">}</span>
<span id="L811" class="LineNr">811 </span> len:num <span class="Special">&lt;-</span> length *s
<span id="L812" class="LineNr">812 </span> i:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
<span id="L813" class="LineNr">813 </span> <span class="Delimiter">{</span>
<span id="L814" class="LineNr">814 </span> done?:bool <span class="Special">&lt;-</span> greater-or-equal i, len
<span id="L815" class="LineNr">815 </span> <span class="muControl">break-if</span> done?
<span id="L816" class="LineNr">816 </span> c:char <span class="Special">&lt;-</span> index *s, i
<span id="L817" class="LineNr">817 </span> print <a href='081print.mu.html#L16'>screen</a>, c, color, bg-color
<span id="L818" class="LineNr">818 </span> i <span class="Special">&lt;-</span> add i,<span class="Constant"> 1</span>
<span id="L819" class="LineNr">819 </span> <span class="muControl"> loop</span>
<span id="L820" class="LineNr">820 </span> <span class="Delimiter">}</span>
<span id="L821" class="LineNr">821 </span>]
<span id="L822" class="LineNr">822 </span>
<span id="L823" class="LineNr">823 </span><span class="muScenario">scenario</span> print-text-wraps-past-right-margin [
<span id="L824" class="LineNr">824 </span> <span class="Constant">local-scope</span>
<span id="L825" class="LineNr">825 </span> fake-screen:&amp;:<a href='081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> <a href='081print.mu.html#L32'>new-fake-screen</a> <span class="Constant">3/width</span>, <span class="Constant">2/height</span>
<span id="L826" class="LineNr">826 </span> run [
<span id="L827" class="LineNr">827 </span> fake-screen <span class="Special">&lt;-</span> print fake-screen, <span class="Constant">[abcd]</span>
<span id="L828" class="LineNr">828 </span> 5:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *fake-screen, <span class="Constant">cursor-row:offset</span>
<span id="L829" class="LineNr">829 </span> 6:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *fake-screen, <span class="Constant">cursor-column:offset</span>
<span id="L830" class="LineNr">830 </span> 7:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *fake-screen, <span class="Constant">top-idx:offset</span>
<span id="L831" class="LineNr">831 </span> cell:&amp;:@:<a href='081print.mu.html#L27'>screen-cell</a> <span class="Special">&lt;-</span> get *fake-screen, <span class="Constant">data:offset</span>
<span id="L832" class="LineNr">832 </span> 10:@:<a href='081print.mu.html#L27'>screen-cell</a>/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *cell
<span id="L833" class="LineNr">833 </span> ]
<span id="L834" class="LineNr">834 </span> memory-should-contain [
<span id="L835" class="LineNr">835 </span> <span class="Constant"> 5</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span> <span class="Comment"># cursor-row</span>
<span id="L836" class="LineNr">836 </span> <span class="Constant"> 6</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span> <span class="Comment"># cursor-column</span>
<span id="L837" class="LineNr">837 </span> <span class="Constant"> 7</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span> <span class="Comment"># top-idx</span>
<span id="L838" class="LineNr">838 </span> <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 6</span> <span class="Comment"># width*height</span>
<span id="L839" class="LineNr">839 </span> <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 97</span> <span class="Comment"># 'a'</span>
<span id="L840" class="LineNr">840 </span> <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span> <span class="Comment"># white</span>
<span id="L841" class="LineNr">841 </span> <span class="Constant"> 13</span> <span class="Special">&lt;-</span><span class="Constant"> 98</span> <span class="Comment"># 'b'</span>
<span id="L842" class="LineNr">842 </span> <span class="Constant"> 14</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span> <span class="Comment"># white</span>
<span id="L843" class="LineNr">843 </span> <span class="Constant"> 15</span> <span class="Special">&lt;-</span><span class="Constant"> 99</span> <span class="Comment"># 'c'</span>
<span id="L844" class="LineNr">844 </span> <span class="Constant"> 16</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span> <span class="Comment"># white</span>
<span id="L845" class="LineNr">845 </span> <span class="Constant"> 17</span> <span class="Special">&lt;-</span><span class="Constant"> 100</span> <span class="Comment"># 'd'</span>
<span id="L846" class="LineNr">846 </span> <span class="Constant"> 18</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span> <span class="Comment"># white</span>
<span id="L847" class="LineNr">847 </span> <span class="Comment"># rest of screen is empty</span>
<span id="L848" class="LineNr">848 </span> <span class="Constant"> 19</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
<span id="L849" class="LineNr">849 </span> ]
<span id="L850" class="LineNr">850 </span>]
<span id="L851" class="LineNr">851 </span>
<span id="L852" class="LineNr">852 </span><span class="muRecipe">def</span> print <a href='081print.mu.html#L16'>screen</a>:&amp;:<a href='081print.mu.html#L16'>screen</a>, n:num<span class="muRecipe"> -&gt; </span><a href='081print.mu.html#L16'>screen</a>:&amp;:<a href='081print.mu.html#L16'>screen</a> [
<span id="L853" class="LineNr">853 </span> <span class="Constant">local-scope</span>
<span id="L854" class="LineNr">854 </span> <span class="Constant">load-inputs</span>
<span id="L855" class="LineNr">855 </span> color:num, color-found?:bool <span class="Special">&lt;-</span> <span class="Constant">next-input</span>
<span id="L856" class="LineNr">856 </span> <span class="Delimiter">{</span>
<span id="L857" class="LineNr">857 </span> <span class="Comment"># default color to white</span>
<span id="L858" class="LineNr">858 </span> <span class="muControl">break-if</span> color-found?
<span id="L859" class="LineNr">859 </span> color <span class="Special">&lt;-</span> copy <span class="Constant">7/white</span>
<span id="L860" class="LineNr">860 </span> <span class="Delimiter">}</span>
<span id="L861" class="LineNr">861 </span> bg-color:num, bg-color-found?:bool <span class="Special">&lt;-</span> <span class="Constant">next-input</span>
<span id="L862" class="LineNr">862 </span> <span class="Delimiter">{</span>
<span id="L863" class="LineNr">863 </span> <span class="Comment"># default bg-color to black</span>
<span id="L864" class="LineNr">864 </span> <span class="muControl">break-if</span> bg-color-found?
<span id="L865" class="LineNr">865 </span> bg-color <span class="Special">&lt;-</span> copy <span class="Constant">0/black</span>
<span id="L866" class="LineNr">866 </span> <span class="Delimiter">}</span>
<span id="L867" class="LineNr">867 </span> <span class="Comment"># todo: other bases besides decimal</span>
<span id="L868" class="LineNr">868 </span> s:text <span class="Special">&lt;-</span> to-text n
<span id="L869" class="LineNr">869 </span> <a href='081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> print <a href='081print.mu.html#L16'>screen</a>, s, color, bg-color
<span id="L870" class="LineNr">870 </span>]
<span id="L871" class="LineNr">871 </span>
<span id="L872" class="LineNr">872 </span><span class="muRecipe">def</span> print <a href='081print.mu.html#L16'>screen</a>:&amp;:<a href='081print.mu.html#L16'>screen</a>, n:bool<span class="muRecipe"> -&gt; </span><a href='081print.mu.html#L16'>screen</a>:&amp;:<a href='081print.mu.html#L16'>screen</a> [
<span id="L873" class="LineNr">873 </span> <span class="Constant">local-scope</span>
<span id="L874" class="LineNr">874 </span> <span class="Constant">load-inputs</span>
<span id="L875" class="LineNr">875 </span> color:num, color-found?:bool <span class="Special">&lt;-</span> <span class="Constant">next-input</span>
<span id="L876" class="LineNr">876 </span> <span class="Delimiter">{</span>
<span id="L877" class="LineNr">877 </span> <span class="Comment"># default color to white</span>
<span id="L878" class="LineNr">878 </span> <span class="muControl">break-if</span> color-found?
<span id="L879" class="LineNr">879 </span> color <span class="Special">&lt;-</span> copy <span class="Constant">7/white</span>
<span id="L880" class="LineNr">880 </span> <span class="Delimiter">}</span>
<span id="L881" class="LineNr">881 </span> bg-color:num, bg-color-found?:bool <span class="Special">&lt;-</span> <span class="Constant">next-input</span>
<span id="L882" class="LineNr">882 </span> <span class="Delimiter">{</span>
<span id="L883" class="LineNr">883 </span> <span class="Comment"># default bg-color to black</span>
<span id="L884" class="LineNr">884 </span> <span class="muControl">break-if</span> bg-color-found?
<span id="L885" class="LineNr">885 </span> bg-color <span class="Special">&lt;-</span> copy <span class="Constant">0/black</span>
<span id="L886" class="LineNr">886 </span> <span class="Delimiter">}</span>
<span id="L887" class="LineNr">887 </span> <span class="Delimiter">{</span>
<span id="L888" class="LineNr">888 </span> <span class="muControl">break-if</span> n
<span id="L889" class="LineNr">889 </span> <a href='081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> print <a href='081print.mu.html#L16'>screen</a>, <span class="Constant">[false]</span>, color, bg-color
<span id="L890" class="LineNr">890 </span> <span class="Delimiter">}</span>
<span id="L891" class="LineNr">891 </span> <span class="Delimiter">{</span>
<span id="L892" class="LineNr">892 </span> <span class="muControl">break-unless</span> n
<span id="L893" class="LineNr">893 </span> <a href='081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> print <a href='081print.mu.html#L16'>screen</a>, <span class="Constant">[true]</span>, color, bg-color
<span id="L894" class="LineNr">894 </span> <span class="Delimiter">}</span>
<span id="L895" class="LineNr">895 </span>]
<span id="L896" class="LineNr">896 </span>
<span id="L897" class="LineNr">897 </span><span class="muRecipe">def</span> print <a href='081print.mu.html#L16'>screen</a>:&amp;:<a href='081print.mu.html#L16'>screen</a>, n:&amp;:_elem<span class="muRecipe"> -&gt; </span><a href='081print.mu.html#L16'>screen</a>:&amp;:<a href='081print.mu.html#L16'>screen</a> [
<span id="L898" class="LineNr">898 </span> <span class="Constant">local-scope</span>
<span id="L899" class="LineNr">899 </span> <span class="Constant">load-inputs</span>
<span id="L900" class="LineNr">900 </span> color:num, color-found?:bool <span class="Special">&lt;-</span> <span class="Constant">next-input</span>
<span id="L901" class="LineNr">901 </span> <span class="Delimiter">{</span>
<span id="L902" class="LineNr">902 </span> <span class="Comment"># default color to white</span>
<span id="L903" class="LineNr">903 </span> <span class="muControl">break-if</span> color-found?
<span id="L904" class="LineNr">904 </span> color <span class="Special">&lt;-</span> copy <span class="Constant">7/white</span>
<span id="L905" class="LineNr">905 </span> <span class="Delimiter">}</span>
<span id="L906" class="LineNr">906 </span> bg-color:num, bg-color-found?:bool <span class="Special">&lt;-</span> <span class="Constant">next-input</span>
<span id="L907" class="LineNr">907 </span> <span class="Delimiter">{</span>
<span id="L908" class="LineNr">908 </span> <span class="Comment"># default bg-color to black</span>
<span id="L909" class="LineNr">909 </span> <span class="muControl">break-if</span> bg-color-found?
<span id="L910" class="LineNr">910 </span> bg-color <span class="Special">&lt;-</span> copy <span class="Constant">0/black</span>
<span id="L911" class="LineNr">911 </span> <span class="Delimiter">}</span>
<span id="L912" class="LineNr">912 </span> n2:num <span class="Special">&lt;-</span> deaddress n
<span id="L913" class="LineNr">913 </span> <a href='081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> print <a href='081print.mu.html#L16'>screen</a>, n2, color, bg-color
<span id="L914" class="LineNr">914 </span>]
</pre>
</body>
</html>
<!-- vim: set foldmethod=manual : -->