recipe main [
default-space:address:array:location <- new location:type, 30:literal
switch-to-display
width:number <- display-width
{
wide-enough?:boolean <- greater-than width:number, 100:literal
break-if wide-enough?:boolean
return-to-console
assert wide-enough?:boolean, [screen too narrow; we don't support less than 100 characters yet]
}
divider:number, _ <- divide-with-remainder width:number, 2:literal
draw-column 0:literal/screen, divider:number
x:address:array:character <- new [1:integer <- add 2:literal, 2:literal]
y:address:array:character <- edit x:address:array:character, 0:literal/screen, 0:literal, 0:literal, 5:literal, divider:number
#? draw-bounding-box 0:literal/screen, 0:literal, 0:literal, 5:literal, divider:number
left:number <- add divider:number, 1:literal
y:address:array:character <- edit 0:literal, 0:literal/screen, 0:literal, left:number, 2:literal, width:number
move-cursor 0:literal/screen, 0:literal, 0:literal
wait-for-key-from-keyboard
return-to-console
]
recipe draw-column [
default-space:address:array:location <- new location:type, 30:literal
screen:address <- next-ingredient
col:number <- next-ingredient
curr:number <- copy 0:literal
max:number <- screen-height screen:address
{
continue?:boolean <- lesser-than curr:number, max:number
break-unless continue?:boolean
move-cursor screen:address, curr:number, col:number
print-character screen:address, 9474:literal/vertical, 245:literal/grey
curr:number <- add curr:number, 1:literal
loop
}
move-cursor screen:address, 0:literal, 0:literal
]
recipe edit [
default-space:address:array:location <- new location:type, 30:literal
in:address:array:character <- next-ingredient
screen:address <- next-ingredient
top:number <- next-ingredient
left:number <- next-ingredient
bottom:number <- next-ingredient
right:number <- next-ingredient
# draw bottom boundary
curr:number <- copy left:number
{
continue?:boolean <- lesser-than curr:number, right:number
break-unless continue?:boolean
move-cursor screen:address, bottom:number, curr:number
print-character screen:address, 9472:literal/vertical, 245:literal/grey
curr:number <- add curr:number, 1:literal
loop
}
move-cursor screen:address, top:number, left:number
]
recipe draw-bounding-box [
default-space:address:array:location <- new location:type, 30:literal
screen:address <- next-ingredient
# sanity-check the box bounds
top:number <- next-ingredient
{
out?:boolean <- lesser-than top:number, 0:literal
break-unless out?:boolean
top:number <- copy 0:literal
}
left:number <- next-ingredient
{
out?:boolean <- lesser-than left:number, 0:literal
break-unless out?:boolean
left:number <- copy 0:literal
}
bottom:number <- next-ingredient
{
height:number <- screen-height screen:address
out?:boolean <- greater-or-equal bottom:number, height:number
break-unless out?:boolean
bottom:number <- subtract height:number, 1:literal
}
right:number <- next-ingredient
{
width:number <- screen-width screen:address
out?:boolean <- greater-or-equal right:number, width:number
break-unless out?:boolean
right:number <- subtract width:number, 1:literal
}
#? print-integer screen:address, bottom:number
#? print-character screen:address, 32:literal/space
#? print-integer screen:address, right:number
# top border
move-cursor screen:address, top:number, left:number
print-character screen:address, 9484:literal/down-right, 245:literal/grey
x:number <- add left:number, 1:literal # exclude corner
{
continue?:boolean <- lesser-than x:number, right:number
break-unless continue?:boolean
print-character screen:address, 9472:literal/horizontal, 245:literal/grey
x:number <- add x:number, 1:literal
loop
}
print-character screen:address, 9488:literal/down-left, 245:literal/grey
# bottom border
move-cursor screen:address, bottom:number, left:number
print-character screen:address, 9492:literal/up-right, 245:literal/grey
x:number <- add left:number, 1:literal # exclude corner
{
continue?:boolean <- lesser-than x:number, right:number
break-unless continue?:boolean
print-character screen:address, 9472:literal/horizontal, 245:literal/grey
x:number <- add x:number, 1:literal
loop
}
print-character screen:address, 9496:literal/up-left, 245:literal/grey
# left and right borders
x:number <- add top:number, 1:literal # exclude corner
{
continue?:boolean <- lesser-than x:number, bottom:number
break-unless continue?:boolean
move-cursor screen:address, x:number, left:number
print-character screen:address, 9474:literal/vertical, 245:literal/grey
move-cursor screen:address, x:number, right:number
print-character screen:address, 9474:literal/vertical, 245:literal/grey
x:number <- add x:number, 1:literal
loop
}
# position cursor inside box
move-cursor screen:address, top:number, left:number
cursor-down screen:address
cursor-right screen:address
]