about summary refs log tree commit diff stats
path: root/032array.cc
blob: f8c26234b3eca1633307af4865aed36ae9dc5edb (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
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
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
//: Arrays contain a variable number of elements of the same type. Their value
//: starts with the length of the array.
//:
//: You can create arrays of containers, but containers can only contain
//: elements of a fixed size, so you can't create containers containing arrays.
//: Create containers containing addresses to arrays instead.

//: You can create arrays using 'create-array'.
:(scenario create_array)
def main [
  # create an array occupying locations 1 (for the size) and 2-4 (for the elements)
  1:array:number:3 <- create-array
]
+run: creating array of size 4

:(before "End Primitive Recipe Declarations")
CREATE_ARRAY,
:(before "End Primitive Recipe Numbers")
put(Recipe_ordinal, "create-array", CREATE_ARRAY);
:(before "End Primitive Recipe Checks")
case CREATE_ARRAY: {
  if (inst.products.empty()) {
    raise << maybe(get(Recipe, r).name) << "'create-array' needs one product and no ingredients but got '" << inst.original_string << '\n' << end();
    break;
  }
  reagent/*copy*/ product = inst.products.at(0);
  // Update CREATE_ARRAY product in Check
  if (!is_mu_array(product)) {
    raise << maybe(get(Recipe, r).name) << "'create-array' cannot create non-array '" << product.original_string << "'\n" << end();
    break;
  }
  if (!product.type->right) {
    raise << maybe(get(Recipe, r).name) << "create array of what? '" << inst.original_string << "'\n" << end();
    break;
  }
  // 'create-array' will need to check properties rather than types
  type_tree* array_length_from_type = product.type->right->right;
  if (!array_length_from_type) {
    raise << maybe(get(Recipe, r).name) << "create array of what size? '" << inst.original_string << "'\n" << end();
    break;
  }
  if (!product.type->right->right->atom)
    array_length_from_type = array_length_from_type->left;
  if (!is_integer(array_length_from_type->name)) {
    raise << maybe(get(Recipe, r).name) << "'create-array' product should specify size of array after its element type, but got '" << product.type->right->right->name << "'\n" << end();
    break;
  }
  break;
}
:(before "End Primitive Recipe Implementations")
case CREATE_ARRAY: {
  reagent/*copy*/ product = current_instruction().products.at(0);
  // Update CREATE_ARRAY product in Run
  int base_address = product.value;
  type_tree* array_length_from_type = product.type->right->right;
  if (!product.type->right->right->atom)
    array_length_from_type = array_length_from_type->left;
  int array_length = to_integer(array_length_from_type->name);
  // initialize array length, so that size_of will work
  trace(9999, "mem") << "storing " << array_length << " in location " << base_address << end();
  put(Memory, base_address, array_length);  // in array elements
  int size = size_of(product);  // in locations
  trace(9998, "run") << "creating array of size " << size << end();
  // initialize array
  for (int i = 1; i <= size_of(product); ++i) {
    put(Memory, base_address+i, 0);
  }
  // no need to update product
  goto finish_instruction;
}

:(scenario copy_array)
# Arrays can be copied around with a single instruction just like numbers,
# no matter how large they are.
# You don't need to pass the size around, since each array variable stores its
# size in memory at run-time. We'll call a variable with an explicit size a
# 'static' array, and one without a 'dynamic' array since it can contain
# arrays of many different sizes.
def main [
  1:array:number:3 <- create-array
  2:number <- copy 14
  3:number <- copy 15
  4:number <- copy 16
  5:array:number <- copy 1:array:number:3
]
+mem: storing 3 in location 5
+mem: storing 14 in location 6
+mem: storing 15 in location 7
+mem: storing 16 in location 8

:(scenario stash_array)
def main [
  1:array:number:3 <- create-array
  2:number <- copy 14
  3:number <- copy 15
  4:number <- copy 16
  stash [foo:], 1:array:number:3
]
+app: foo: 3 14 15 16

:(before "End size_of(reagent r) Cases")
if (!r.type->atom && r.type->left->atom && r.type->left->value == get(Type_ordinal, "array")) {
  if (!r.type->right) {
    raise << maybe(current_recipe_name()) << "'" << r.original_string << "' is an array of what?\n" << end();
    return 1;
  }
  type_tree* element_type = copy_array_element(r.type);
  int result = 1 + array_length(r)*size_of(element_type);
  delete element_type;
  return result;
}

//: disable the size mismatch check for arrays since the destination array
//: need not be initialized
:(before "End size_mismatch(x) Cases")
if (x.type && !x.type->atom && x.type->left->value == get(Type_ordinal, "array")) return false;

//: arrays are disallowed inside containers unless their length is fixed in
//: advance

:(scenario container_permits_static_array_element)
container foo [
  x:array:number:3
]
$error: 0

:(scenario container_disallows_dynamic_array_element)
% Hide_errors = true;
container foo [
  x:array:number
]
+error: container 'foo' cannot determine size of element 'x'

//: disable the size mismatch check for 'merge' instructions since containers
//: can contain arrays, and since we already do plenty of checking for them
:(before "End size_mismatch(x) Cases")
if (current_call().running_step_index < SIZE(get(Recipe, current_call().running_recipe).steps)
    && current_instruction().operation == MERGE) {
  return false;
}

:(scenario merge_static_array_into_container)
container foo [
  x:number
  y:array:number:3
]
def main [
  1:array:number:3 <- create-array
  10:foo <- merge 34, 1:array:number:3
]
# no errors

:(before "End Load Container Element Definition")
{
  const type_tree* type = info.elements.back().type;
  if (type && type->atom && type->name == "array") {
    raise << "container '" << name << "' doesn't specify type of array elements for '" << info.elements.back().name << "'\n" << end();
    continue;
  }
  if (type && !type->atom && type->left->atom && type->left->name == "array") {
    if (!type->right) {
      raise << "container '" << name << "' doesn't specify type of array elements for '" << info.elements.back().name << "'\n" << end();
      continue;
    }
    if (type->right->atom) {  // array has no length
      raise << "container '" << name << "' cannot determine size of element '" << info.elements.back().name << "'\n" << end();
      continue;
    }
  }
}

:(scenario code_inside_container)
% Hide_errors = true;
container card [
  rank:number <- next-ingredient
]
recipe foo [
  1:card <- merge 3
  2:number <- get 1:card rank:offset
]
# shouldn't die

//:: To access elements of an array, use 'index'

:(scenario index)
def main [
  1:array:number:3 <- create-array
  2:number <- copy 14
  3:number <- copy 15
  4:number <- copy 16
  5:number <- index 1:array:number:3, 0
]
+mem: storing 14 in location 5

:(scenario index_compound_element)
def main [
  {1: (array (address number) 3)} <- create-array
  2:number <- copy 14
  3:number <- copy 15
  4:number <- copy 16
  5:address:number <- index {1: (array (address number) 3)}, 0
]
+mem: storing 14 in location 5

:(scenario index_direct_offset)
def main [
  1:array:number:3 <- create-array
  2:number <- copy 14
  3:number <- copy 15
  4:number <- copy 16
  5:number <- copy 0
  6:number <- index 1:array:number, 5:number
]
+mem: storing 14 in location 6

:(before "End Primitive Recipe Declarations")
INDEX,
:(before "End Primitive Recipe Numbers")
put(Recipe_ordinal, "index", INDEX);
:(before "End Primitive Recipe Checks")
case INDEX: {
  if (SIZE(inst.ingredients) != 2) {
    raise << maybe(get(Recipe, r).name) << "'index' expects exactly 2 ingredients in '" << inst.original_string << "'\n" << end();
    break;
  }
  reagent/*copy*/ base = inst.ingredients.at(0);
  // Update INDEX base in Check
  if (!is_mu_array(base)) {
    raise << maybe(get(Recipe, r).name) << "'index' on a non-array '" << base.original_string << "'\n" << end();
    break;
  }
  reagent/*copy*/ index = inst.ingredients.at(1);
  // Update INDEX index in Check
  if (!is_mu_number(index)) {
    raise << maybe(get(Recipe, r).name) << "second ingredient of 'index' should be a number, but got '" << index.original_string << "'\n" << end();
    break;
  }
  if (inst.products.empty()) break;
  reagent/*copy*/ product = inst.products.at(0);
  // Update INDEX product in Check
  reagent element;
  element.type = copy_array_element(base.type);
  if (!types_coercible(product, element)) {
    raise << maybe(get(Recipe, r).name) << "'index' on '" << base.original_string << "' can't be saved in '" << product.original_string << "'; type should be '" << names_to_string_without_quotes(element.type) << "'\n" << end();
    break;
  }
  break;
}
:(before "End Primitive Recipe Implementations")
case INDEX: {
  reagent/*copy*/ base = current_instruction().ingredients.at(0);
  // Update INDEX base in Run
  int base_address = base.value;
  trace(9998, "run") << "base address is " << base_address << end();
  if (base_address == 0) {
    raise << maybe(current_recipe_name()) << "tried to access location 0 in '" << to_original_string(current_instruction()) << "'\n" << end();
    break;
  }
  reagent/*copy*/ index = current_instruction().ingredients.at(1);
  // Update INDEX index in Run
  vector<double> index_val(read_memory(index));
  if (index_val.at(0) < 0 || index_val.at(0) >= get_or_insert(Memory, base_address)) {
    raise << maybe(current_recipe_name()) << "invalid index " << no_scientific(index_val.at(0)) << " in '" << to_original_string(current_instruction()) << "'\n" << end();
    break;
  }
  type_tree* element_type = copy_array_element(base.type);
  int src = base_address + 1 + index_val.at(0)*size_of(element_type);
  trace(9998, "run") << "address to copy is " << src << end();
  trace(9998, "run") << "its type is " << to_string(element_type) << end();
  reagent element;
  element.set_value(src);
  element.type = element_type;
  // Read element
  products.push_back(read_memory(element));
  break;
}

:(code)
type_tree* copy_array_element(const type_tree* type) {
  assert(type->right);
  // hack: don't require parens for either array:number:3 array:address:number
  if (!type->right->atom && type->right->right && type->right->right->atom && is_integer(type->right->right->name))
    return new type_tree(*type->right->left);
  return new type_tree(*type->right);
}

int array_length(const reagent& x) {
  if (!x.type->atom && !x.type->right->atom && x.type->right->right->atom  // exactly 3 types
      && is_integer(x.type->right->right->name)) {  // third 'type' is a number
    // get size from type
    return to_integer(x.type->right->right->name);
  }
  // this should never happen at transform time
  // x should already be canonized.
  return get_or_insert(Memory, x.value);
}

void test_array_length_compound() {
  put(Memory, 1, 3);
  put(Memory, 2, 14);
  put(Memory, 3, 15);
  put(Memory, 4, 16);
  reagent x("1:array:address:number");  // 3 types, but not a static array
  populate_value(x);
  CHECK_EQ(array_length(x), 3);
}

:(scenario index_out_of_bounds)
% Hide_errors = true;
def main [
  1:array:number:3 <- create-array
  2:number <- copy 14
  3:number <- copy 15
  4:number <- copy 16
  5:number <- copy 14
  6:number <- copy 15
  7:number <- copy 16
  index 1:array:number:3, 4  # less than size of array in locations, but larger than its length in elements
]
+error: main: invalid index 4 in 'index 1:array:number:3, 4'

:(scenario index_out_of_bounds_2)
% Hide_errors = true;
def main [
  1:array:point:3 <- create-array
  2:number <- copy 14
  3:number <- copy 15
  4:number <- copy 16
  5:number <- copy 14
  6:number <- copy 15
  7:number <- copy 16
  index 1:array:point, -1
]
+error: main: invalid index -1 in 'index 1:array:point, -1'

:(scenario index_product_type_mismatch)
% Hide_errors = true;
def main [
  1:array:point:3 <- create-array
  2:number <- copy 14
  3:number <- copy 15
  4:number <- copy 16
  5:number <- copy 14
  6:number <- copy 15
  7:number <- copy 16
  9:number <- index 1:array:point, 0
]
+error: main: 'index' on '1:array:point' can't be saved in '9:number'; type should be 'point'

//: we might want to call 'index' without saving the results, say in a sandbox

:(scenario index_without_product)
def main [
  1:array:number:3 <- create-array
  2:number <- copy 14
  3:number <- copy 15
  4:number <- copy 16
  index 1:array:number:3, 0
]
# just don't die

//:: To write to elements of arrays, use 'put'.

:(scenario put_index)
def main [
  1:array:number:3 <- create-array
  2:number <- copy 14
  3:number <- copy 15
  4:number <- copy 16
  1:array:number <- put-index 1:array:number, 1, 34
]
+mem: storing 34 in location 3

:(before "End Primitive Recipe Declarations")
PUT_INDEX,
:(before "End Primitive Recipe Numbers")
put(Recipe_ordinal, "put-index", PUT_INDEX);
:(before "End Primitive Recipe Checks")
case PUT_INDEX: {
  if (SIZE(inst.ingredients) != 3) {
    raise << maybe(get(Recipe, r).name) << "'put-index' expects exactly 3 ingredients in '" << inst.original_string << "'\n" << end();
    break;
  }
  reagent/*copy*/ base = inst.ingredients.at(0);
  // Update PUT_INDEX base in Check
  if (!is_mu_array(base)) {
    raise << maybe(get(Recipe, r).name) << "'put-index' on a non-array '" << base.original_string << "'\n" << end();
    break;
  }
  reagent/*copy*/ index = inst.ingredients.at(1);
  // Update PUT_INDEX index in Check
  if (!is_mu_number(index)) {
    raise << maybe(get(Recipe, r).name) << "second ingredient of 'put-index' should have type 'number', but got '" << inst.ingredients.at(1).original_string << "'\n" << end();
    break;
  }
  reagent/*copy*/ value = inst.ingredients.at(2);
  // Update PUT_INDEX value in Check
  reagent element;
  element.type = copy_array_element(base.type);
  if (!types_coercible(element, value)) {
    raise << maybe(get(Recipe, r).name) << "'put-index " << base.original_string << ", " << inst.ingredients.at(1).original_string << "' should store " << names_to_string_without_quotes(element.type) << " but '" << value.name << "' has type " << names_to_string_without_quotes(value.type) << '\n' << end();
    break;
  }
  if (inst.products.empty()) break;  // no more checks necessary
  if (inst.products.at(0).name != inst.ingredients.at(0).name) {
    raise << maybe(get(Recipe, r).name) << "product of 'put-index' must be first ingredient '" << inst.ingredients.at(0).original_string << "', but got '" << inst.products.at(0).original_string << "'\n" << end();
    break;
  }
  // End PUT_INDEX Product Checks
  break;
}
:(before "End Primitive Recipe Implementations")
case PUT_INDEX: {
  reagent/*copy*/ base = current_instruction().ingredients.at(0);
  // Update PUT_INDEX base in Run
  int base_address = base.value;
  if (base_address == 0) {
    raise << maybe(current_recipe_name()) << "tried to access location 0 in '" << to_original_string(current_instruction()) << "'\n" << end();
    break;
  }
  reagent/*copy*/ index = current_instruction().ingredients.at(1);
  // Update PUT_INDEX index in Run
  vector<double> index_val(read_memory(index));
  if (index_val.at(0) < 0 || index_val.at(0) >= get_or_insert(Memory, base_address)) {
    raise << maybe(current_recipe_name()) << "invalid index " << no_scientific(index_val.at(0)) << " in '" << to_original_string(current_instruction()) << "'\n" << end();
    break;
  }
  reagent element;
  element.type = copy_array_element(base.type);
  int address = base_address + 1 + index_val.at(0)*size_of(element.type);
  element.set_value(address);
  trace(9998, "run") << "address to copy to is " << address << end();
  // optimization: directly write the element rather than updating 'product'
  // and writing the entire array
  vector<double> value = read_memory(current_instruction().ingredients.at(2));
  // Write Memory in PUT_INDEX in Run
  for (int i = 0; i < SIZE(value); ++i) {
    trace(9999, "mem") << "storing " << no_scientific(value.at(i)) << " in location " << address+i << end();
    put(Memory, address+i, value.at(i));
  }
  goto finish_instruction;
}

:(scenario put_index_out_of_bounds)
% Hide_errors = true;
def main [
  1:array:point:3 <- create-array
  2:number <- copy 14
  3:number <- copy 15
  4:number <- copy 16
  5:number <- copy 14
  6:number <- copy 15
  7:number <- copy 16
  8:point <- merge 34, 35
  1:array:point <- put-index 1:array:point, 4, 8:point  # '4' is less than size of array in locations, but larger than its length in elements
]
+error: main: invalid index 4 in '1:array:point <- put-index 1:array:point, 4, 8:point'

:(scenario put_index_out_of_bounds_2)
% Hide_errors = true;
def main [
  1:array:point:3 <- create-array
  2:number <- copy 14
  3:number <- copy 15
  4:number <- copy 16
  5:number <- copy 14
  6:number <- copy 15
  7:number <- copy 16
  8:point <- merge 34, 35
  1:array:point <- put-index 1:array:point, -1, 8:point
]
+error: main: invalid index -1 in '1:array:point <- put-index 1:array:point, -1, 8:point'

:(scenario put_index_product_error)
% Hide_errors = true;
def main [
  local-scope
  load-ingredients
  1:array:number:3 <- create-array
  4:array:number:3 <- put-index 1:array:number:3, 0, 34
]
+error: main: product of 'put-index' must be first ingredient '1:array:number:3', but got '4:array:number:3'

//:: compute the length of an array

:(scenario array_length)
def main [
  1:array:number:3 <- create-array
  2:number <- copy 14
  3:number <- copy 15
  4:number <- copy 16
  5:number <- length 1:array:number:3
]
+mem: storing 3 in location 5

:(before "End Primitive Recipe Declarations")
LENGTH,
:(before "End Primitive Recipe Numbers")
put(Recipe_ordinal, "length", LENGTH);
:(before "End Primitive Recipe Checks")
case LENGTH: {
  if (SIZE(inst.ingredients) != 1) {
    raise << maybe(get(Recipe, r).name) << "'length' expects exactly 2 ingredients in '" << inst.original_string << "'\n" << end();
    break;
  }
  reagent/*copy*/ array = inst.ingredients.at(0);
  // Update LENGTH array in Check
  if (!is_mu_array(array)) {
    raise << "tried to calculate length of non-array '" << array.original_string << "'\n" << end();
    break;
  }
  break;
}
:(before "End Primitive Recipe Implementations")
case LENGTH: {
  reagent/*copy*/ array = current_instruction().ingredients.at(0);
  // Update LENGTH array in Run
  if (array.value == 0) {
    raise << maybe(current_recipe_name()) << "tried to access location 0 in '" << to_original_string(current_instruction()) << "'\n" << end();
    break;
  }
  products.resize(1);
  products.at(0).push_back(get_or_insert(Memory, array.value));
  break;
}

//: optimization: none of the instructions in this layer use 'ingredients' so
//: stop copying potentially huge arrays into it.
:(before "End should_copy_ingredients Special-cases")
recipe_ordinal r = current_instruction().operation;
if (r == CREATE_ARRAY || r == INDEX || r == PUT_INDEX || r == LENGTH)
  return false;
an class="o">="Constant">10/newline</span> <span id="L111" class="LineNr"> 111 </span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">break-unless</span> newline? <span id="L112" class="LineNr"> 112 </span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Comment"># adjust cursor if necessary</span> <span id="L113" class="LineNr"> 113 </span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Delimiter">{</span> <span id="L114" class="LineNr"> 114 </span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> at-cursor-row?:bool <span class="Special">&lt;-</span> equal row, cursor-row <span id="L115" class="LineNr"> 115 </span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">break-unless</span> at-cursor-row? <span id="L116" class="LineNr"> 116 </span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> left-of-cursor?:bool <span class="Special">&lt;-</span> lesser-than column, cursor-column <span id="L117" class="LineNr"> 117 </span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">break-unless</span> left-of-cursor? <span id="L118" class="LineNr"> 118 </span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> cursor-column <span class="Special">&lt;-</span> copy column <span id="L119" class="LineNr"> 119 </span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column <span id="L120" class="LineNr"> 120 </span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> before-cursor <span class="Special">&lt;-</span> copy <a href='../065duplex_list.mu.html#L36'>prev</a> <span id="L121" class="LineNr"> 121 </span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">before-cursor:offset</span>, before-cursor <span id="L122" class="LineNr"> 122 </span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Delimiter">}</span> <span id="L123" class="LineNr"> 123 </span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Comment"># skip to next line</span> <span id="L124" class="LineNr"> 124 </span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span> <span id="L125" class="LineNr"> 125 </span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> column <span class="Special">&lt;-</span> copy left <span id="L126" class="LineNr"> 126 </span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> curr <span class="Special">&lt;-</span> <a href='../065duplex_list.mu.html#L29'>next</a> curr <span id="L127" class="LineNr"> 127 </span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <a href='../065duplex_list.mu.html#L36'>prev</a> <span class="Special">&lt;-</span> <a href='../065duplex_list.mu.html#L29'>next</a> <a href='../065duplex_list.mu.html#L36'>prev</a> <span id="L128" class="LineNr"> 128 </span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">loop</span> <span class="Constant">+next-character</span> <span id="L129" class="LineNr"> 129 </span> <span class="Conceal">¦</span> <span class="Delimiter">}</span> <span id="L130" class="LineNr"> 130 </span> <span class="Conceal">¦</span> <span class="Delimiter">{</span> <span id="L131" class="LineNr"> 131 </span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Comment"># at right? wrap. even if there's only one more letter left; we need</span> <span id="L132" class="LineNr"> 132 </span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Comment"># room for clicking on the cursor after it.</span> <span id="L133" class="LineNr"> 133 </span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> at-right?:bool <span class="Special">&lt;-</span> equal column, right <span id="L134" class="LineNr"> 134 </span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">break-unless</span> at-right? <span id="L135" class="LineNr"> 135 </span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> column <span class="Special">&lt;-</span> copy left <span id="L136" class="LineNr"> 136 </span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span> <span id="L137" class="LineNr"> 137 </span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Comment"># don't increment curr/prev</span> <span id="L138" class="LineNr"> 138 </span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">loop</span> <span class="Constant">+next-character</span> <span id="L139" class="LineNr"> 139 </span> <span class="Conceal">¦</span> <span class="Delimiter">}</span> <span id="L140" class="LineNr"> 140 </span> <span class="Conceal">¦</span> curr <span class="Special">&lt;-</span> <a href='../065duplex_list.mu.html#L29'>next</a> curr <span id="L141" class="LineNr"> 141 </span> <span class="Conceal">¦</span> <a href='../065duplex_list.mu.html#L36'>prev</a> <span class="Special">&lt;-</span> <a href='../065duplex_list.mu.html#L29'>next</a> <a href='../065duplex_list.mu.html#L36'>prev</a> <span id="L142" class="LineNr"> 142 </span> <span class="Conceal">¦</span> column <span class="Special">&lt;-</span> add column,<span class="Constant"> 1</span> <span id="L143" class="LineNr"> 143 </span> <span class="Conceal">¦</span> <span class="muControl">loop</span> <span id="L144" class="LineNr"> 144 </span> <span class="Delimiter">}</span> <span id="L145" class="LineNr"> 145 </span> <span class="Comment"># is cursor to the right of the last line? move to end</span> <span id="L146" class="LineNr"> 146 </span> <span class="Delimiter">{</span> <span id="L147" class="LineNr"> 147 </span> <span class="Conceal">¦</span> at-cursor-row?:bool <span class="Special">&lt;-</span> equal row, cursor-row <span id="L148" class="LineNr"> 148 </span> <span class="Conceal">¦</span> cursor-outside-line?:bool <span class="Special">&lt;-</span> lesser-or-equal column, cursor-column <span id="L149" class="LineNr"> 149 </span> <span class="Conceal">¦</span> before-cursor-on-same-line?:bool <span class="Special">&lt;-</span> and at-cursor-row?, cursor-outside-line? <span id="L150" class="LineNr"> 150 </span> <span class="Conceal">¦</span> above-cursor-row?:bool <span class="Special">&lt;-</span> lesser-than row, cursor-row <span id="L151" class="LineNr"> 151 </span> <span class="Conceal">¦</span> before-cursor?:bool <span class="Special">&lt;-</span> or before-cursor-on-same-line?, above-cursor-row? <span id="L152" class="LineNr"> 152 </span> <span class="Conceal">¦</span> <span class="muControl">break-unless</span> before-cursor? <span id="L153" class="LineNr"> 153 </span> <span class="Conceal">¦</span> cursor-row <span class="Special">&lt;-</span> copy row <span id="L154" class="LineNr"> 154 </span> <span class="Conceal">¦</span> *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-row:offset</span>, cursor-row <span id="L155" class="LineNr"> 155 </span> <span class="Conceal">¦</span> cursor-column <span class="Special">&lt;-</span> copy column <span id="L156" class="LineNr"> 156 </span> <span class="Conceal">¦</span> *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column <span id="L157" class="LineNr"> 157 </span> <span class="Conceal">¦</span> before-cursor <span class="Special">&lt;-</span> copy <a href='../065duplex_list.mu.html#L36'>prev</a> <span id="L158" class="LineNr"> 158 </span> <span class="Conceal">¦</span> *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">before-cursor:offset</span>, before-cursor <span id="L159" class="LineNr"> 159 </span> <span class="Delimiter">}</span> <span id="L160" class="LineNr"> 160 </span>] <span id="L161" class="LineNr"> 161 </span> <span id="L162" class="LineNr"> 162 </span><span class="Comment"># Process an event 'e' and try to minimally update the screen.</span> <span id="L163" class="LineNr"> 163 </span><span class="Comment"># Set 'go-render?' to true to indicate the caller must perform a non-minimal update.</span> <span id="L164" class="LineNr"> 164 </span><span class="muRecipe">def</span> <a href='002-typing.mu.html#L164'>handle-keyboard-event</a> <a href='../081print.mu.html#L4'>screen</a>:&amp;:<a href='../081print.mu.html#L4'>screen</a>, editor:&amp;:editor, e:<a href='../084console.mu.html#L4'>event</a><span class="muRecipe"> -&gt; </span>go-render?:bool, <a href='../081print.mu.html#L4'>screen</a>:&amp;:<a href='../081print.mu.html#L4'>screen</a>, editor:&amp;:editor [ <span id="L165" class="LineNr"> 165 </span> <span class="Constant">local-scope</span> <span id="L166" class="LineNr"> 166 </span> <span class="Constant">load-ingredients</span> <span id="L167" class="LineNr"> 167 </span> <span class="muControl">return-unless</span> editor, <span class="Constant">0/don't-render</span> <span id="L168" class="LineNr"> 168 </span> <a href='../081print.mu.html#L581'>screen-width</a>:num <span class="Special">&lt;-</span> <a href='../081print.mu.html#L581'>screen-width</a> <a href='../081print.mu.html#L4'>screen</a> <span id="L169" class="LineNr"> 169 </span> <a href='../081print.mu.html#L594'>screen-height</a>:num <span class="Special">&lt;-</span> <a href='../081print.mu.html#L594'>screen-height</a> <a href='../081print.mu.html#L4'>screen</a> <span id="L170" class="LineNr"> 170 </span> left:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">left:offset</span> <span id="L171" class="LineNr"> 171 </span> right:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">right:offset</span> <span id="L172" class="LineNr"> 172 </span> before-cursor:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">before-cursor:offset</span> <span id="L173" class="LineNr"> 173 </span> cursor-row:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-row:offset</span> <span id="L174" class="LineNr"> 174 </span> cursor-column:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-column:offset</span> <span id="L175" class="LineNr"> 175 </span> save-row:num <span class="Special">&lt;-</span> copy cursor-row <span id="L176" class="LineNr"> 176 </span> save-column:num <span class="Special">&lt;-</span> copy cursor-column <span id="L177" class="LineNr"> 177 </span> <span class="Comment"># character</span> <span id="L178" class="LineNr"> 178 </span> <span class="Delimiter">{</span> <span id="L179" class="LineNr"> 179 </span> <span class="Conceal">¦</span> c:char, is-unicode?:bool <span class="Special">&lt;-</span> maybe-convert e, <span class="Constant">text:variant</span> <span id="L180" class="LineNr"> 180 </span> <span class="Conceal">¦</span> <span class="muControl">break-unless</span> is-unicode? <span id="L181" class="LineNr"> 181 </span> <span class="Conceal">¦</span> trace<span class="Constant"> 10</span>, <span class="Constant">[app]</span>, <span class="Constant">[handle-keyboard-event: special character]</span> <span id="L182" class="LineNr"> 182 </span> <span class="Conceal">¦</span> <span class="Comment"># exceptions for special characters go here</span> <span id="L183" class="LineNr"> 183 </span><span class="Constant"> </span><span class="Conceal">¦</span><span class="Constant"> <a href='002-typing.mu.html#L183'>&lt;handle-special-character&gt;</a></span> <span id="L184" class="LineNr"> 184 </span> <span class="Conceal">¦</span> <span class="Comment"># ignore any other special characters</span> <span id="L185" class="LineNr"> 185 </span> <span class="Conceal">¦</span> regular-character?:bool <span class="Special">&lt;-</span> greater-or-equal c, <span class="Constant">32/space</span> <span id="L186" class="LineNr"> 186 </span> <span class="Conceal">¦</span> <span class="muControl">return-unless</span> regular-character?, <span class="Constant">0/don't-render</span> <span id="L187" class="LineNr"> 187 </span> <span class="Conceal">¦</span> <span class="Comment"># otherwise type it in</span> <span id="L188" class="LineNr"> 188 </span><span class="Constant"> </span><span class="Conceal">¦</span><span class="Constant"> &lt;insert-character-begin&gt;</span> <span id="L189" class="LineNr"> 189 </span> <span class="Conceal">¦</span> go-render? <span class="Special">&lt;-</span> <a href='002-typing.mu.html#L201'>insert-at-cursor</a> editor, c, <a href='../081print.mu.html#L4'>screen</a> <span id="L190" class="LineNr"> 190 </span><span class="Constant"> </span><span class="Conceal">¦</span><span class="Constant"> &lt;insert-character-end&gt;</span> <span id="L191" class="LineNr"> 191 </span> <span class="Conceal">¦</span> <span class="muControl">return</span> <span id="L192" class="LineNr"> 192 </span> <span class="Delimiter">}</span> <span id="L193" class="LineNr"> 193 </span> <span class="Comment"># special key to modify the text or move the cursor</span> <span id="L194" class="LineNr"> 194 </span> k:num, is-keycode?:bool <span class="Special">&lt;-</span> maybe-convert e:<a href='../084console.mu.html#L4'>event</a>, <span class="Constant">keycode:variant</span> <span id="L195" class="LineNr"> 195 </span> assert is-keycode?, <span class="Constant">[event was of unknown type; neither keyboard nor mouse]</span> <span id="L196" class="LineNr"> 196 </span> <span class="Comment"># handlers for each special key will go here</span> <span id="L197" class="LineNr"> 197 </span><span class="Constant"> <a href='002-typing.mu.html#L197'>&lt;handle-special-key&gt;</a></span> <span id="L198" class="LineNr"> 198 </span> <span class="muControl">return</span> <span class="Constant">1/go-render</span> <span id="L199" class="LineNr"> 199 </span>] <span id="L200" class="LineNr"> 200 </span> <span id="L201" class="LineNr"> 201 </span><span class="muRecipe">def</span> <a href='002-typing.mu.html#L201'>insert-at-cursor</a> editor:&amp;:editor, c:char, <a href='../081print.mu.html#L4'>screen</a>:&amp;:<a href='../081print.mu.html#L4'>screen</a><span class="muRecipe"> -&gt; </span>go-render?:bool, editor:&amp;:editor, <a href='../081print.mu.html#L4'>screen</a>:&amp;:<a href='../081print.mu.html#L4'>screen</a> [ <span id="L202" class="LineNr"> 202 </span> <span class="Constant">local-scope</span> <span id="L203" class="LineNr"> 203 </span> <span class="Constant">load-ingredients</span> <span id="L204" class="LineNr"> 204 </span> before-cursor:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">before-cursor:offset</span> <span id="L205" class="LineNr"> 205 </span> insert c, before-cursor <span id="L206" class="LineNr"> 206 </span> before-cursor <span class="Special">&lt;-</span> <a href='../065duplex_list.mu.html#L29'>next</a> before-cursor <span id="L207" class="LineNr"> 207 </span> *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">before-cursor:offset</span>, before-cursor <span id="L208" class="LineNr"> 208 </span> cursor-row:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-row:offset</span> <span id="L209" class="LineNr"> 209 </span> cursor-column:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-column:offset</span> <span id="L210" class="LineNr"> 210 </span> left:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">left:offset</span> <span id="L211" class="LineNr"> 211 </span> right:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">right:offset</span> <span id="L212" class="LineNr"> 212 </span> save-row:num <span class="Special">&lt;-</span> copy cursor-row <span id="L213" class="LineNr"> 213 </span> save-column:num <span class="Special">&lt;-</span> copy cursor-column <span id="L214" class="LineNr"> 214 </span> <a href='../081print.mu.html#L581'>screen-width</a>:num <span class="Special">&lt;-</span> <a href='../081print.mu.html#L581'>screen-width</a> <a href='../081print.mu.html#L4'>screen</a> <span id="L215" class="LineNr"> 215 </span> <a href='../081print.mu.html#L594'>screen-height</a>:num <span class="Special">&lt;-</span> <a href='../081print.mu.html#L594'>screen-height</a> <a href='../081print.mu.html#L4'>screen</a> <span id="L216" class="LineNr"> 216 </span> <span class="Comment"># occasionally we'll need to mess with the cursor</span> <span id="L217" class="LineNr"> 217 </span><span class="Constant"> <a href='002-typing.mu.html#L217'>&lt;insert-character-special-case&gt;</a></span> <span id="L218" class="LineNr"> 218 </span> <span class="Comment"># but mostly we'll just move the cursor right</span> <span id="L219" class="LineNr"> 219 </span> cursor-column <span class="Special">&lt;-</span> add cursor-column,<span class="Constant"> 1</span> <span id="L220" class="LineNr"> 220 </span> *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column <span id="L221" class="LineNr"> 221 </span> <a href='../065duplex_list.mu.html#L29'>next</a>:&amp;:duplex-list:char <span class="Special">&lt;-</span> <a href='../065duplex_list.mu.html#L29'>next</a> before-cursor <span id="L222" class="LineNr"> 222 </span> <span class="Delimiter">{</span> <span id="L223" class="LineNr"> 223 </span> <span class="Conceal">¦</span> <span class="Comment"># at end of all text? no need to scroll? just print the character and leave</span> <span id="L224" class="LineNr"> 224 </span> <span class="Conceal">¦</span> at-end?:bool <span class="Special">&lt;-</span> equal <a href='../065duplex_list.mu.html#L29'>next</a>, <span class="Constant">0/null</span> <span id="L225" class="LineNr"> 225 </span> <span class="Conceal">¦</span> <span class="muControl">break-unless</span> at-end? <span id="L226" class="LineNr"> 226 </span> <span class="Conceal">¦</span> bottom:num <span class="Special">&lt;-</span> subtract <a href='../081print.mu.html#L594'>screen-height</a>,<span class="Constant"> 1</span> <span id="L227" class="LineNr"> 227 </span> <span class="Conceal">¦</span> at-bottom?:bool <span class="Special">&lt;-</span> equal save-row, bottom <span id="L228" class="LineNr"> 228 </span> <span class="Conceal">¦</span> at-right?:bool <span class="Special">&lt;-</span> equal save-column, right <span id="L229" class="LineNr"> 229 </span> <span class="Conceal">¦</span> overflow?:bool <span class="Special">&lt;-</span> and at-bottom?, at-right? <span id="L230" class="LineNr"> 230 </span> <span class="Conceal">¦</span> <span class="muControl">break-if</span> overflow? <span id="L231" class="LineNr"> 231 </span> <span class="Conceal">¦</span> <a href='../081print.mu.html#L442'>move-cursor</a> <a href='../081print.mu.html#L4'>screen</a>, save-row, save-column <span id="L232" class="LineNr"> 232 </span> <span class="Conceal">¦</span> print <a href='../081print.mu.html#L4'>screen</a>, c <span id="L233" class="LineNr"> 233 </span> <span class="Conceal">¦</span> <span class="muControl">return</span> <span class="Constant">0/don't-render</span> <span id="L234" class="LineNr"> 234 </span> <span class="Delimiter">}</span> <span id="L235" class="LineNr"> 235 </span> <span class="Delimiter">{</span> <span id="L236" class="LineNr"> 236 </span> <span class="Conceal">¦</span> <span class="Comment"># not at right margin? print the character and rest of line</span> <span id="L237" class="LineNr"> 237 </span> <span class="Conceal">¦</span> <span class="muControl">break-unless</span> <a href='../065duplex_list.mu.html#L29'>next</a> <span id="L238" class="LineNr"> 238 </span> <span class="Conceal">¦</span> at-right?:bool <span class="Special">&lt;-</span> greater-or-equal cursor-column, <a href='../081print.mu.html#L581'>screen-width</a> <span id="L239" class="LineNr"> 239 </span> <span class="Conceal">¦</span> <span class="muControl">break-if</span> at-right? <span id="L240" class="LineNr"> 240 </span> <span class="Conceal">¦</span> curr:&amp;:duplex-list:char <span class="Special">&lt;-</span> copy before-cursor <span id="L241" class="LineNr"> 241 </span> <span class="Conceal">¦</span> <a href='../081print.mu.html#L442'>move-cursor</a> <a href='../081print.mu.html#L4'>screen</a>, save-row, save-column <span id="L242" class="LineNr"> 242 </span> <span class="Conceal">¦</span> curr-column:num <span class="Special">&lt;-</span> copy save-column <span id="L243" class="LineNr"> 243 </span> <span class="Conceal">¦</span> <span class="Delimiter">{</span> <span id="L244" class="LineNr"> 244 </span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Comment"># hit right margin? give up and let caller render</span> <span id="L245" class="LineNr"> 245 </span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> at-right?:bool <span class="Special">&lt;-</span> greater-than curr-column, right <span id="L246" class="LineNr"> 246 </span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">return-if</span> at-right?, <span class="Constant">1/go-render</span> <span id="L247" class="LineNr"> 247 </span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">break-unless</span> curr <span id="L248" class="LineNr"> 248 </span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Comment"># newline? done.</span> <span id="L249" class="LineNr"> 249 </span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> currc:char <span class="Special">&lt;-</span> get *curr, <span class="Constant">value:offset</span> <span id="L250" class="LineNr"> 250 </span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> at-newline?:bool <span class="Special">&lt;-</span> equal currc, <span class="Constant">10/newline</span> <span id="L251" class="LineNr"> 251 </span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">break-if</span> at-newline? <span id="L252" class="LineNr"> 252 </span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> print <a href='../081print.mu.html#L4'>screen</a>, currc <span id="L253" class="LineNr"> 253 </span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> curr-column <span class="Special">&lt;-</span> add curr-column,<span class="Constant"> 1</span> <span id="L254" class="LineNr"> 254 </span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> curr <span class="Special">&lt;-</span> <a href='../065duplex_list.mu.html#L29'>next</a> curr <span id="L255" class="LineNr"> 255 </span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">loop</span> <span id="L256" class="LineNr"> 256 </span> <span class="Conceal">¦</span> <span class="Delimiter">}</span> <span id="L257" class="LineNr"> 257 </span> <span class="Conceal">¦</span> <span class="muControl">return</span> <span class="Constant">0/don't-render</span> <span id="L258" class="LineNr"> 258 </span> <span class="Delimiter">}</span> <span id="L259" class="LineNr"> 259 </span> <span class="muControl">return</span> <span class="Constant">1/go-render</span> <span id="L260" class="LineNr"> 260 </span>] <span id="L261" class="LineNr"> 261 </span> <span id="L262" class="LineNr"> 262 </span><span class="Comment"># helper for tests</span> <span id="L263" class="LineNr"> 263 </span><span class="muRecipe">def</span> <a href='002-typing.mu.html#L263'>editor-render</a> <a href='../081print.mu.html#L4'>screen</a>:&amp;:<a href='../081print.mu.html#L4'>screen</a>, editor:&amp;:editor<span class="muRecipe"> -&gt; </span><a href='../081print.mu.html#L4'>screen</a>:&amp;:<a href='../081print.mu.html#L4'>screen</a>, editor:&amp;:editor [ <span id="L264" class="LineNr"> 264 </span> <span class="Constant">local-scope</span> <span id="L265" class="LineNr"> 265 </span> <span class="Constant">load-ingredients</span> <span id="L266" class="LineNr"> 266 </span> left:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">left:offset</span> <span id="L267" class="LineNr"> 267 </span> right:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">right:offset</span> <span id="L268" class="LineNr"> 268 </span> row:num, column:num <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L123'>render</a> <a href='../081print.mu.html#L4'>screen</a>, editor <span id="L269" class="LineNr"> 269 </span> <a href='../081print.mu.html#L408'>clear-line-until</a> <a href='../081print.mu.html#L4'>screen</a>, right <span id="L270" class="LineNr"> 270 </span> row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span> <span id="L271" class="LineNr"> 271 </span> <a href='002-typing.mu.html#L1056'>draw-horizontal</a> <a href='../081print.mu.html#L4'>screen</a>, row, left, right, <span class="Constant">9480/horizontal-dotted</span> <span id="L272" class="LineNr"> 272 </span> row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span> <span id="L273" class="LineNr"> 273 </span> <a href='001-editor.mu.html#L224'>clear-screen-from</a> <a href='../081print.mu.html#L4'>screen</a>, row, left, left, right <span id="L274" class="LineNr"> 274 </span>] <span id="L275" class="LineNr"> 275 </span> <span id="L276" class="LineNr"> 276 </span><span class="muScenario">scenario</span> editor-handles-empty-event-queue [ <span id="L277" class="LineNr"> 277 </span> <span class="Constant">local-scope</span> <span id="L278" class="LineNr"> 278 </span> assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span> <span id="L279" class="LineNr"> 279 </span> e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L52'>new-editor</a> <span class="Constant">[abc]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> <span id="L280" class="LineNr"> 280 </span> <a href='002-typing.mu.html#L263'>editor-render</a> <a href='../081print.mu.html#L4'>screen</a>, e <span id="L281" class="LineNr"> 281 </span> assume-console <span class="Constant">[]</span> <span id="L282" class="LineNr"> 282 </span> run [ <span id="L283" class="LineNr"> 283 </span> <span class="Conceal">¦</span> <a href='002-typing.mu.html#L14'>editor-event-loop</a> <a href='../081print.mu.html#L4'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e <span id="L284" class="LineNr"> 284 </span> ] <span id="L285" class="LineNr"> 285 </span> screen-should-contain [ <span id="L286" class="LineNr"> 286 </span> <span class="Conceal">¦</span><span class="Constant"> . .</span> <span id="L287" class="LineNr"> 287 </span> <span class="Conceal">¦</span><span class="Constant"> .abc .</span> <span id="L288" class="LineNr"> 288 </span><span class="Constant"> </span><span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌.</span> <span id="L289" class="LineNr"> 289 </span> <span class="Conceal">¦</span><span class="Constant"> . .</span> <span id="L290" class="LineNr"> 290 </span> ] <span id="L291" class="LineNr"> 291 </span>] <span id="L292" class="LineNr"> 292 </span> <span id="L293" class="LineNr"> 293 </span><span class="muScenario">scenario</span> editor-handles-mouse-clicks [ <span id="L294" class="LineNr"> 294 </span> <span class="Constant">local-scope</span> <span id="L295" class="LineNr"> 295 </span> assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span> <span id="L296" class="LineNr"> 296 </span> e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L52'>new-editor</a> <span class="Constant">[abc]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> <span id="L297" class="LineNr"> 297 </span> <a href='002-typing.mu.html#L263'>editor-render</a> <a href='../081print.mu.html#L4'>screen</a>, e <span id="L298" class="LineNr"> 298 </span> $clear-trace <span id="L299" class="LineNr"> 299 </span> assume-console [ <span id="L300" class="LineNr"> 300 </span> <span class="Conceal">¦</span> left-click<span class="Constant"> 1</span>,<span class="Constant"> 1</span> <span class="Comment"># on the 'b'</span> <span id="L301" class="LineNr"> 301 </span> ] <span id="L302" class="LineNr"> 302 </span> run [ <span id="L303" class="LineNr"> 303 </span> <span class="Conceal">¦</span> <a href='002-typing.mu.html#L14'>editor-event-loop</a> <a href='../081print.mu.html#L4'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e <span id="L304" class="LineNr"> 304 </span> <span class="Conceal">¦</span> 3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span> <span id="L305" class="LineNr"> 305 </span> <span class="Conceal">¦</span> 4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span> <span id="L306" class="LineNr"> 306 </span> ] <span id="L307" class="LineNr"> 307 </span> screen-should-contain [ <span id="L308" class="LineNr"> 308 </span> <span class="Conceal">¦</span><span class="Constant"> . .</span> <span id="L309" class="LineNr"> 309 </span> <span class="Conceal">¦</span><span class="Constant"> .abc .</span> <span id="L310" class="LineNr"> 310 </span><span class="Constant"> </span><span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌.</span> <span id="L311" class="LineNr"> 311 </span> <span class="Conceal">¦</span><span class="Constant"> . .</span> <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="Conceal">¦</span><span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span> <span class="Comment"># cursor is at row 0..</span> <span id="L315" class="LineNr"> 315 </span> <span class="Conceal">¦</span><span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span> <span class="Comment"># ..and column 1</span> <span id="L316" class="LineNr"> 316 </span> ] <span id="L317" class="LineNr"> 317 </span> check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span> <span id="L318" class="LineNr"> 318 </span>] <span id="L319" class="LineNr"> 319 </span> <span id="L320" class="LineNr"> 320 </span><span class="muScenario">scenario</span> editor-handles-mouse-clicks-outside-text [ <span id="L321" class="LineNr"> 321 </span> <span class="Constant">local-scope</span> <span id="L322" class="LineNr"> 322 </span> assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span> <span id="L323" class="LineNr"> 323 </span> e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L52'>new-editor</a> <span class="Constant">[abc]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> <span id="L324" class="LineNr"> 324 </span> $clear-trace <span id="L325" class="LineNr"> 325 </span> assume-console [ <span id="L326" class="LineNr"> 326 </span> <span class="Conceal">¦</span> left-click<span class="Constant"> 1</span>,<span class="Constant"> 7</span> <span class="Comment"># last line, to the right of text</span> <span id="L327" class="LineNr"> 327 </span> ] <span id="L328" class="LineNr"> 328 </span> run [ <span id="L329" class="LineNr"> 329 </span> <span class="Conceal">¦</span> <a href='002-typing.mu.html#L14'>editor-event-loop</a> <a href='../081print.mu.html#L4'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e <span id="L330" class="LineNr"> 330 </span> <span class="Conceal">¦</span> 3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span> <span id="L331" class="LineNr"> 331 </span> <span class="Conceal">¦</span> 4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span> <span id="L332" class="LineNr"> 332 </span> ] <span id="L333" class="LineNr"> 333 </span> memory-should-contain [ <span id="L334" class="LineNr"> 334 </span> <span class="Conceal">¦</span><span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span> <span class="Comment"># cursor row</span> <span id="L335" class="LineNr"> 335 </span> <span class="Conceal">¦</span><span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span> <span class="Comment"># cursor column</span> <span id="L336" class="LineNr"> 336 </span> ] <span id="L337" class="LineNr"> 337 </span> check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span> <span id="L338" class="LineNr"> 338 </span>] <span id="L339" class="LineNr"> 339 </span> <span id="L340" class="LineNr"> 340 </span><span class="muScenario">scenario</span> editor-handles-mouse-clicks-outside-text-2 [ <span id="L341" class="LineNr"> 341 </span> <span class="Constant">local-scope</span> <span id="L342" class="LineNr"> 342 </span> assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span> <span id="L343" class="LineNr"> 343 </span> s:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span> <span id="L344" class="LineNr"> 344 </span><span class="Constant">def]</span> <span id="L345" class="LineNr"> 345 </span> e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L52'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> <span id="L346" class="LineNr"> 346 </span> $clear-trace <span id="L347" class="LineNr"> 347 </span> assume-console [ <span id="L348" class="LineNr"> 348 </span> <span class="Conceal">¦</span> left-click<span class="Constant"> 1</span>,<span class="Constant"> 7</span> <span class="Comment"># interior line, to the right of text</span> <span id="L349" class="LineNr"> 349 </span> ] <span id="L350" class="LineNr"> 350 </span> run [ <span id="L351" class="LineNr"> 351 </span> <span class="Conceal">¦</span> <a href='002-typing.mu.html#L14'>editor-event-loop</a> <a href='../081print.mu.html#L4'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e <span id="L352" class="LineNr"> 352 </span> <span class="Conceal">¦</span> 3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span> <span id="L353" class="LineNr"> 353 </span> <span class="Conceal">¦</span> 4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span> <span id="L354" class="LineNr"> 354 </span> ] <span id="L355" class="LineNr"> 355 </span> memory-should-contain [ <span id="L356" class="LineNr"> 356 </span> <span class="Conceal">¦</span><span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span> <span class="Comment"># cursor row</span> <span id="L357" class="LineNr"> 357 </span> <span class="Conceal">¦</span><span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span> <span class="Comment"># cursor column</span> <span id="L358" class="LineNr"> 358 </span> ] <span id="L359" class="LineNr"> 359 </span> check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span> <span id="L360" class="LineNr"> 360 </span>] <span id="L361" class="LineNr"> 361 </span> <span id="L362" class="LineNr"> 362 </span><span class="muScenario">scenario</span> editor-handles-mouse-clicks-outside-text-3 [ <span id="L363" class="LineNr"> 363 </span> <span class="Constant">local-scope</span> <span id="L364" class="LineNr"> 364 </span> assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span> <span id="L365" class="LineNr"> 365 </span> s:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span> <span id="L366" class="LineNr"> 366 </span><span class="Constant">def]</span> <span id="L367" class="LineNr"> 367 </span> e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L52'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> <span id="L368" class="LineNr"> 368 </span> $clear-trace <span id="L369" class="LineNr"> 369 </span> assume-console [ <span id="L370" class="LineNr"> 370 </span> <span class="Conceal">¦</span> left-click<span class="Constant"> 3</span>,<span class="Constant"> 7</span> <span class="Comment"># below text</span> <span id="L371" class="LineNr"> 371 </span> ] <span id="L372" class="LineNr"> 372 </span> run [ <span id="L373" class="LineNr"> 373 </span> <span class="Conceal">¦</span> <a href='002-typing.mu.html#L14'>editor-event-loop</a> <a href='../081print.mu.html#L4'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e <span id="L374" class="LineNr"> 374 </span> <span class="Conceal">¦</span> 3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span> <span id="L375" class="LineNr"> 375 </span> <span class="Conceal">¦</span> 4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span> <span id="L376" class="LineNr"> 376 </span> ] <span id="L377" class="LineNr"> 377 </span> memory-should-contain [ <span id="L378" class="LineNr"> 378 </span> <span class="Conceal">¦</span><span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span> <span class="Comment"># cursor row</span> <span id="L379" class="LineNr"> 379 </span> <span class="Conceal">¦</span><span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span> <span class="Comment"># cursor column</span> <span id="L380" class="LineNr"> 380 </span> ] <span id="L381" class="LineNr"> 381 </span> check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span> <span id="L382" class="LineNr"> 382 </span>] <span id="L383" class="LineNr"> 383 </span> <span id="L384" class="LineNr"> 384 </span><span class="muScenario">scenario</span> editor-handles-mouse-clicks-outside-column [ <span id="L385" class="LineNr"> 385 </span> <span class="Constant">local-scope</span> <span id="L386" class="LineNr"> 386 </span> assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span> <span id="L387" class="LineNr"> 387 </span> <span class="Comment"># editor occupies only left half of screen</span> <span id="L388" class="LineNr"> 388 </span> e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L52'>new-editor</a> <span class="Constant">[abc]</span>, <span class="Constant">0/left</span>, <span class="Constant">5/right</span> <span id="L389" class="LineNr"> 389 </span> <a href='002-typing.mu.html#L263'>editor-render</a> <a href='../081print.mu.html#L4'>screen</a>, e <span id="L390" class="LineNr"> 390 </span> $clear-trace <span id="L391" class="LineNr"> 391 </span> assume-console [ <span id="L392" class="LineNr"> 392 </span> <span class="Conceal">¦</span> <span class="Comment"># click on right half of screen</span> <span id="L393" class="LineNr"> 393 </span> <span class="Conceal">¦</span> left-click<span class="Constant"> 3</span>,<span class="Constant"> 8</span> <span id="L394" class="LineNr"> 394 </span> ] <span id="L395" class="LineNr"> 395 </span> run [ <span id="L396" class="LineNr"> 396 </span> <span class="Conceal">¦</span> <a href='002-typing.mu.html#L14'>editor-event-loop</a> <a href='../081print.mu.html#L4'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e <span id="L397" class="LineNr"> 397 </span> <span class="Conceal">¦</span> 3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span> <span id="L398" class="LineNr"> 398 </span> <span class="Conceal">¦</span> 4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span> <span id="L399" class="LineNr"> 399 </span> ] <span id="L400" class="LineNr"> 400 </span> screen-should-contain [ <span id="L401" class="LineNr"> 401 </span> <span class="Conceal">¦</span><span class="Constant"> . .</span> <span id="L402" class="LineNr"> 402 </span> <span class="Conceal">¦</span><span class="Constant"> .abc .</span> <span id="L403" class="LineNr"> 403 </span> <span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌ .</span> <span id="L404" class="LineNr"> 404 </span> <span class="Conceal">¦</span><span class="Constant"> . .</span> <span id="L405" class="LineNr"> 405 </span> ] <span id="L406" class="LineNr"> 406 </span> memory-should-contain [ <span id="L407" class="LineNr"> 407 </span> <span class="Conceal">¦</span><span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span> <span class="Comment"># no change to cursor row</span> <span id="L408" class="LineNr"> 408 </span> <span class="Conceal">¦</span><span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span> <span class="Comment"># ..or column</span> <span id="L409" class="LineNr"> 409 </span> ] <span id="L410" class="LineNr"> 410 </span> check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span> <span id="L411" class="LineNr"> 411 </span>] <span id="L412" class="LineNr"> 412 </span> <span id="L413" class="LineNr"> 413 </span><span class="muScenario">scenario</span> editor-handles-mouse-clicks-in-menu-area [ <span id="L414" class="LineNr"> 414 </span> <span class="Constant">local-scope</span> <span id="L415" class="LineNr"> 415 </span> assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span> <span id="L416" class="LineNr"> 416 </span> e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L52'>new-editor</a> <span class="Constant">[abc]</span>, <span class="Constant">0/left</span>, <span class="Constant">5/right</span> <span id="L417" class="LineNr"> 417 </span> <a href='002-typing.mu.html#L263'>editor-render</a> <a href='../081print.mu.html#L4'>screen</a>, e <span id="L418" class="LineNr"> 418 </span> $clear-trace <span id="L419" class="LineNr"> 419 </span> assume-console [ <span id="L420" class="LineNr"> 420 </span> <span class="Conceal">¦</span> <span class="Comment"># click on first, 'menu' row</span> <span id="L421" class="LineNr"> 421 </span> <span class="Conceal">¦</span> left-click<span class="Constant"> 0</span>,<span class="Constant"> 3</span> <span id="L422" class="LineNr"> 422 </span> ] <span id="L423" class="LineNr"> 423 </span> run [ <span id="L424" class="LineNr"> 424 </span> <span class="Conceal">¦</span> <a href='002-typing.mu.html#L14'>editor-event-loop</a> <a href='../081print.mu.html#L4'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e <span id="L425" class="LineNr"> 425 </span> <span class="Conceal">¦</span> 3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span> <span id="L426" class="LineNr"> 426 </span> <span class="Conceal">¦</span> 4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span> <span id="L427" class="LineNr"> 427 </span> ] <span id="L428" class="LineNr"> 428 </span> <span class="Comment"># no change to cursor</span> <span id="L429" class="LineNr"> 429 </span> memory-should-contain [ <span id="L430" class="LineNr"> 430 </span> <span class="Conceal">¦</span><span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span> <span id="L431" class="LineNr"> 431 </span> <span class="Conceal">¦</span><span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span> <span id="L432" class="LineNr"> 432 </span> ] <span id="L433" class="LineNr"> 433 </span>] <span id="L434" class="LineNr"> 434 </span> <span id="L435" class="LineNr"> 435 </span><span class="muScenario">scenario</span> editor-inserts-characters-into-empty-editor [ <span id="L436" class="LineNr"> 436 </span> <span class="Constant">local-scope</span> <span id="L437" class="LineNr"> 437 </span> assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span> <span id="L438" class="LineNr"> 438 </span> e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L52'>new-editor</a> <span class="Constant">[]</span>, <span class="Constant">0/left</span>, <span class="Constant">5/right</span> <span id="L439" class="LineNr"> 439 </span> <a href='002-typing.mu.html#L263'>editor-render</a> <a href='../081print.mu.html#L4'>screen</a>, e <span id="L440" class="LineNr"> 440 </span> $clear-trace <span id="L441" class="LineNr"> 441 </span> assume-console [ <span id="L442" class="LineNr"> 442 </span> <span class="Conceal">¦</span> type <span class="Constant">[abc]</span> <span id="L443" class="LineNr"> 443 </span> ] <span id="L444" class="LineNr"> 444 </span> run [ <span id="L445" class="LineNr"> 445 </span> <span class="Conceal">¦</span> <a href='002-typing.mu.html#L14'>editor-event-loop</a> <a href='../081print.mu.html#L4'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e <span id="L446" class="LineNr"> 446 </span> ] <span id="L447" class="LineNr"> 447 </span> screen-should-contain [ <span id="L448" class="LineNr"> 448 </span> <span class="Conceal">¦</span><span class="Constant"> . .</span> <span id="L449" class="LineNr"> 449 </span> <span class="Conceal">¦</span><span class="Constant"> .abc .</span> <span id="L450" class="LineNr"> 450 </span> <span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌ .</span> <span id="L451" class="LineNr"> 451 </span> <span class="Conceal">¦</span><span class="Constant"> . .</span> <span id="L452" class="LineNr"> 452 </span> ] <span id="L453" class="LineNr"> 453 </span> check-trace-count-for-label<span class="Constant"> 3</span>, <span class="Constant">[print-character]</span> <span id="L454" class="LineNr"> 454 </span>] <span id="L455" class="LineNr"> 455 </span> <span id="L456" class="LineNr"> 456 </span><span class="muScenario">scenario</span> editor-inserts-characters-at-cursor [ <span id="L457" class="LineNr"> 457 </span> <span class="Constant">local-scope</span> <span id="L458" class="LineNr"> 458 </span> assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span> <span id="L459" class="LineNr"> 459 </span> e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L52'>new-editor</a> <span class="Constant">[abc]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> <span id="L460" class="LineNr"> 460 </span> <a href='002-typing.mu.html#L263'>editor-render</a> <a href='../081print.mu.html#L4'>screen</a>, e <span id="L461" class="LineNr"> 461 </span> $clear-trace <span id="L462" class="LineNr"> 462 </span> <span class="Comment"># type two letters at different places</span> <span id="L463" class="LineNr"> 463 </span> assume-console [ <span id="L464" class="LineNr"> 464 </span> <span class="Conceal">¦</span> type <span class="Constant">[0]</span> <span id="L465" class="LineNr"> 465 </span> <span class="Conceal">¦</span> left-click<span class="Constant"> 1</span>,<span class="Constant"> 2</span> <span id="L466" class="LineNr"> 466 </span> <span class="Conceal">¦</span> type <span class="Constant">[d]</span> <span id="L467" class="LineNr"> 467 </span> ] <span id="L468" class="LineNr"> 468 </span> run [ <span id="L469" class="LineNr"> 469 </span> <span class="Conceal">¦</span> <a href='002-typing.mu.html#L14'>editor-event-loop</a> <a href='../081print.mu.html#L4'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e <span id="L470" class="LineNr"> 470 </span> ] <span id="L471" class="LineNr"> 471 </span> screen-should-contain [ <span id="L472" class="LineNr"> 472 </span> <span class="Conceal">¦</span><span class="Constant"> . .</span> <span id="L473" class="LineNr"> 473 </span> <span class="Conceal">¦</span><span class="Constant"> .0adbc .</span> <span id="L474" class="LineNr"> 474 </span><span class="Constant"> </span><span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌.</span> <span id="L475" class="LineNr"> 475 </span> <span class="Conceal">¦</span><span class="Constant"> . .</span> <span id="L476" class="LineNr"> 476 </span> ] <span id="L477" class="LineNr"> 477 </span> check-trace-count-for-label<span class="Constant"> 7</span>, <span class="Constant">[print-character]</span> <span class="Comment"># 4 for first letter, 3 for second</span> <span id="L478" class="LineNr"> 478 </span>] <span id="L479" class="LineNr"> 479 </span> <span id="L480" class="LineNr"> 480 </span><span class="muScenario">scenario</span> editor-inserts-characters-at-cursor-2 [ <span id="L481" class="LineNr"> 481 </span> <span class="Constant">local-scope</span> <span id="L482" class="LineNr"> 482 </span> assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span> <span id="L483" class="LineNr"> 483 </span> e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L52'>new-editor</a> <span class="Constant">[abc]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> <span id="L484" class="LineNr"> 484 </span> <a href='002-typing.mu.html#L263'>editor-render</a> <a href='../081print.mu.html#L4'>screen</a>, e <span id="L485" class="LineNr"> 485 </span> $clear-trace <span id="L486" class="LineNr"> 486 </span> assume-console [ <span id="L487" class="LineNr"> 487 </span> <span class="Conceal">¦</span> left-click<span class="Constant"> 1</span>,<span class="Constant"> 5</span> <span class="Comment"># right of last line</span> <span id="L488" class="LineNr"> 488 </span> <span class="Conceal">¦</span> type <span class="Constant">[d]</span> <span id="L489" class="LineNr"> 489 </span> ] <span id="L490" class="LineNr"> 490 </span> run [ <span id="L491" class="LineNr"> 491 </span> <span class="Conceal">¦</span> <a href='002-typing.mu.html#L14'>editor-event-loop</a> <a href='../081print.mu.html#L4'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e <span id="L492" class="LineNr"> 492 </span> ] <span id="L493" class="LineNr"> 493 </span> screen-should-contain [ <span id="L494" class="LineNr"> 494 </span> <span class="Conceal">¦</span><span class="Constant"> . .</span> <span id="L495" class="LineNr"> 495 </span> <span class="Conceal">¦</span><span class="Constant"> .abcd .</span> <span id="L496" class="LineNr"> 496 </span><span class="Constant"> </span><span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌.</span> <span id="L497" class="LineNr"> 497 </span> <span class="Conceal">¦</span><span class="Constant"> . .</span> <span id="L498" class="LineNr"> 498 </span> ] <span id="L499" class="LineNr"> 499 </span> check-trace-count-for-label<span class="Constant"> 1</span>, <span class="Constant">[print-character]</span> <span id="L500" class="LineNr"> 500 </span>] <span id="L501" class="LineNr"> 501 </span> <span id="L502" class="LineNr"> 502 </span><span class="muScenario">scenario</span> editor-inserts-characters-at-cursor-5 [ <span id="L503" class="LineNr"> 503 </span> <span class="Constant">local-scope</span> <span id="L504" class="LineNr"> 504 </span> assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span> <span id="L505" class="LineNr"> 505 </span> s:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span> <span id="L506" class="LineNr"> 506 </span><span class="Constant">d]</span> <span id="L507" class="LineNr"> 507 </span> e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L52'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> <span id="L508" class="LineNr"> 508 </span> <a href='002-typing.mu.html#L263'>editor-render</a> <a href='../081print.mu.html#L4'>screen</a>, e <span id="L509" class="LineNr"> 509 </span> $clear-trace <span id="L510" class="LineNr"> 510 </span> assume-console [ <span id="L511" class="LineNr"> 511 </span> <span class="Conceal">¦</span> left-click<span class="Constant"> 1</span>,<span class="Constant"> 5</span> <span class="Comment"># right of non-last line</span> <span id="L512" class="LineNr"> 512 </span> <span class="Conceal">¦</span> type <span class="Constant">[e]</span> <span id="L513" class="LineNr"> 513 </span> ] <span id="L514" class="LineNr"> 514 </span> run [ <span id="L515" class="LineNr"> 515 </span> <span class="Conceal">¦</span> <a href='002-typing.mu.html#L14'>editor-event-loop</a> <a href='../081print.mu.html#L4'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e <span id="L516" class="LineNr"> 516 </span> ] <span id="L517" class="LineNr"> 517 </span> screen-should-contain [ <span id="L518" class="LineNr"> 518 </span> <span class="Conceal">¦</span><span class="Constant"> . .</span> <span id="L519" class="LineNr"> 519 </span> <span class="Conceal">¦</span><span class="Constant"> .abce .</span> <span id="L520" class="LineNr"> 520 </span> <span class="Conceal">¦</span><span class="Constant"> .d .</span> <span id="L521" class="LineNr"> 521 </span><span class="Constant"> </span><span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌.</span> <span id="L522" class="LineNr"> 522 </span> <span class="Conceal">¦</span><span class="Constant"> . .</span> <span id="L523" class="LineNr"> 523 </span> ] <span id="L524" class="LineNr"> 524 </span> check-trace-count-for-label<span class="Constant"> 1</span>, <span class="Constant">[print-character]</span> <span id="L525" class="LineNr"> 525 </span>] <span id="L526" class="LineNr"> 526 </span> <span id="L527" class="LineNr"> 527 </span><span class="muScenario">scenario</span> editor-inserts-characters-at-cursor-3 [ <span id="L528" class="LineNr"> 528 </span> <span class="Constant">local-scope</span> <span id="L529" class="LineNr"> 529 </span> assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span> <span id="L530" class="LineNr"> 530 </span> e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L52'>new-editor</a> <span class="Constant">[abc]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> <span id="L531" class="LineNr"> 531 </span> <a href='002-typing.mu.html#L263'>editor-render</a> <a href='../081print.mu.html#L4'>screen</a>, e <span id="L532" class="LineNr"> 532 </span> $clear-trace <span id="L533" class="LineNr"> 533 </span> assume-console [ <span id="L534" class="LineNr"> 534 </span> <span class="Conceal">¦</span> left-click<span class="Constant"> 3</span>,<span class="Constant"> 5</span> <span class="Comment"># below all text</span> <span id="L535" class="LineNr"> 535 </span> <span class="Conceal">¦</span> type <span class="Constant">[d]</span> <span id="L536" class="LineNr"> 536 </span> ] <span id="L537" class="LineNr"> 537 </span> run [ <span id="L538" class="LineNr"> 538 </span> <span class="Conceal">¦</span> <a href='002-typing.mu.html#L14'>editor-event-loop</a> <a href='../081print.mu.html#L4'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e <span id="L539" class="LineNr"> 539 </span> ] <span id="L540" class="LineNr"> 540 </span> screen-should-contain [ <span id="L541" class="LineNr"> 541 </span> <span class="Conceal">¦</span><span class="Constant"> . .</span> <span id="L542" class="LineNr"> 542 </span> <span class="Conceal">¦</span><span class="Constant"> .abcd .</span> <span id="L543" class="LineNr"> 543 </span><span class="Constant"> </span><span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌.</span> <span id="L544" class="LineNr"> 544 </span> <span class="Conceal">¦</span><span class="Constant"> . .</span> <span id="L545" class="LineNr"> 545 </span> ] <span id="L546" class="LineNr"> 546 </span> check-trace-count-for-label<span class="Constant"> 1</span>, <span class="Constant">[print-character]</span> <span id="L547" class="LineNr"> 547 </span>] <span id="L548" class="LineNr"> 548 </span> <span id="L549" class="LineNr"> 549 </span><span class="muScenario">scenario</span> editor-inserts-characters-at-cursor-4 [ <span id="L550" class="LineNr"> 550 </span> <span class="Constant">local-scope</span> <span id="L551" class="LineNr"> 551 </span> assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span> <span id="L552" class="LineNr"> 552 </span> s:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span> <span id="L553" class="LineNr"> 553 </span><span class="Constant">d]</span> <span id="L554" class="LineNr"> 554 </span> e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L52'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> <span id="L555" class="LineNr"> 555 </span> <a href='002-typing.mu.html#L263'>editor-render</a> <a href='../081print.mu.html#L4'>screen</a>, e <span id="L556" class="LineNr"> 556 </span> $clear-trace <span id="L557" class="LineNr"> 557 </span> assume-console [ <span id="L558" class="LineNr"> 558 </span> <span class="Conceal">¦</span> left-click<span class="Constant"> 3</span>,<span class="Constant"> 5</span> <span class="Comment"># below all text</span> <span id="L559" class="LineNr"> 559 </span> <span class="Conceal">¦</span> type <span class="Constant">[e]</span> <span id="L560" class="LineNr"> 560 </span> ] <span id="L561" class="LineNr"> 561 </span> run [ <span id="L562" class="LineNr"> 562 </span> <span class="Conceal">¦</span> <a href='002-typing.mu.html#L14'>editor-event-loop</a> <a href='../081print.mu.html#L4'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e <span id="L563" class="LineNr"> 563 </span> ] <span id="L564" class="LineNr"> 564 </span> screen-should-contain [ <span id="L565" class="LineNr"> 565 </span> <span class="Conceal">¦</span><span class="Constant"> . .</span> <span id="L566" class="LineNr"> 566 </span> <span class="Conceal">¦</span><span class="Constant"> .abc .</span> <span id="L567" class="LineNr"> 567 </span> <span class="Conceal">¦</span><span class="Constant"> .de .</span> <span id="L568" class="LineNr"> 568 </span><span class="Constant"> </span><span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌.</span> <span id="L569" class="LineNr"> 569 </span> <span class="Conceal">¦</span><span class="Constant"> . .</span> <span id="L570" class="LineNr"> 570 </span> ] <span id="L571" class="LineNr"> 571 </span> check-trace-count-for-label<span class="Constant"> 1</span>, <span class="Constant">[print-character]</span> <span id="L572" class="LineNr"> 572 </span>] <span id="L573" class="LineNr"> 573 </span> <span id="L574" class="LineNr"> 574 </span><span class="muScenario">scenario</span> editor-inserts-characters-at-cursor-6 [ <span id="L575" class="LineNr"> 575 </span> <span class="Constant">local-scope</span> <span id="L576" class="LineNr"> 576 </span> assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span> <span id="L577" class="LineNr"> 577 </span> s:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span> <span id="L578" class="LineNr"> 578 </span><span class="Constant">d]</span> <span id="L579" class="LineNr"> 579 </span> e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L52'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> <span id="L580" class="LineNr"> 580 </span> <a href='002-typing.mu.html#L263'>editor-render</a> <a href='../081print.mu.html#L4'>screen</a>, e <span id="L581" class="LineNr"> 581 </span> $clear-trace <span id="L582" class="LineNr"> 582 </span> assume-console [ <span id="L583" class="LineNr"> 583 </span> <span class="Conceal">¦</span> left-click<span class="Constant"> 3</span>,<span class="Constant"> 5</span> <span class="Comment"># below all text</span> <span id="L584" class="LineNr"> 584 </span> <span class="Conceal">¦</span> type <span class="Constant">[ef]</span> <span id="L585" class="LineNr"> 585 </span> ] <span id="L586" class="LineNr"> 586 </span> run [ <span id="L587" class="LineNr"> 587 </span> <span class="Conceal">¦</span> <a href='002-typing.mu.html#L14'>editor-event-loop</a> <a href='../081print.mu.html#L4'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e <span id="L588" class="LineNr"> 588 </span> ] <span id="L589" class="LineNr"> 589 </span> screen-should-contain [ <span id="L590" class="LineNr"> 590 </span> <span class="Conceal">¦</span><span class="Constant"> . .</span> <span id="L591" class="LineNr"> 591 </span> <span class="Conceal">¦</span><span class="Constant"> .abc .</span> <span id="L592" class="LineNr"> 592 </span> <span class="Conceal">¦</span><span class="Constant"> .def .</span> <span id="L593" class="LineNr"> 593 </span><span class="Constant"> </span><span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌.</span> <span id="L594" class="LineNr"> 594 </span> <span class="Conceal">¦</span><span class="Constant"> . .</span> <span id="L595" class="LineNr"> 595 </span> ] <span id="L596" class="LineNr"> 596 </span> check-trace-count-for-label<span class="Constant"> 2</span>, <span class="Constant">[print-character]</span> <span id="L597" class="LineNr"> 597 </span>] <span id="L598" class="LineNr"> 598 </span> <span id="L599" class="LineNr"> 599 </span><span class="muScenario">scenario</span> editor-moves-cursor-after-inserting-characters [ <span id="L600" class="LineNr"> 600 </span> <span class="Constant">local-scope</span> <span id="L601" class="LineNr"> 601 </span> assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span> <span id="L602" class="LineNr"> 602 </span> e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L52'>new-editor</a> <span class="Constant">[ab]</span>, <span class="Constant">0/left</span>, <span class="Constant">5/right</span> <span id="L603" class="LineNr"> 603 </span> <a href='002-typing.mu.html#L263'>editor-render</a> <a href='../081print.mu.html#L4'>screen</a>, e <span id="L604" class="LineNr"> 604 </span> assume-console [ <span id="L605" class="LineNr"> 605 </span> <span class="Conceal">¦</span> type <span class="Constant">[01]</span> <span id="L606" class="LineNr"> 606 </span> ] <span id="L607" class="LineNr"> 607 </span> run [ <span id="L608" class="LineNr"> 608 </span> <span class="Conceal">¦</span> <a href='002-typing.mu.html#L14'>editor-event-loop</a> <a href='../081print.mu.html#L4'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e <span id="L609" class="LineNr"> 609 </span> ] <span id="L610" class="LineNr"> 610 </span> screen-should-contain [ <span id="L611" class="LineNr"> 611 </span> <span class="Conceal">¦</span><span class="Constant"> . .</span> <span id="L612" class="LineNr"> 612 </span> <span class="Conceal">¦</span><span class="Constant"> .01ab .</span> <span id="L613" class="LineNr"> 613 </span> <span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌ .</span> <span id="L614" class="LineNr"> 614 </span> <span class="Conceal">¦</span><span class="Constant"> . .</span> <span id="L615" class="LineNr"> 615 </span> ] <span id="L616" class="LineNr"> 616 </span>] <span id="L617" class="LineNr"> 617 </span> <span id="L618" class="LineNr"> 618 </span><span class="Comment"># if the cursor reaches the right margin, wrap the line</span> <span id="L619" class="LineNr"> 619 </span> <span id="L620" class="LineNr"> 620 </span><span class="muScenario">scenario</span> editor-wraps-line-on-insert [ <span id="L621" class="LineNr"> 621 </span> <span class="Constant">local-scope</span> <span id="L622" class="LineNr"> 622 </span> assume-screen <span class="Constant">5/width</span>, <span class="Constant">5/height</span> <span id="L623" class="LineNr"> 623 </span> e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L52'>new-editor</a> <span class="Constant">[abc]</span>, <span class="Constant">0/left</span>, <span class="Constant">5/right</span> <span id="L624" class="LineNr"> 624 </span> <a href='002-typing.mu.html#L263'>editor-render</a> <a href='../081print.mu.html#L4'>screen</a>, e <span id="L625" class="LineNr"> 625 </span> <span class="Comment"># type a letter</span> <span id="L626" class="LineNr"> 626 </span> assume-console [ <span id="L627" class="LineNr"> 627 </span> <span class="Conceal">¦</span> type <span class="Constant">[e]</span> <span id="L628" class="LineNr"> 628 </span> ] <span id="L629" class="LineNr"> 629 </span> run [ <span id="L630" class="LineNr"> 630 </span> <span class="Conceal">¦</span> <a href='002-typing.mu.html#L14'>editor-event-loop</a> <a href='../081print.mu.html#L4'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e <span id="L631" class="LineNr"> 631 </span> ] <span id="L632" class="LineNr"> 632 </span> <span class="Comment"># no wrap yet</span> <span id="L633" class="LineNr"> 633 </span> screen-should-contain [ <span id="L634" class="LineNr"> 634 </span> <span class="Conceal">¦</span><span class="Constant"> . .</span> <span id="L635" class="LineNr"> 635 </span> <span class="Conceal">¦</span><span class="Constant"> .eabc .</span> <span id="L636" class="LineNr"> 636 </span><span class="Constant"> </span><span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌.</span> <span id="L637" class="LineNr"> 637 </span> <span class="Conceal">¦</span><span class="Constant"> . .</span> <span id="L638" class="LineNr"> 638 </span> <span class="Conceal">¦</span><span class="Constant"> . .</span> <span id="L639" class="LineNr"> 639 </span> ] <span id="L640" class="LineNr"> 640 </span> <span class="Comment"># type a second letter</span> <span id="L641" class="LineNr"> 641 </span> assume-console [ <span id="L642" class="LineNr"> 642 </span> <span class="Conceal">¦</span> type <span class="Constant">[f]</span> <span id="L643" class="LineNr"> 643 </span> ] <span id="L644" class="LineNr"> 644 </span> run [ <span id="L645" class="LineNr"> 645 </span> <span class="Conceal">¦</span> <a href='002-typing.mu.html#L14'>editor-event-loop</a> <a href='../081print.mu.html#L4'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e <span id="L646" class="LineNr"> 646 </span> ] <span id="L647" class="LineNr"> 647 </span> <span class="Comment"># now wrap</span> <span id="L648" class="LineNr"> 648 </span> screen-should-contain [ <span id="L649" class="LineNr"> 649 </span> <span class="Conceal">¦</span><span class="Constant"> . .</span> <span id="L650" class="LineNr"> 650 </span><span class="Constant"> </span><span class="Conceal">¦</span><span class="Constant"> .efab↩.</span> <span id="L651" class="LineNr"> 651 </span> <span class="Conceal">¦</span><span class="Constant"> .c .</span> <span id="L652" class="LineNr"> 652 </span><span class="Constant"> </span><span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌.</span> <span id="L653" class="LineNr"> 653 </span> <span class="Conceal">¦</span><span class="Constant"> . .</span> <span id="L654" class="LineNr"> 654 </span> ] <span id="L655" class="LineNr"> 655 </span>] <span id="L656" class="LineNr"> 656 </span> <span id="L657" class="LineNr"> 657 </span><span class="muScenario">scenario</span> editor-wraps-line-on-insert-2 [ <span id="L658" class="LineNr"> 658 </span> <span class="Constant">local-scope</span> <span id="L659" class="LineNr"> 659 </span> <span class="Comment"># create an editor with some text</span> <span id="L660" class="LineNr"> 660 </span> assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span> <span id="L661" class="LineNr"> 661 </span> s:text <span class="Special">&lt;-</span> new <span class="Constant">[abcdefg</span> <span id="L662" class="LineNr"> 662 </span><span class="Constant">defg]</span> <span id="L663" class="LineNr"> 663 </span> e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L52'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">5/right</span> <span id="L664" class="LineNr"> 664 </span> <a href='002-typing.mu.html#L263'>editor-render</a> <a href='../081print.mu.html#L4'>screen</a>, e <span id="L665" class="LineNr"> 665 </span> <span class="Comment"># type more text at the start</span> <span id="L666" class="LineNr"> 666 </span> assume-console [ <span id="L667" class="LineNr"> 667 </span> <span class="Conceal">¦</span> left-click<span class="Constant"> 3</span>,<span class="Constant"> 0</span> <span id="L668" class="LineNr"> 668 </span> <span class="Conceal">¦</span> type <span class="Constant">[abc]</span> <span id="L669" class="LineNr"> 669 </span> ] <span id="L670" class="LineNr"> 670 </span> run [ <span id="L671" class="LineNr"> 671 </span> <span class="Conceal">¦</span> <a href='002-typing.mu.html#L14'>editor-event-loop</a> <a href='../081print.mu.html#L4'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e <span id="L672" class="LineNr"> 672 </span> <span class="Conceal">¦</span> 3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span> <span id="L673" class="LineNr"> 673 </span> <span class="Conceal">¦</span> 4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span> <span id="L674" class="LineNr"> 674 </span> ] <span id="L675" class="LineNr"> 675 </span> <span class="Comment"># cursor is not wrapped</span> <span id="L676" class="LineNr"> 676 </span> memory-should-contain [ <span id="L677" class="LineNr"> 677 </span> <span class="Conceal">¦</span><span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span> <span id="L678" class="LineNr"> 678 </span> <span class="Conceal">¦</span><span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span> <span id="L679" class="LineNr"> 679 </span> ] <span id="L680" class="LineNr"> 680 </span> <span class="Comment"># but line is wrapped</span> <span id="L681" class="LineNr"> 681 </span> screen-should-contain [ <span id="L682" class="LineNr"> 682 </span> <span class="Conceal">¦</span><span class="Constant"> . .</span> <span id="L683" class="LineNr"> 683 </span> <span class="Conceal">¦</span><span class="Constant"> .abcd↩ .</span> <span id="L684" class="LineNr"> 684 </span> <span class="Conceal">¦</span><span class="Constant"> .efg .</span> <span id="L685" class="LineNr"> 685 </span> <span class="Conceal">¦</span><span class="Constant"> .abcd↩ .</span> <span id="L686" class="LineNr"> 686 </span> <span class="Conceal">¦</span><span class="Constant"> .efg .</span> <span id="L687" class="LineNr"> 687 </span> ] <span id="L688" class="LineNr"> 688 </span>] <span id="L689" class="LineNr"> 689 </span> <span id="L690" class="LineNr"> 690 </span><span class="muRecipe">after</span> <span class="Constant"><a href='002-typing.mu.html#L217'>&lt;insert-character-special-case&gt;</a></span> [ <span id="L691" class="LineNr"> 691 </span> <span class="Comment"># if the line wraps at the cursor, move cursor to start of next row</span> <span id="L692" class="LineNr"> 692 </span> <span class="Delimiter">{</span> <span id="L693" class="LineNr"> 693 </span> <span class="Conceal">¦</span> <span class="Comment"># if either:</span> <span id="L694" class="LineNr"> 694 </span> <span class="Conceal">¦</span> <span class="Comment"># a) we're at the end of the line and at the column of the wrap indicator, or</span> <span id="L695" class="LineNr"> 695 </span> <span class="Conceal">¦</span> <span class="Comment"># b) we're not at end of line and just before the column of the wrap indicator</span> <span id="L696" class="LineNr"> 696 </span> <span class="Conceal">¦</span> wrap-column:num <span class="Special">&lt;-</span> copy right <span id="L697" class="LineNr"> 697 </span> <span class="Conceal">¦</span> before-wrap-column:num <span class="Special">&lt;-</span> subtract wrap-column,<span class="Constant"> 1</span> <span id="L698" class="LineNr"> 698 </span> <span class="Conceal">¦</span> at-wrap?:bool <span class="Special">&lt;-</span> greater-or-equal cursor-column, wrap-column <span id="L699" class="LineNr"> 699 </span> <span class="Conceal">¦</span> just-before-wrap?:bool <span class="Special">&lt;-</span> greater-or-equal cursor-column, before-wrap-column <span id="L700" class="LineNr"> 700 </span> <span class="Conceal">¦</span> <a href='../065duplex_list.mu.html#L29'>next</a>:&amp;:duplex-list:char <span class="Special">&lt;-</span> <a href='../065duplex_list.mu.html#L29'>next</a> before-cursor <span id="L701" class="LineNr"> 701 </span> <span class="Conceal">¦</span> <span class="Comment"># at end of line? next == 0 || next.value == 10/newline</span> <span id="L702" class="LineNr"> 702 </span> <span class="Conceal">¦</span> at-end-of-line?:bool <span class="Special">&lt;-</span> equal <a href='../065duplex_list.mu.html#L29'>next</a>,<span class="Constant"> 0</span> <span id="L703" class="LineNr"> 703 </span> <span class="Conceal">¦</span> <span class="Delimiter">{</span> <span id="L704" class="LineNr"> 704 </span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">break-if</span> at-end-of-line? <span id="L705" class="LineNr"> 705 </span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> next-character:char <span class="Special">&lt;-</span> get *next, <span class="Constant">value:offset</span> <span id="L706" class="LineNr"> 706 </span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> at-end-of-line? <span class="Special">&lt;-</span> equal next-character, <span class="Constant">10/newline</span> <span id="L707" class="LineNr"> 707 </span> <span class="Conceal">¦</span> <span class="Delimiter">}</span> <span id="L708" class="LineNr"> 708 </span> <span class="Conceal">¦</span> <span class="Comment"># break unless ((eol? and at-wrap?) or (~eol? and just-before-wrap?))</span> <span id="L709" class="LineNr"> 709 </span> <span class="Conceal">¦</span> move-cursor-to-next-line?:bool <span class="Special">&lt;-</span> copy <span class="Constant">0/false</span> <span id="L710" class="LineNr"> 710 </span> <span class="Conceal">¦</span> <span class="Delimiter">{</span> <span id="L711" class="LineNr"> 711 </span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">break-if</span> at-end-of-line? <span id="L712" class="LineNr"> 712 </span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> move-cursor-to-next-line? <span class="Special">&lt;-</span> copy just-before-wrap? <span id="L713" class="LineNr"> 713 </span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Comment"># if we're moving the cursor because it's in the middle of a wrapping</span> <span id="L714" class="LineNr"> 714 </span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Comment"># line, adjust it to left-most column</span> <span id="L715" class="LineNr"> 715 </span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> potential-new-cursor-column:num <span class="Special">&lt;-</span> copy left <span id="L716" class="LineNr"> 716 </span> <span class="Conceal">¦</span> <span class="Delimiter">}</span> <span id="L717" class="LineNr"> 717 </span> <span class="Conceal">¦</span> <span class="Delimiter">{</span> <span id="L718" class="LineNr"> 718 </span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">break-unless</span> at-end-of-line? <span id="L719" class="LineNr"> 719 </span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> move-cursor-to-next-line? <span class="Special">&lt;-</span> copy at-wrap? <span id="L720" class="LineNr"> 720 </span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Comment"># if we're moving the cursor because it's at the end of a wrapping line,</span> <span id="L721" class="LineNr"> 721 </span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Comment"># adjust it to one past the left-most column to make room for the</span> <span id="L722" class="LineNr"> 722 </span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Comment"># newly-inserted wrap-indicator</span> <span id="L723" class="LineNr"> 723 </span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> potential-new-cursor-column:num <span class="Special">&lt;-</span> add left, <span class="Constant">1/make-room-for-wrap-indicator</span> <span id="L724" class="LineNr"> 724 </span> <span class="Conceal">¦</span> <span class="Delimiter">}</span> <span id="L725" class="LineNr"> 725 </span> <span class="Conceal">¦</span> <span class="muControl">break-unless</span> move-cursor-to-next-line? <span id="L726" class="LineNr"> 726 </span> <span class="Conceal">¦</span> cursor-column <span class="Special">&lt;-</span> copy potential-new-cursor-column <span id="L727" class="LineNr"> 727 </span> <span class="Conceal">¦</span> *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column <span id="L728" class="LineNr"> 728 </span> <span class="Conceal">¦</span> cursor-row <span class="Special">&lt;-</span> add cursor-row,<span class="Constant"> 1</span> <span id="L729" class="LineNr"> 729 </span> <span class="Conceal">¦</span> *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-row:offset</span>, cursor-row <span id="L730" class="LineNr"> 730 </span> <span class="Conceal">¦</span> <span class="Comment"># if we're out of the screen, scroll down</span> <span id="L731" class="LineNr"> 731 </span> <span class="Conceal">¦</span> <span class="Delimiter">{</span> <span id="L732" class="LineNr"> 732 </span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> below-screen?:bool <span class="Special">&lt;-</span> greater-or-equal cursor-row, <a href='../081print.mu.html#L594'>screen-height</a> <span id="L733" class="LineNr"> 733 </span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">break-unless</span> below-screen? <span id="L734" class="LineNr"> 734 </span><span class="Constant"> </span><span class="Conceal">¦</span><span class="Constant"> </span><span class="Conceal">¦</span><span class="Constant"> &lt;scroll-down&gt;</span> <span id="L735" class="LineNr"> 735 </span> <span class="Conceal">¦</span> <span class="Delimiter">}</span> <span id="L736" class="LineNr"> 736 </span> <span class="Conceal">¦</span> <span class="muControl">return</span> <span class="Constant">1/go-render</span> <span id="L737" class="LineNr"> 737 </span> <span class="Delimiter">}</span> <span id="L738" class="LineNr"> 738 </span>] <span id="L739" class="LineNr"> 739 </span> <span id="L740" class="LineNr"> 740 </span><span class="muScenario">scenario</span> editor-wraps-cursor-after-inserting-characters-in-middle-of-line [ <span id="L741" class="LineNr"> 741 </span> <span class="Constant">local-scope</span> <span id="L742" class="LineNr"> 742 </span> assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span> <span id="L743" class="LineNr"> 743 </span> e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L52'>new-editor</a> <span class="Constant">[abcde]</span>, <span class="Constant">0/left</span>, <span class="Constant">5/right</span> <span id="L744" class="LineNr"> 744 </span> assume-console [ <span id="L745" class="LineNr"> 745 </span> <span class="Conceal">¦</span> left-click<span class="Constant"> 1</span>,<span class="Constant"> 3</span> <span class="Comment"># right before the wrap icon</span> <span id="L746" class="LineNr"> 746 </span> <span class="Conceal">¦</span> type <span class="Constant">[f]</span> <span id="L747" class="LineNr"> 747 </span> ] <span id="L748" class="LineNr"> 748 </span> run [ <span id="L749" class="LineNr"> 749 </span> <span class="Conceal">¦</span> <a href='002-typing.mu.html#L14'>editor-event-loop</a> <a href='../081print.mu.html#L4'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e <span id="L750" class="LineNr"> 750 </span> <span class="Conceal">¦</span> 3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span> <span id="L751" class="LineNr"> 751 </span> <span class="Conceal">¦</span> 4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span> <span id="L752" class="LineNr"> 752 </span> ] <span id="L753" class="LineNr"> 753 </span> screen-should-contain [ <span id="L754" class="LineNr"> 754 </span> <span class="Conceal">¦</span><span class="Constant"> . .</span> <span id="L755" class="LineNr"> 755 </span> <span class="Conceal">¦</span><span class="Constant"> .abcf↩ .</span> <span id="L756" class="LineNr"> 756 </span> <span class="Conceal">¦</span><span class="Constant"> .de .</span> <span id="L757" class="LineNr"> 757 </span> <span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌ .</span> <span id="L758" class="LineNr"> 758 </span> <span class="Conceal">¦</span><span class="Constant"> . .</span> <span id="L759" class="LineNr"> 759 </span> ] <span id="L760" class="LineNr"> 760 </span> memory-should-contain [ <span id="L761" class="LineNr"> 761 </span> <span class="Conceal">¦</span><span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span> <span class="Comment"># cursor row</span> <span id="L762" class="LineNr"> 762 </span> <span class="Conceal">¦</span><span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span> <span class="Comment"># cursor column</span> <span id="L763" class="LineNr"> 763 </span> ] <span id="L764" class="LineNr"> 764 </span>] <span id="L765" class="LineNr"> 765 </span> <span id="L766" class="LineNr"> 766 </span><span class="muScenario">scenario</span> editor-wraps-cursor-after-inserting-characters-at-end-of-line [ <span id="L767" class="LineNr"> 767 </span> <span class="Constant">local-scope</span> <span id="L768" class="LineNr"> 768 </span> assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span> <span id="L769" class="LineNr"> 769 </span> <span class="Comment"># create an editor containing two lines</span> <span id="L770" class="LineNr"> 770 </span> s:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span> <span id="L771" class="LineNr"> 771 </span><span class="Constant">xyz]</span> <span id="L772" class="LineNr"> 772 </span> e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L52'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">5/right</span> <span id="L773" class="LineNr"> 773 </span> <a href='002-typing.mu.html#L263'>editor-render</a> <a href='../081print.mu.html#L4'>screen</a>, e <span id="L774" class="LineNr"> 774 </span> screen-should-contain [ <span id="L775" class="LineNr"> 775 </span> <span class="Conceal">¦</span><span class="Constant"> . .</span> <span id="L776" class="LineNr"> 776 </span> <span class="Conceal">¦</span><span class="Constant"> .abc .</span> <span id="L777" class="LineNr"> 777 </span> <span class="Conceal">¦</span><span class="Constant"> .xyz .</span> <span id="L778" class="LineNr"> 778 </span> <span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌ .</span> <span id="L779" class="LineNr"> 779 </span> <span class="Conceal">¦</span><span class="Constant"> . .</span> <span id="L780" class="LineNr"> 780 </span> ] <span id="L781" class="LineNr"> 781 </span> assume-console [ <span id="L782" class="LineNr"> 782 </span> <span class="Conceal">¦</span> left-click<span class="Constant"> 1</span>,<span class="Constant"> 4</span> <span class="Comment"># at end of first line</span> <span id="L783" class="LineNr"> 783 </span> <span class="Conceal">¦</span> type <span class="Constant">[de]</span> <span class="Comment"># trigger wrap</span> <span id="L784" class="LineNr"> 784 </span> ] <span id="L785" class="LineNr"> 785 </span> run [ <span id="L786" class="LineNr"> 786 </span> <span class="Conceal">¦</span> <a href='002-typing.mu.html#L14'>editor-event-loop</a> <a href='../081print.mu.html#L4'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e <span id="L787" class="LineNr"> 787 </span> ] <span id="L788" class="LineNr"> 788 </span> screen-should-contain [ <span id="L789" class="LineNr"> 789 </span> <span class="Conceal">¦</span><span class="Constant"> . .</span> <span id="L790" class="LineNr"> 790 </span> <span class="Conceal">¦</span><span class="Constant"> .abcd↩ .</span> <span id="L791" class="LineNr"> 791 </span> <span class="Conceal">¦</span><span class="Constant"> .e .</span> <span id="L792" class="LineNr"> 792 </span> <span class="Conceal">¦</span><span class="Constant"> .xyz .</span> <span id="L793" class="LineNr"> 793 </span> <span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌ .</span> <span id="L794" class="LineNr"> 794 </span> ] <span id="L795" class="LineNr"> 795 </span>] <span id="L796" class="LineNr"> 796 </span> <span id="L797" class="LineNr"> 797 </span><span class="muScenario">scenario</span> editor-wraps-cursor-to-left-margin [ <span id="L798" class="LineNr"> 798 </span> <span class="Constant">local-scope</span> <span id="L799" class="LineNr"> 799 </span> assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span> <span id="L800" class="LineNr"> 800 </span> e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L52'>new-editor</a> <span class="Constant">[abcde]</span>, <span class="Constant">2/left</span>, <span class="Constant">7/right</span> <span id="L801" class="LineNr"> 801 </span> assume-console [ <span id="L802" class="LineNr"> 802 </span> <span class="Conceal">¦</span> left-click<span class="Constant"> 1</span>,<span class="Constant"> 5</span> <span class="Comment"># line is full; no wrap icon yet</span> <span id="L803" class="LineNr"> 803 </span> <span class="Conceal">¦</span> type <span class="Constant">[01]</span> <span id="L804" class="LineNr"> 804 </span> ] <span id="L805" class="LineNr"> 805 </span> run [ <span id="L806" class="LineNr"> 806 </span> <span class="Conceal">¦</span> <a href='002-typing.mu.html#L14'>editor-event-loop</a> <a href='../081print.mu.html#L4'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e <span id="L807" class="LineNr"> 807 </span> <span class="Conceal">¦</span> 3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span> <span id="L808" class="LineNr"> 808 </span> <span class="Conceal">¦</span> 4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span> <span id="L809" class="LineNr"> 809 </span> ] <span id="L810" class="LineNr"> 810 </span> screen-should-contain [ <span id="L811" class="LineNr"> 811 </span> <span class="Conceal">¦</span><span class="Constant"> . .</span> <span id="L812" class="LineNr"> 812 </span> <span class="Conceal">¦</span><span class="Constant"> . abc0↩ .</span> <span id="L813" class="LineNr"> 813 </span> <span class="Conceal">¦</span><span class="Constant"> . 1de .</span> <span id="L814" class="LineNr"> 814 </span> <span class="Conceal">¦</span><span class="Constant"> . ╌╌╌╌╌ .</span> <span id="L815" class="LineNr"> 815 </span> <span class="Conceal">¦</span><span class="Constant"> . .</span> <span id="L816" class="LineNr"> 816 </span> ] <span id="L817" class="LineNr"> 817 </span> memory-should-contain [ <span id="L818" class="LineNr"> 818 </span> <span class="Conceal">¦</span><span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span> <span class="Comment"># cursor row</span> <span id="L819" class="LineNr"> 819 </span> <span class="Conceal">¦</span><span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span> <span class="Comment"># cursor column</span> <span id="L820" class="LineNr"> 820 </span> ] <span id="L821" class="LineNr"> 821 </span>] <span id="L822" class="LineNr"> 822 </span> <span id="L823" class="LineNr"> 823 </span><span class="Comment"># if newline, move cursor to start of next line, and maybe align indent with previous line</span> <span id="L824" class="LineNr"> 824 </span> <span id="L825" class="LineNr"> 825 </span><span class="muData">container</span> editor [ <span id="L826" class="LineNr"> 826 </span> indent?:bool <span id="L827" class="LineNr"> 827 </span>] <span id="L828" class="LineNr"> 828 </span> <span id="L829" class="LineNr"> 829 </span><span class="muRecipe">after</span> <span class="Constant"><a href='001-editor.mu.html#L70'>&lt;editor-initialization&gt;</a></span> [ <span id="L830" class="LineNr"> 830 </span> *result <span class="Special">&lt;-</span> put *result, <span class="Constant">indent?:offset</span>, <span class="Constant">1/true</span> <span id="L831" class="LineNr"> 831 </span>] <span id="L832" class="LineNr"> 832 </span> <span id="L833" class="LineNr"> 833 </span><span class="muScenario">scenario</span> editor-moves-cursor-down-after-inserting-newline [ <span id="L834" class="LineNr"> 834 </span> <span class="Constant">local-scope</span> <span id="L835" class="LineNr"> 835 </span> assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span> <span id="L836" class="LineNr"> 836 </span> e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L52'>new-editor</a> <span class="Constant">[abc]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> <span id="L837" class="LineNr"> 837 </span> assume-console [ <span id="L838" class="LineNr"> 838 </span> <span class="Conceal">¦</span> type <span class="Constant">[0</span> <span id="L839" class="LineNr"> 839 </span><span class="Constant">1]</span> <span id="L840" class="LineNr"> 840 </span> ] <span id="L841" class="LineNr"> 841 </span> run [ <span id="L842" class="LineNr"> 842 </span> <span class="Conceal">¦</span> <a href='002-typing.mu.html#L14'>editor-event-loop</a> <a href='../081print.mu.html#L4'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e <span id="L843" class="LineNr"> 843 </span> ] <span id="L844" class="LineNr"> 844 </span> screen-should-contain [ <span id="L845" class="LineNr"> 845 </span> <span class="Conceal">¦</span><span class="Constant"> . .</span> <span id="L846" class="LineNr"> 846 </span> <span class="Conceal">¦</span><span class="Constant"> .0 .</span> <span id="L847" class="LineNr"> 847 </span> <span class="Conceal">¦</span><span class="Constant"> .1abc .</span> <span id="L848" class="LineNr"> 848 </span><span class="Constant"> </span><span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌.</span> <span id="L849" class="LineNr"> 849 </span> <span class="Conceal">¦</span><span class="Constant"> . .</span> <span id="L850" class="LineNr"> 850 </span> ] <span id="L851" class="LineNr"> 851 </span>] <span id="L852" class="LineNr"> 852 </span> <span id="L853" class="LineNr"> 853 </span><span class="muRecipe">after</span> <span class="Constant"><a href='002-typing.mu.html#L183'>&lt;handle-special-character&gt;</a></span> [ <span id="L854" class="LineNr"> 854 </span> <span class="Delimiter">{</span> <span id="L855" class="LineNr"> 855 </span> <span class="Conceal">¦</span> newline?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">10/newline</span> <span id="L856" class="LineNr"> 856 </span> <span class="Conceal">¦</span> <span class="muControl">break-unless</span> newline? <span id="L857" class="LineNr"> 857 </span><span class="Constant"> </span><span class="Conceal">¦</span><span class="Constant"> <a href='002-typing.mu.html#L857'>&lt;insert-enter-begin&gt;</a></span> <span id="L858" class="LineNr"> 858 </span> <span class="Conceal">¦</span> <a href='002-typing.mu.html#L864'>insert-new-line-and-indent</a> editor, <a href='../081print.mu.html#L4'>screen</a> <span id="L859" class="LineNr"> 859 </span><span class="Constant"> </span><span class="Conceal">¦</span><span class="Constant"> <a href='002-typing.mu.html#L859'>&lt;insert-enter-end&gt;</a></span> <span id="L860" class="LineNr"> 860 </span> <span class="Conceal">¦</span> <span class="muControl">return</span> <span class="Constant">1/go-render</span> <span id="L861" class="LineNr"> 861 </span> <span class="Delimiter">}</span> <span id="L862" class="LineNr"> 862 </span>] <span id="L863" class="LineNr"> 863 </span> <span id="L864" class="LineNr"> 864 </span><span class="muRecipe">def</span> <a href='002-typing.mu.html#L864'>insert-new-line-and-indent</a> editor:&amp;:editor, <a href='../081print.mu.html#L4'>screen</a>:&amp;:<a href='../081print.mu.html#L4'>screen</a><span class="muRecipe"> -&gt; </span>editor:&amp;:editor, <a href='../081print.mu.html#L4'>screen</a>:&amp;:<a href='../081print.mu.html#L4'>screen</a> [ <span id="L865" class="LineNr"> 865 </span> <span class="Constant">local-scope</span> <span id="L866" class="LineNr"> 866 </span> <span class="Constant">load-ingredients</span> <span id="L867" class="LineNr"> 867 </span> cursor-row:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-row:offset</span> <span id="L868" class="LineNr"> 868 </span> cursor-column:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-column:offset</span> <span id="L869" class="LineNr"> 869 </span> before-cursor:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">before-cursor:offset</span> <span id="L870" class="LineNr"> 870 </span> left:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">left:offset</span> <span id="L871" class="LineNr"> 871 </span> right:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">right:offset</span> <span id="L872" class="LineNr"> 872 </span> <a href='../081print.mu.html#L594'>screen-height</a>:num <span class="Special">&lt;-</span> <a href='../081print.mu.html#L594'>screen-height</a> <a href='../081print.mu.html#L4'>screen</a> <span id="L873" class="LineNr"> 873 </span> <span class="Comment"># insert newline</span> <span id="L874" class="LineNr"> 874 </span> insert <span class="Constant">10/newline</span>, before-cursor <span id="L875" class="LineNr"> 875 </span> before-cursor <span class="Special">&lt;-</span> <a href='../065duplex_list.mu.html#L29'>next</a> before-cursor <span id="L876" class="LineNr"> 876 </span> *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">before-cursor:offset</span>, before-cursor <span id="L877" class="LineNr"> 877 </span> cursor-row <span class="Special">&lt;-</span> add cursor-row,<span class="Constant"> 1</span> <span id="L878" class="LineNr"> 878 </span> *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-row:offset</span>, cursor-row <span id="L879" class="LineNr"> 879 </span> cursor-column <span class="Special">&lt;-</span> copy left <span id="L880" class="LineNr"> 880 </span> *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column <span id="L881" class="LineNr"> 881 </span> <span class="Comment"># maybe scroll</span> <span id="L882" class="LineNr"> 882 </span> <span class="Delimiter">{</span> <span id="L883" class="LineNr"> 883 </span> <span class="Conceal">¦</span> below-screen?:bool <span class="Special">&lt;-</span> greater-or-equal cursor-row, <a href='../081print.mu.html#L594'>screen-height</a> <span class="Comment"># must be equal, never greater</span> <span id="L884" class="LineNr"> 884 </span> <span class="Conceal">¦</span> <span class="muControl">break-unless</span> below-screen? <span id="L885" class="LineNr"> 885 </span><span class="Constant"> </span><span class="Conceal">¦</span><span class="Constant"> &lt;scroll-down&gt;</span> <span id="L886" class="LineNr"> 886 </span> <span class="Conceal">¦</span> cursor-row <span class="Special">&lt;-</span> subtract cursor-row,<span class="Constant"> 1</span> <span class="Comment"># bring back into screen range</span> <span id="L887" class="LineNr"> 887 </span> <span class="Conceal">¦</span> *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-row:offset</span>, cursor-row <span id="L888" class="LineNr"> 888 </span> <span class="Delimiter">}</span> <span id="L889" class="LineNr"> 889 </span> <span class="Comment"># indent if necessary</span> <span id="L890" class="LineNr"> 890 </span> indent?:bool <span class="Special">&lt;-</span> get *editor, <span class="Constant">indent?:offset</span> <span id="L891" class="LineNr"> 891 </span> <span class="muControl">return-unless</span> indent? <span id="L892" class="LineNr"> 892 </span> d:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">data:offset</span> <span id="L893" class="LineNr"> 893 </span> end-of-previous-line:&amp;:duplex-list:char <span class="Special">&lt;-</span> <a href='../065duplex_list.mu.html#L36'>prev</a> before-cursor <span id="L894" class="LineNr"> 894 </span> indent:num <span class="Special">&lt;-</span> <a href='002-typing.mu.html#L907'>line-indent</a> end-of-previous-line, d <span id="L895" class="LineNr"> 895 </span> i:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span> <span id="L896" class="LineNr"> 896 </span> <span class="Delimiter">{</span> <span id="L897" class="LineNr"> 897 </span> <span class="Conceal">¦</span> indent-done?:bool <span class="Special">&lt;-</span> greater-or-equal i, indent <span id="L898" class="LineNr"> 898 </span> <span class="Conceal">¦</span> <span class="muControl">break-if</span> indent-done? <span id="L899" class="LineNr"> 899 </span> <span class="Conceal">¦</span> <a href='002-typing.mu.html#L201'>insert-at-cursor</a> editor, <span class="Constant">32/space</span>, <a href='../081print.mu.html#L4'>screen</a> <span id="L900" class="LineNr"> 900 </span> <span class="Conceal">¦</span> i <span class="Special">&lt;-</span> add i,<span class="Constant"> 1</span> <span id="L901" class="LineNr"> 901 </span> <span class="Conceal">¦</span> <span class="muControl">loop</span> <span id="L902" class="LineNr"> 902 </span> <span class="Delimiter">}</span> <span id="L903" class="LineNr"> 903 </span>] <span id="L904" class="LineNr"> 904 </span> <span id="L905" class="LineNr"> 905 </span><span class="Comment"># takes a pointer 'curr' into the doubly-linked list and its sentinel, counts</span> <span id="L906" class="LineNr"> 906 </span><span class="Comment"># the number of spaces at the start of the line containing 'curr'.</span> <span id="L907" class="LineNr"> 907 </span><span class="muRecipe">def</span> <a href='002-typing.mu.html#L907'>line-indent</a> curr:&amp;:duplex-list:char, start:&amp;:duplex-list:char<span class="muRecipe"> -&gt; </span>result:num [ <span id="L908" class="LineNr"> 908 </span> <span class="Constant">local-scope</span> <span id="L909" class="LineNr"> 909 </span> <span class="Constant">load-ingredients</span> <span id="L910" class="LineNr"> 910 </span> result:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span> <span id="L911" class="LineNr"> 911 </span> <span class="muControl">return-unless</span> curr <span id="L912" class="LineNr"> 912 </span> at-start?:bool <span class="Special">&lt;-</span> equal curr, start <span id="L913" class="LineNr"> 913 </span> <span class="muControl">return-if</span> at-start? <span id="L914" class="LineNr"> 914 </span> <span class="Delimiter">{</span> <span id="L915" class="LineNr"> 915 </span> <span class="Conceal">¦</span> curr <span class="Special">&lt;-</span> <a href='../065duplex_list.mu.html#L36'>prev</a> curr <span id="L916" class="LineNr"> 916 </span> <span class="Conceal">¦</span> <span class="muControl">break-unless</span> curr <span id="L917" class="LineNr"> 917 </span> <span class="Conceal">¦</span> at-start?:bool <span class="Special">&lt;-</span> equal curr, start <span id="L918" class="LineNr"> 918 </span> <span class="Conceal">¦</span> <span class="muControl">break-if</span> at-start? <span id="L919" class="LineNr"> 919 </span> <span class="Conceal">¦</span> c:char <span class="Special">&lt;-</span> get *curr, <span class="Constant">value:offset</span> <span id="L920" class="LineNr"> 920 </span> <span class="Conceal">¦</span> at-newline?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">10/newline</span> <span id="L921" class="LineNr"> 921 </span> <span class="Conceal">¦</span> <span class="muControl">break-if</span> at-newline? <span id="L922" class="LineNr"> 922 </span> <span class="Conceal">¦</span> <span class="Comment"># if c is a space, increment result</span> <span id="L923" class="LineNr"> 923 </span> <span class="Conceal">¦</span> is-space?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">32/space</span> <span id="L924" class="LineNr"> 924 </span> <span class="Conceal">¦</span> <span class="Delimiter">{</span> <span id="L925" class="LineNr"> 925 </span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">break-unless</span> is-space? <span id="L926" class="LineNr"> 926 </span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> result <span class="Special">&lt;-</span> add result,<span class="Constant"> 1</span> <span id="L927" class="LineNr"> 927 </span> <span class="Conceal">¦</span> <span class="Delimiter">}</span> <span id="L928" class="LineNr"> 928 </span> <span class="Conceal">¦</span> <span class="Comment"># if c is not a space, reset result</span> <span id="L929" class="LineNr"> 929 </span> <span class="Conceal">¦</span> <span class="Delimiter">{</span> <span id="L930" class="LineNr"> 930 </span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">break-if</span> is-space? <span id="L931" class="LineNr"> 931 </span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> result <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span> <span id="L932" class="LineNr"> 932 </span> <span class="Conceal">¦</span> <span class="Delimiter">}</span> <span id="L933" class="LineNr"> 933 </span> <span class="Conceal">¦</span> <span class="muControl">loop</span> <span id="L934" class="LineNr"> 934 </span> <span class="Delimiter">}</span> <span id="L935" class="LineNr"> 935 </span>] <span id="L936" class="LineNr"> 936 </span> <span id="L937" class="LineNr"> 937 </span><span class="muScenario">scenario</span> editor-moves-cursor-down-after-inserting-newline-2 [ <span id="L938" class="LineNr"> 938 </span> <span class="Constant">local-scope</span> <span id="L939" class="LineNr"> 939 </span> assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span> <span id="L940" class="LineNr"> 940 </span> e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L52'>new-editor</a> <span class="Constant">[abc]</span>, <span class="Constant">1/left</span>, <span class="Constant">10/right</span> <span id="L941" class="LineNr"> 941 </span> assume-console [ <span id="L942" class="LineNr"> 942 </span> <span class="Conceal">¦</span> type <span class="Constant">[0</span> <span id="L943" class="LineNr"> 943 </span><span class="Constant">1]</span> <span id="L944" class="LineNr"> 944 </span> ] <span id="L945" class="LineNr"> 945 </span> run [ <span id="L946" class="LineNr"> 946 </span> <span class="Conceal">¦</span> <a href='002-typing.mu.html#L14'>editor-event-loop</a> <a href='../081print.mu.html#L4'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e <span id="L947" class="LineNr"> 947 </span> ] <span id="L948" class="LineNr"> 948 </span> screen-should-contain [ <span id="L949" class="LineNr"> 949 </span> <span class="Conceal">¦</span><span class="Constant"> . .</span> <span id="L950" class="LineNr"> 950 </span> <span class="Conceal">¦</span><span class="Constant"> . 0 .</span> <span id="L951" class="LineNr"> 951 </span> <span class="Conceal">¦</span><span class="Constant"> . 1abc .</span> <span id="L952" class="LineNr"> 952 </span> <span class="Conceal">¦</span><span class="Constant"> . ╌╌╌╌╌╌╌╌╌.</span> <span id="L953" class="LineNr"> 953 </span> <span class="Conceal">¦</span><span class="Constant"> . .</span> <span id="L954" class="LineNr"> 954 </span> ] <span id="L955" class="LineNr"> 955 </span>] <span id="L956" class="LineNr"> 956 </span> <span id="L957" class="LineNr"> 957 </span><span class="muScenario">scenario</span> editor-clears-previous-line-completely-after-inserting-newline [ <span id="L958" class="LineNr"> 958 </span> <span class="Constant">local-scope</span> <span id="L959" class="LineNr"> 959 </span> assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span> <span id="L960" class="LineNr"> 960 </span> e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L52'>new-editor</a> <span class="Constant">[abcde]</span>, <span class="Constant">0/left</span>, <span class="Constant">5/right</span> <span id="L961" class="LineNr"> 961 </span> <a href='002-typing.mu.html#L263'>editor-render</a> <a href='../081print.mu.html#L4'>screen</a>, e <span id="L962" class="LineNr"> 962 </span> screen-should-contain [ <span id="L963" class="LineNr"> 963 </span> <span class="Conceal">¦</span><span class="Constant"> . .</span> <span id="L964" class="LineNr"> 964 </span> <span class="Conceal">¦</span><span class="Constant"> .abcd↩ .</span> <span id="L965" class="LineNr"> 965 </span> <span class="Conceal">¦</span><span class="Constant"> .e .</span> <span id="L966" class="LineNr"> 966 </span> <span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌ .</span> <span id="L967" class="LineNr"> 967 </span> <span class="Conceal">¦</span><span class="Constant"> . .</span> <span id="L968" class="LineNr"> 968 </span> ] <span id="L969" class="LineNr"> 969 </span> assume-console [ <span id="L970" class="LineNr"> 970 </span> <span class="Conceal">¦</span> press enter <span id="L971" class="LineNr"> 971 </span> ] <span id="L972" class="LineNr"> 972 </span> run [ <span id="L973" class="LineNr"> 973 </span> <span class="Conceal">¦</span> <a href='002-typing.mu.html#L14'>editor-event-loop</a> <a href='../081print.mu.html#L4'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e <span id="L974" class="LineNr"> 974 </span> ] <span id="L975" class="LineNr"> 975 </span> <span class="Comment"># line should be fully cleared</span> <span id="L976" class="LineNr"> 976 </span> screen-should-contain [ <span id="L977" class="LineNr"> 977 </span> <span class="Conceal">¦</span><span class="Constant"> . .</span> <span id="L978" class="LineNr"> 978 </span> <span class="Conceal">¦</span><span class="Constant"> . .</span> <span id="L979" class="LineNr"> 979 </span> <span class="Conceal">¦</span><span class="Constant"> .abcd↩ .</span> <span id="L980" class="LineNr"> 980 </span> <span class="Conceal">¦</span><span class="Constant"> .e .</span> <span id="L981" class="LineNr"> 981 </span> <span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌ .</span> <span id="L982" class="LineNr"> 982 </span> ] <span id="L983" class="LineNr"> 983 </span>] <span id="L984" class="LineNr"> 984 </span> <span id="L985" class="LineNr"> 985 </span><span class="muScenario">scenario</span> editor-inserts-indent-after-newline [ <span id="L986" class="LineNr"> 986 </span> <span class="Constant">local-scope</span> <span id="L987" class="LineNr"> 987 </span> assume-screen <span class="Constant">10/width</span>, <span class="Constant">10/height</span> <span id="L988" class="LineNr"> 988 </span> s:text <span class="Special">&lt;-</span> new <span class="Constant">[ab</span> <span id="L989" class="LineNr"> 989 </span><span class="Constant"> cd</span> <span id="L990" class="LineNr"> 990 </span><span class="Constant">ef]</span> <span id="L991" class="LineNr"> 991 </span> e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L52'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> <span id="L992" class="LineNr"> 992 </span> <span class="Comment"># position cursor after 'cd' and hit 'newline'</span> <span id="L993" class="LineNr"> 993 </span> assume-console [ <span id="L994" class="LineNr"> 994 </span> <span class="Conceal">¦</span> left-click<span class="Constant"> 2</span>,<span class="Constant"> 8</span> <span id="L995" class="LineNr"> 995 </span> <span class="Conceal">¦</span> type [ <span id="L996" class="LineNr"> 996 </span>] <span id="L997" class="LineNr"> 997 </span> ] <span id="L998" class="LineNr"> 998 </span> run [ <span id="L999" class="LineNr"> 999 </span> <span class="Conceal">¦</span> <a href='002-typing.mu.html#L14'>editor-event-loop</a> <a href='../081print.mu.html#L4'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e <span id="L1000" class="LineNr">1000 </span> <span class="Conceal">¦</span> 3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span> <span id="L1001" class="LineNr">1001 </span> <span class="Conceal">¦</span> 4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span> <span id="L1002" class="LineNr">1002 </span> ] <span id="L1003" class="LineNr">1003 </span> <span class="Comment"># cursor should be below start of previous line</span> <span id="L1004" class="LineNr">1004 </span> memory-should-contain [ <span id="L1005" class="LineNr">1005 </span> <span class="Conceal">¦</span><span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span> <span class="Comment"># cursor row</span> <span id="L1006" class="LineNr">1006 </span> <span class="Conceal">¦</span><span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span> <span class="Comment"># cursor column (indented)</span> <span id="L1007" class="LineNr">1007 </span> ] <span id="L1008" class="LineNr">1008 </span>] <span id="L1009" class="LineNr">1009 </span> <span id="L1010" class="LineNr">1010 </span><span class="muScenario">scenario</span> editor-skips-indent-around-paste [ <span id="L1011" class="LineNr">1011 </span> <span class="Constant">local-scope</span> <span id="L1012" class="LineNr">1012 </span> assume-screen <span class="Constant">10/width</span>, <span class="Constant">10/height</span> <span id="L1013" class="LineNr">1013 </span> s:text <span class="Special">&lt;-</span> new <span class="Constant">[ab</span> <span id="L1014" class="LineNr">1014 </span><span class="Constant"> cd</span> <span id="L1015" class="LineNr">1015 </span><span class="Constant">ef]</span> <span id="L1016" class="LineNr">1016 </span> e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L52'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> <span id="L1017" class="LineNr">1017 </span> <span class="Comment"># position cursor after 'cd' and hit 'newline' surrounded by paste markers</span> <span id="L1018" class="LineNr">1018 </span> assume-console [ <span id="L1019" class="LineNr">1019 </span> <span class="Conceal">¦</span> left-click<span class="Constant"> 2</span>,<span class="Constant"> 8</span> <span id="L1020" class="LineNr">1020 </span> <span class="Conceal">¦</span> press<span class="Constant"> 65507</span> <span class="Comment"># start paste</span> <span id="L1021" class="LineNr">1021 </span> <span class="Conceal">¦</span> press enter <span id="L1022" class="LineNr">1022 </span> <span class="Conceal">¦</span> press<span class="Constant"> 65506</span> <span class="Comment"># end paste</span> <span id="L1023" class="LineNr">1023 </span> ] <span id="L1024" class="LineNr">1024 </span> run [ <span id="L1025" class="LineNr">1025 </span> <span class="Conceal">¦</span> <a href='002-typing.mu.html#L14'>editor-event-loop</a> <a href='../081print.mu.html#L4'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e <span id="L1026" class="LineNr">1026 </span> <span class="Conceal">¦</span> 3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span> <span id="L1027" class="LineNr">1027 </span> <span class="Conceal">¦</span> 4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span> <span id="L1028" class="LineNr">1028 </span> ] <span id="L1029" class="LineNr">1029 </span> <span class="Comment"># cursor should be below start of previous line</span> <span id="L1030" class="LineNr">1030 </span> memory-should-contain [ <span id="L1031" class="LineNr">1031 </span> <span class="Conceal">¦</span><span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span> <span class="Comment"># cursor row</span> <span id="L1032" class="LineNr">1032 </span> <span class="Conceal">¦</span><span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span> <span class="Comment"># cursor column (not indented)</span> <span id="L1033" class="LineNr">1033 </span> ] <span id="L1034" class="LineNr">1034 </span>] <span id="L1035" class="LineNr">1035 </span> <span id="L1036" class="LineNr">1036 </span><span class="muRecipe">after</span> <span class="Constant"><a href='002-typing.mu.html#L197'>&lt;handle-special-key&gt;</a></span> [ <span id="L1037" class="LineNr">1037 </span> <span class="Delimiter">{</span> <span id="L1038" class="LineNr">1038 </span> <span class="Conceal">¦</span> paste-start?:bool <span class="Special">&lt;-</span> equal k, <span class="Constant">65507/paste-start</span> <span id="L1039" class="LineNr">1039 </span> <span class="Conceal">¦</span> <span class="muControl">break-unless</span> paste-start? <span id="L1040" class="LineNr">1040 </span> <span class="Conceal">¦</span> *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">indent?:offset</span>, <span class="Constant">0/false</span> <span id="L1041" class="LineNr">1041 </span> <span class="Conceal">¦</span> <span class="muControl">return</span> <span class="Constant">1/go-render</span> <span id="L1042" class="LineNr">1042 </span> <span class="Delimiter">}</span> <span id="L1043" class="LineNr">1043 </span>] <span id="L1044" class="LineNr">1044 </span> <span id="L1045" class="LineNr">1045 </span><span class="muRecipe">after</span> <span class="Constant"><a href='002-typing.mu.html#L197'>&lt;handle-special-key&gt;</a></span> [ <span id="L1046" class="LineNr">1046 </span> <span class="Delimiter">{</span> <span id="L1047" class="LineNr">1047 </span> <span class="Conceal">¦</span> paste-end?:bool <span class="Special">&lt;-</span> equal k, <span class="Constant">65506/paste-end</span> <span id="L1048" class="LineNr">1048 </span> <span class="Conceal">¦</span> <span class="muControl">break-unless</span> paste-end? <span id="L1049" class="LineNr">1049 </span> <span class="Conceal">¦</span> *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">indent?:offset</span>, <span class="Constant">1/true</span> <span id="L1050" class="LineNr">1050 </span> <span class="Conceal">¦</span> <span class="muControl">return</span> <span class="Constant">1/go-render</span> <span id="L1051" class="LineNr">1051 </span> <span class="Delimiter">}</span> <span id="L1052" class="LineNr">1052 </span>] <span id="L1053" class="LineNr">1053 </span> <span id="L1054" class="LineNr">1054 </span><span class="SalientComment">## helpers</span> <span id="L1055" class="LineNr">1055 </span> <span id="L1056" class="LineNr">1056 </span><span class="muRecipe">def</span> <a href='002-typing.mu.html#L1056'>draw-horizontal</a> <a href='../081print.mu.html#L4'>screen</a>:&amp;:<a href='../081print.mu.html#L4'>screen</a>, row:num, x:num, right:num<span class="muRecipe"> -&gt; </span><a href='../081print.mu.html#L4'>screen</a>:&amp;:<a href='../081print.mu.html#L4'>screen</a> [ <span id="L1057" class="LineNr">1057 </span> <span class="Constant">local-scope</span> <span id="L1058" class="LineNr">1058 </span> <span class="Constant">load-ingredients</span> <span id="L1059" class="LineNr">1059 </span> style:char, style-found?:bool <span class="Special">&lt;-</span> <span class="Constant">next-ingredient</span> <span id="L1060" class="LineNr">1060 </span> <span class="Delimiter">{</span> <span id="L1061" class="LineNr">1061 </span> <span class="Conceal">¦</span> <span class="muControl">break-if</span> style-found? <span id="L1062" class="LineNr">1062 </span> <span class="Conceal">¦</span> style <span class="Special">&lt;-</span> copy <span class="Constant">9472/horizontal</span> <span id="L1063" class="LineNr">1063 </span> <span class="Delimiter">}</span> <span id="L1064" class="LineNr">1064 </span> color:num, color-found?:bool <span class="Special">&lt;-</span> <span class="Constant">next-ingredient</span> <span id="L1065" class="LineNr">1065 </span> <span class="Delimiter">{</span> <span id="L1066" class="LineNr">1066 </span> <span class="Conceal">¦</span> <span class="Comment"># default color to white</span> <span id="L1067" class="LineNr">1067 </span> <span class="Conceal">¦</span> <span class="muControl">break-if</span> color-found? <span id="L1068" class="LineNr">1068 </span> <span class="Conceal">¦</span> color <span class="Special">&lt;-</span> copy <span class="Constant">245/grey</span> <span id="L1069" class="LineNr">1069 </span> <span class="Delimiter">}</span> <span id="L1070" class="LineNr">1070 </span> bg-color:num, bg-color-found?:bool <span class="Special">&lt;-</span> <span class="Constant">next-ingredient</span> <span id="L1071" class="LineNr">1071 </span> <span class="Delimiter">{</span> <span id="L1072" class="LineNr">1072 </span> <span class="Conceal">¦</span> <span class="muControl">break-if</span> bg-color-found? <span id="L1073" class="LineNr">1073 </span> <span class="Conceal">¦</span> bg-color <span class="Special">&lt;-</span> copy <span class="Constant">0/black</span> <span id="L1074" class="LineNr">1074 </span> <span class="Delimiter">}</span> <span id="L1075" class="LineNr">1075 </span> <a href='../081print.mu.html#L4'>screen</a> <span class="Special">&lt;-</span> <a href='../081print.mu.html#L442'>move-cursor</a> <a href='../081print.mu.html#L4'>screen</a>, row, x <span id="L1076" class="LineNr">1076 </span> <span class="Delimiter">{</span> <span id="L1077" class="LineNr">1077 </span> <span class="Conceal">¦</span> continue?:bool <span class="Special">&lt;-</span> lesser-or-equal x, right <span class="Comment"># right is inclusive, to match editor semantics</span> <span id="L1078" class="LineNr">1078 </span> <span class="Conceal">¦</span> <span class="muControl">break-unless</span> continue? <span id="L1079" class="LineNr">1079 </span> <span class="Conceal">¦</span> print <a href='../081print.mu.html#L4'>screen</a>, style, color, bg-color <span id="L1080" class="LineNr">1080 </span> <span class="Conceal">¦</span> x <span class="Special">&lt;-</span> add x,<span class="Constant"> 1</span> <span id="L1081" class="LineNr">1081 </span> <span class="Conceal">¦</span> <span class="muControl">loop</span> <span id="L1082" class="LineNr">1082 </span> <span class="Delimiter">}</span> <span id="L1083" class="LineNr">1083 </span>] </pre> </body> </html> <!-- vim: set foldmethod=manual : -->