/doc/pydoc/

#n193'>193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276
<!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 - 088file.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; }
.muControl { color: #804000; }
.muRecipe { color: #ff8700; }
.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/088file.mu'>https://github.com/akkartik/mu/blob/master/088file.mu</a>
<pre id='vimCodeElement'>
<span id="L1" class="LineNr">  1 </span><span class="Comment"># Wrappers around file system primitives that take a 'resources' object and</span>
<span id="L2" class="LineNr">  2 </span><span class="Comment"># are thus 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"># - start-reading - asynchronously open a file, returning a channel source for</span>
<span id="L5" class="LineNr">  5 </span><span class="Comment">#   receiving the results</span>
<span id="L6" class="LineNr">  6 </span><span class="Comment"># - start-writing - asynchronously open a file, returning a channel sink for</span>
<span id="L7" class="LineNr">  7 </span><span class="Comment">#   the data to write</span>
<span id="L8" class="LineNr">  8 </span><span class="Comment"># - slurp - synchronously read from a file</span>
<span id="L9" class="LineNr">  9 </span><span class="Comment"># - dump - synchronously write to a file</span>
<span id="L10" class="LineNr"> 10 </span>
<span id="L11" class="LineNr"> 11 </span><span class="muData">container</span> <a href='088file.mu.html#L11'>resources</a> [
<span id="L12" class="LineNr"> 12 </span>  lock:bool
<span id="L13" class="LineNr"> 13 </span>  data:&amp;:@:<a href='088file.mu.html#L16'>resource</a>
<span id="L14" class="LineNr"> 14 </span>]
<span id="L15" class="LineNr"> 15 </span>
<span id="L16" class="LineNr"> 16 </span><span class="muData">container</span> <a href='088file.mu.html#L16'>resource</a> [
<span id="L17" class="LineNr"> 17 </span>  name:text
<span id="L18" class="LineNr"> 18 </span>  contents:text
<span id="L19" class="LineNr"> 19 </span>]
<span id="L20" class="LineNr"> 20 </span>
<span id="L21" class="LineNr"> 21 </span><span class="muRecipe">def</span> <a href='088file.mu.html#L21'>start-reading</a> <a href='088file.mu.html#L11'>resources</a>:&amp;:<a href='088file.mu.html#L11'>resources</a>, filename:text<span class="muRecipe"> -&gt; </span>contents:&amp;:<a href='075channel.mu.html#L36'>source</a>:char, error?:bool [
<span id="L22" class="LineNr"> 22 </span>  <span class="Constant">local-scope</span>
<span id="L23" class="LineNr"> 23 </span>  <span class="Constant">load-inputs</span>
<span id="L24" class="LineNr"> 24 </span>  error? <span class="Special">&lt;-</span> copy<span class="Constant"> false</span>
<span id="L25" class="LineNr"> 25 </span>  <span class="Delimiter">{</span>
<span id="L26" class="LineNr"> 26 </span>    <span class="muControl">break-unless</span> <a href='088file.mu.html#L11'>resources</a>
<span id="L27" class="LineNr"> 27 </span>    <span class="Comment"># fake file system</span>
<span id="L28" class="LineNr"> 28 </span>    contents, error? <span class="Special">&lt;-</span> <a href='088file.mu.html#L53'>start-reading-from-fake-resource</a> <a href='088file.mu.html#L11'>resources</a>, filename
<span id="L29" class="LineNr"> 29 </span>   <span class="muControl"> return</span>
<span id="L30" class="LineNr"> 30 </span>  <span class="Delimiter">}</span>
<span id="L31" class="LineNr"> 31 </span>  <span class="Comment"># real file system</span>
<span id="L32" class="LineNr"> 32 </span>  file:num <span class="Special">&lt;-</span> $open-file-for-reading filename
<span id="L33" class="LineNr"> 33 </span>  <span class="muControl">return-unless</span> file,<span class="Constant"> null/no-contents, true/error</span>
<span id="L34" class="LineNr"> 34 </span>  contents:&amp;:<a href='075channel.mu.html#L36'>source</a>:char, <a href='075channel.mu.html#L40'>sink</a>:&amp;:<a href='075channel.mu.html#L40'>sink</a>:char <span class="Special">&lt;-</span> <a href='075channel.mu.html#L44'>new-channel</a><span class="Constant"> 30</span>
<span id="L35" class="LineNr"> 35 </span>  <span class="muControl">start-running</span> <a href='088file.mu.html#L76'>receive-from-file</a> file, <a href='075channel.mu.html#L40'>sink</a>
<span id="L36" class="LineNr"> 36 </span>]
<span id="L37" class="LineNr"> 37 </span>
<span id="L38" class="LineNr"> 38 </span><span class="muRecipe">def</span> <a href='088file.mu.html#L38'>slurp</a> <a href='088file.mu.html#L11'>resources</a>:&amp;:<a href='088file.mu.html#L11'>resources</a>, filename:text<span class="muRecipe"> -&gt; </span>contents:text, error?:bool [
<span id="L39" class="LineNr"> 39 </span>  <span class="Constant">local-scope</span>
<span id="L40" class="LineNr"> 40 </span>  <span class="Constant">load-inputs</span>
<span id="L41" class="LineNr"> 41 </span>  <a href='075channel.mu.html#L36'>source</a>:&amp;:<a href='075channel.mu.html#L36'>source</a>:char, error?:bool <span class="Special">&lt;-</span> <a href='088file.mu.html#L21'>start-reading</a> <a href='088file.mu.html#L11'>resources</a>, filename
<span id="L42" class="LineNr"> 42 </span>  <span class="muControl">return-if</span> error?,<span class="Constant"> null/no-contents</span>
<span id="L43" class="LineNr"> 43 </span>  buf:&amp;:<a href='061text.mu.html#L120'>buffer</a>:char <span class="Special">&lt;-</span> <a href='061text.mu.html#L125'>new-buffer</a> <span class="Constant">30/capacity</span>
<span id="L44" class="LineNr"> 44 </span>  <span class="Delimiter">{</span>
<span id="L45" class="LineNr"> 45 </span>    c:char, done?:bool, <a href='075channel.mu.html#L36'>source</a> <span class="Special">&lt;-</span> read <a href='075channel.mu.html#L36'>source</a>
<span id="L46" class="LineNr"> 46 </span>    <span class="muControl">break-if</span> done?
<span id="L47" class="LineNr"> 47 </span>    buf <span class="Special">&lt;-</span> append buf, c
<span id="L48" class="LineNr"> 48 </span>   <span class="muControl"> loop</span>
<span id="L49" class="LineNr"> 49 </span>  <span class="Delimiter">}</span>
<span id="L50" class="LineNr"> 50 </span>  contents <span class="Special">&lt;-</span> <a href='061text.mu.html#L338'>buffer-to-array</a> buf
<span id="L51" class="LineNr"> 51 </span>]
<span id="L52" class="LineNr"> 52 </span>
<span id="L53" class="LineNr"> 53 </span><span class="muRecipe">def</span> <a href='088file.mu.html#L53'>start-reading-from-fake-resource</a> <a href='088file.mu.html#L11'>resources</a>:&amp;:<a href='088file.mu.html#L11'>resources</a>, <a href='088file.mu.html#L16'>resource</a>:text<span class="muRecipe"> -&gt; </span>contents:&amp;:<a href='075channel.mu.html#L36'>source</a>:char, error?:bool [
<span id="L54" class="LineNr"> 54 </span>  <span class="Constant">local-scope</span>
<span id="L55" class="LineNr"> 55 </span>  <span class="Constant">load-inputs</span>
<span id="L56" class="LineNr"> 56 </span>  error? <span class="Special">&lt;-</span> copy<span class="Constant"> false</span>
<span id="L57" class="LineNr"> 57 </span>  i:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
<span id="L58" class="LineNr"> 58 </span>  data:&amp;:@:<a href='088file.mu.html#L16'>resource</a> <span class="Special">&lt;-</span> get *resources, <span class="Constant">data:offset</span>
<span id="L59" class="LineNr"> 59 </span>  len:num <span class="Special">&lt;-</span> length *data
<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, len
<span id="L62" class="LineNr"> 62 </span>    <span class="muControl">break-if</span> done?
<span id="L63" class="LineNr"> 63 </span>    tmp:<a href='088file.mu.html#L16'>resource</a> <span class="Special">&lt;-</span> index *data, i
<span id="L64" class="LineNr"> 64 </span>    i <span class="Special">&lt;-</span> add i,<span class="Constant"> 1</span>
<span id="L65" class="LineNr"> 65 </span>    curr-resource:text <span class="Special">&lt;-</span> get tmp, <span class="Constant">name:offset</span>
<span id="L66" class="LineNr"> 66 </span>    found?:bool <span class="Special">&lt;-</span> equal <a href='088file.mu.html#L16'>resource</a>, curr-resource
<span id="L67" class="LineNr"> 67 </span>    <span class="muControl">loop-unless</span> found?
<span id="L68" class="LineNr"> 68 </span>    contents:&amp;:<a href='075channel.mu.html#L36'>source</a>:char, <a href='075channel.mu.html#L40'>sink</a>:&amp;:<a href='075channel.mu.html#L40'>sink</a>:char <span class="Special">&lt;-</span> <a href='075channel.mu.html#L44'>new-channel</a><span class="Constant"> 30</span>
<span id="L69" class="LineNr"> 69 </span>    curr-contents:text <span class="Special">&lt;-</span> get tmp, <span class="Constant">contents:offset</span>
<span id="L70" class="LineNr"> 70 </span>    <span class="muControl">start-running</span> <a href='088file.mu.html#L89'>receive-from-text</a> curr-contents, <a href='075channel.mu.html#L40'>sink</a>
<span id="L71" class="LineNr"> 71 </span>   <span class="muControl"> return</span>
<span id="L72" class="LineNr"> 72 </span>  <span class="Delimiter">}</span>
<span id="L73" class="LineNr"> 73 </span> <span class="muControl"> return</span><span class="Constant"> null/no-such-resource, true/error-found</span>
<span id="L74" class="LineNr"> 74 </span>]
<span id="L75" class="LineNr"> 75 </span>
<span id="L76" class="LineNr"> 76 </span><span class="muRecipe">def</span> <a href='088file.mu.html#L76'>receive-from-file</a> file:num, <a href='075channel.mu.html#L40'>sink</a>:&amp;:<a href='075channel.mu.html#L40'>sink</a>:char<span class="muRecipe"> -&gt; </span><a href='075channel.mu.html#L40'>sink</a>:&amp;:<a href='075channel.mu.html#L40'>sink</a>:char [
<span id="L77" class="LineNr"> 77 </span>  <span class="Constant">local-scope</span>
<span id="L78" class="LineNr"> 78 </span>  <span class="Constant">load-inputs</span>
<span id="L79" class="LineNr"> 79 </span>  <span class="Delimiter">{</span>
<span id="L80" class="LineNr"> 80 </span>    c:char, eof?:bool <span class="Special">&lt;-</span> $read-from-file file
<span id="L81" class="LineNr"> 81 </span>    <span class="muControl">break-if</span> eof?
<span id="L82" class="LineNr"> 82 </span>    <a href='075channel.mu.html#L40'>sink</a> <span class="Special">&lt;-</span> <a href='075channel.mu.html#L60'>write</a> <a href='075channel.mu.html#L40'>sink</a>, c
<span id="L83" class="LineNr"> 83 </span>   <span class="muControl"> loop</span>
<span id="L84" class="LineNr"> 84 </span>  <span class="Delimiter">}</span>
<span id="L85" class="LineNr"> 85 </span>  <a href='075channel.mu.html#L40'>sink</a> <span class="Special">&lt;-</span> close <a href='075channel.mu.html#L40'>sink</a>
<span id="L86" class="LineNr"> 86 </span>  file <span class="Special">&lt;-</span> $close-file file
<span id="L87" class="LineNr"> 87 </span>]
<span id="L88" class="LineNr"> 88 </span>
<span id="L89" class="LineNr"> 89 </span><span class="muRecipe">def</span> <a href='088file.mu.html#L89'>receive-from-text</a> contents:text, <a href='075channel.mu.html#L40'>sink</a>:&amp;:<a href='075channel.mu.html#L40'>sink</a>:char<span class="muRecipe"> -&gt; </span><a href='075channel.mu.html#L40'>sink</a>:&amp;:<a href='075channel.mu.html#L40'>sink</a>:char [
<span id="L90" class="LineNr"> 90 </span>  <span class="Constant">local-scope</span>
<span id="L91" class="LineNr"> 91 </span>  <span class="Constant">load-inputs</span>
<span id="L92" class="LineNr"> 92 </span>  i:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
<span id="L93" class="LineNr"> 93 </span>  len:num <span class="Special">&lt;-</span> length *contents
<span id="L94" class="LineNr"> 94 </span>  <span class="Delimiter">{</span>
<span id="L95" class="LineNr"> 95 </span>    done?:bool <span class="Special">&lt;-</span> greater-or-equal i, len
<span id="L96" class="LineNr"> 96 </span>    <span class="muControl">break-if</span> done?
<span id="L97" class="LineNr"> 97 </span>    c:char <span class="Special">&lt;-</span> index *contents, i
<span id="L98" class="LineNr"> 98 </span>    <a href='075channel.mu.html#L40'>sink</a> <span class="Special">&lt;-</span> <a href='075channel.mu.html#L60'>write</a> <a href='075channel.mu.html#L40'>sink</a>, c
<span id="L99" class="LineNr"> 99 </span>    i <span class="Special">&lt;-</span> add i,<span class="Constant"> 1</span>
<span id="L100" class="LineNr">100 </span>   <span class="muControl"> loop</span>
<span id="L101" class="LineNr">101 </span>  <span class="Delimiter">}</span>
<span id="L102" class="LineNr">102 </span>  <a href='075channel.mu.html#L40'>sink</a> <span class="Special">&lt;-</span> close <a href='075channel.mu.html#L40'>sink</a>
<span id="L103" class="LineNr">103 </span>]
<span id="L104" class="LineNr">104 </span>
<span id="L105" class="LineNr">105 </span><span class="muRecipe">def</span> <a href='088file.mu.html#L105'>start-writing</a> <a href='088file.mu.html#L11'>resources</a>:&amp;:<a href='088file.mu.html#L11'>resources</a>, filename:text<span class="muRecipe"> -&gt; </span><a href='075channel.mu.html#L40'>sink</a>:&amp;:<a href='075channel.mu.html#L40'>sink</a>:char, routine-id:num, error?:bool [
<span id="L106" class="LineNr">106 </span>  <span class="Constant">local-scope</span>
<span id="L107" class="LineNr">107 </span>  <span class="Constant">load-inputs</span>
<span id="L108" class="LineNr">108 </span>  error? <span class="Special">&lt;-</span> copy<span class="Constant"> false</span>
<span id="L109" class="LineNr">109 </span>  <a href='075channel.mu.html#L36'>source</a>:&amp;:<a href='075channel.mu.html#L36'>source</a>:char, <a href='075channel.mu.html#L40'>sink</a>:&amp;:<a href='075channel.mu.html#L40'>sink</a>:char <span class="Special">&lt;-</span> <a href='075channel.mu.html#L44'>new-channel</a><span class="Constant"> 30</span>
<span id="L110" class="LineNr">110 </span>  <span class="Delimiter">{</span>
<span id="L111" class="LineNr">111 </span>    <span class="muControl">break-unless</span> <a href='088file.mu.html#L11'>resources</a>
<span id="L112" class="LineNr">112 </span>    <span class="Comment"># fake file system</span>
<span id="L113" class="LineNr">113 </span>    routine-id <span class="Special">&lt;-</span> <span class="muControl">start-running</span> <a href='088file.mu.html#L162'>transmit-to-fake-resource</a> <a href='088file.mu.html#L11'>resources</a>, filename, <a href='075channel.mu.html#L36'>source</a>
<span id="L114" class="LineNr">114 </span>   <span class="muControl"> return</span>
<span id="L115" class="LineNr">115 </span>  <span class="Delimiter">}</span>
<span id="L116" class="LineNr">116 </span>  <span class="Comment"># real file system</span>
<span id="L117" class="LineNr">117 </span>  file:num <span class="Special">&lt;-</span> $open-file-for-writing filename
<span id="L118" class="LineNr">118 </span>  <span class="muControl">return-unless</span> file,<span class="Constant"> null/sink,</span> <span class="Constant">0/routine-id</span>,<span class="Constant"> true/error</span>
<span id="L119" class="LineNr">119 </span>  <span class="Delimiter">{</span>
<span id="L120" class="LineNr">120 </span>    <span class="muControl">break-if</span> file
<span id="L121" class="LineNr">121 </span>    msg:text <span class="Special">&lt;-</span> append <span class="Constant">[no such file: ]</span> filename
<span id="L122" class="LineNr">122 </span>    assert file, msg
<span id="L123" class="LineNr">123 </span>  <span class="Delimiter">}</span>
<span id="L124" class="LineNr">124 </span>  routine-id <span class="Special">&lt;-</span> <span class="muControl">start-running</span> <a href='088file.mu.html#L150'>transmit-to-file</a> file, <a href='075channel.mu.html#L36'>source</a>
<span id="L125" class="LineNr">125 </span>]
<span id="L126" class="LineNr">126 </span>
<span id="L127" class="LineNr">127 </span><span class="muRecipe">def</span> <a href='088file.mu.html#L127'>dump</a> <a href='088file.mu.html#L11'>resources</a>:&amp;:<a href='088file.mu.html#L11'>resources</a>, filename:text, contents:text<span class="muRecipe"> -&gt; </span><a href='088file.mu.html#L11'>resources</a>:&amp;:<a href='088file.mu.html#L11'>resources</a>, error?:bool [
<span id="L128" class="LineNr">128 </span>  <span class="Constant">local-scope</span>
<span id="L129" class="LineNr">129 </span>  <span class="Constant">load-inputs</span>
<span id="L130" class="LineNr">130 </span>  <span class="Comment"># todo: really create an empty file</span>
<span id="L131" class="LineNr">131 </span>  <span class="muControl">return-unless</span> contents, <a href='088file.mu.html#L11'>resources</a>,<span class="Constant"> false/no-error</span>
<span id="L132" class="LineNr">132 </span>  sink-file:&amp;:<a href='075channel.mu.html#L40'>sink</a>:char, write-routine:num, error?:bool <span class="Special">&lt;-</span> <a href='088file.mu.html#L105'>start-writing</a> <a href='088file.mu.html#L11'>resources</a>, filename
<span id="L133" class="LineNr">133 </span>  <span class="muControl">return-if</span> error?
<span id="L134" class="LineNr">134 </span>  i:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
<span id="L135" class="LineNr">135 </span>  len:num <span class="Special">&lt;-</span> length *contents
<span id="L136" class="LineNr">136 </span>  <span class="Delimiter">{</span>
<span id="L137" class="LineNr">137 </span>    done?:bool <span class="Special">&lt;-</span> greater-or-equal i, len
<span id="L138" class="LineNr">138 </span>    <span class="muControl">break-if</span> done?
<span id="L139" class="LineNr">139 </span>    c:char <span class="Special">&lt;-</span> index *contents, i
<span id="L140" class="LineNr">140 </span>    sink-file <span class="Special">&lt;-</span> <a href='075channel.mu.html#L60'>write</a> sink-file, c
<span id="L141" class="LineNr">141 </span>    i <span class="Special">&lt;-</span> add i,<span class="Constant"> 1</span>
<span id="L142" class="LineNr">142 </span>   <span class="muControl"> loop</span>
<span id="L143" class="LineNr">143 </span>  <span class="Delimiter">}</span>
<span id="L144" class="LineNr">144 </span>  close sink-file
<span id="L145" class="LineNr">145 </span>  <span class="Comment"># make sure to wait for the file to be actually written to disk</span>
<span id="L146" class="LineNr">146 </span>  <span class="Comment"># (Mu practices structured concurrency: <a href="http://250bpm.com/blog:71">http://250bpm.com/blog:71</a>)</span>
<span id="L147" class="LineNr">147 </span>  wait-for-routine write-routine
<span id="L148" class="LineNr">148 </span>]
<span id="L149" class="LineNr">149 </span>
<span id="L150" class="LineNr">150 </span><span class="muRecipe">def</span> <a href='088file.mu.html#L150'>transmit-to-file</a> file:num, <a href='075channel.mu.html#L36'>source</a>:&amp;:<a href='075channel.mu.html#L36'>source</a>:char<span class="muRecipe"> -&gt; </span><a href='075channel.mu.html#L36'>source</a>:&amp;:<a href='075channel.mu.html#L36'>source</a>:char [
<span id="L151" class="LineNr">151 </span>  <span class="Constant">local-scope</span>
<span id="L152" class="LineNr">152 </span>  <span class="Constant">load-inputs</span>
<span id="L153" class="LineNr">153 </span>  <span class="Delimiter">{</span>
<span id="L154" class="LineNr">154 </span>    c:char, done?:bool, <a href='075channel.mu.html#L36'>source</a> <span class="Special">&lt;-</span> read <a href='075channel.mu.html#L36'>source</a>
<span id="L155" class="LineNr">155 </span>    <span class="muControl">break-if</span> done?
<span id="L156" class="LineNr">156 </span>    $write-to-file file, c
<span id="L157" class="LineNr">157 </span>   <span class="muControl"> loop</span>
<span id="L158" class="LineNr">158 </span>  <span class="Delimiter">}</span>
<span id="L159" class="LineNr">159 </span>  file <span class="Special">&lt;-</span> $close-file file
<span id="L160" class="LineNr">160 </span>]
<span id="L161" class="LineNr">161 </span>
<span id="L162" class="LineNr">162 </span><span class="muRecipe">def</span> <a href='088file.mu.html#L162'>transmit-to-fake-resource</a> <a href='088file.mu.html#L11'>resources</a>:&amp;:<a href='088file.mu.html#L11'>resources</a>, filename:text, <a href='075channel.mu.html#L36'>source</a>:&amp;:<a href='075channel.mu.html#L36'>source</a>:char<span class="muRecipe"> -&gt; </span><a href='088file.mu.html#L11'>resources</a>:&amp;:<a href='088file.mu.html#L11'>resources</a>, <a href='075channel.mu.html#L36'>source</a>:&amp;:<a href='075channel.mu.html#L36'>source</a>:char [
<span id="L163" class="LineNr">163 </span>  <span class="Constant">local-scope</span>
<span id="L164" class="LineNr">164 </span>  <span class="Constant">load-inputs</span>
<span id="L165" class="LineNr">165 </span>  lock:location <span class="Special">&lt;-</span> get-location *resources, <span class="Constant">lock:offset</span>
<span id="L166" class="LineNr">166 </span>  wait-for-reset-then-set lock
<span id="L167" class="LineNr">167 </span>  <span class="Comment"># compute new file contents</span>
<span id="L168" class="LineNr">168 </span>  buf:&amp;:<a href='061text.mu.html#L120'>buffer</a>:char <span class="Special">&lt;-</span> <a href='061text.mu.html#L125'>new-buffer</a><span class="Constant"> 30</span>
<span id="L169" class="LineNr">169 </span>  <span class="Delimiter">{</span>
<span id="L170" class="LineNr">170 </span>    c:char, done?:bool, <a href='075channel.mu.html#L36'>source</a> <span class="Special">&lt;-</span> read <a href='075channel.mu.html#L36'>source</a>
<span id="L171" class="LineNr">171 </span>    <span class="muControl">break-if</span> done?
<span id="L172" class="LineNr">172 </span>    buf <span class="Special">&lt;-</span> append buf, c
<span id="L173" class="LineNr">173 </span>   <span class="muControl"> loop</span>
<span id="L174" class="LineNr">174 </span>  <span class="Delimiter">}</span>
<span id="L175" class="LineNr">175 </span>  contents:text <span class="Special">&lt;-</span> <a href='061text.mu.html#L338'>buffer-to-array</a> buf
<span id="L176" class="LineNr">176 </span>  new-resource:<a href='088file.mu.html#L16'>resource</a> <span class="Special">&lt;-</span> merge filename, contents
<span id="L177" class="LineNr">177 </span>  <span class="Comment"># write to resources</span>
<span id="L178" class="LineNr">178 </span>  curr-filename:text <span class="Special">&lt;-</span> copy<span class="Constant"> null</span>
<span id="L179" class="LineNr">179 </span>  data:&amp;:@:<a href='088file.mu.html#L16'>resource</a> <span class="Special">&lt;-</span> get *resources, <span class="Constant">data:offset</span>
<span id="L180" class="LineNr">180 </span>  <span class="Comment"># replace file contents if it already exists</span>
<span id="L181" class="LineNr">181 </span>  i:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
<span id="L182" class="LineNr">182 </span>  len:num <span class="Special">&lt;-</span> length *data
<span id="L183" class="LineNr">183 </span>  <span class="Delimiter">{</span>
<span id="L184" class="LineNr">184 </span>    done?:bool <span class="Special">&lt;-</span> greater-or-equal i, len
<span id="L185" class="LineNr">185 </span>    <span class="muControl">break-if</span> done?
<span id="L186" class="LineNr">186 </span>    tmp:<a href='088file.mu.html#L16'>resource</a> <span class="Special">&lt;-</span> index *data, i
<span id="L187" class="LineNr">187 </span>    curr-filename <span class="Special">&lt;-</span> get tmp, <span class="Constant">name:offset</span>
<span id="L188" class="LineNr">188 </span>    found?:bool <span class="Special">&lt;-</span> equal filename, curr-filename
<span id="L189" class="LineNr">189 </span>    <span class="Delimiter">{</span>
<span id="L190" class="LineNr">190 </span>      <span class="muControl">break-unless</span> found?
<span id="L191" class="LineNr">191 </span>      put-index *data, i, new-resource
<span id="L192" class="LineNr">192 </span>     <span class="muControl"> jump</span> <span class="Constant">+unlock-and-exit</span>
<span id="L193" class="LineNr">193 </span>    <span class="Delimiter">}</span>
<span id="L194" class="LineNr">194 </span>    i <span class="Special">&lt;-</span> add i,<span class="Constant"> 1</span>
<span id="L195" class="LineNr">195 </span>   <span class="muControl"> loop</span>
<span id="L196" class="LineNr">196 </span>  <span class="Delimiter">}</span>
<span id="L197" class="LineNr">197 </span>  <span class="Comment"># if file didn't already exist, make room for it</span>
<span id="L198" class="LineNr">198 </span>  new-len:num <span class="Special">&lt;-</span> add len,<span class="Constant"> 1</span>
<span id="L199" class="LineNr">199 </span>  new-data:&amp;:@:<a href='088file.mu.html#L16'>resource</a> <span class="Special">&lt;-</span> new <span class="Constant"><a href='088file.mu.html#L16'>resource</a>:type</span>, new-len
<span id="L200" class="LineNr">200 </span>  put *resources, <span class="Constant">data:offset</span>, new-data
<span id="L201" class="LineNr">201 </span>  <span class="Comment"># copy over old files</span>
<span id="L202" class="LineNr">202 </span>  i:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
<span id="L203" class="LineNr">203 </span>  <span class="Delimiter">{</span>
<span id="L204" class="LineNr">204 </span>    done?:bool <span class="Special">&lt;-</span> greater-or-equal i, len
<span id="L205" class="LineNr">205 </span>    <span class="muControl">break-if</span> done?
<span id="L206" class="LineNr">206 </span>    tmp:<a href='088file.mu.html#L16'>resource</a> <span class="Special">&lt;-</span> index *data, i
<span id="L207" class="LineNr">207 </span>    put-index *new-data, i, tmp
<span id="L208" class="LineNr">208 </span>  <span class="Delimiter">}</span>
<span id="L209" class="LineNr">209 </span>  <span class="Comment"># write new file</span>
<span id="L210" class="LineNr">210 </span>  put-index *new-data, len, new-resource
<span id="L211" class="LineNr">211 </span><span class="Constant">  +unlock-and-exit</span>
<span id="L212" class="LineNr">212 </span>  reset lock
<span id="L213" class="LineNr">213 </span>]
</pre>
</body>
</html>
<!-- vim: set foldmethod=manual : -->