ANSI

:= []
update_cursor : { cursor : CursorPosition, screen : ScreenSize }, Arrow -> { cursor : CursorPosition, screen : ScreenSize }
draw_screen : { cursor : CursorPosition, screen : ScreenSize }, List(DrawFn) -> Str

Loop through each pixel in the screen and build up a single string to write to stdout.

Symbol

:= [ExclamationMark, QuotationMark, NumberSign, DollarSign, PercentSign, Ampersand, Apostrophe, RoundOpenBracket, RoundCloseBracket, Asterisk, PlusSign, Comma, Hyphen, FullStop, ForwardSlash, Colon, SemiColon, LessThanSign, EqualsSign, GreaterThanSign, QuestionMark, AtSign, SquareOpenBracket, Backslash, SquareCloseBracket, Caret, Underscore, GraveAccent, CurlyOpenBrace, VerticalBar, CurlyCloseBrace, Tilde]

Ctrl

:= [Space, A, B, C, D, E, F, G, H, I, J, K, L, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, BackSlash, SquareCloseBracket, Caret, Underscore]

Action

:= [Escape, Enter, Space, Delete]

Arrow

:= [Up, Down, Left, Right]

Number

:= [N0, N1, N2, N3, N4, N5, N6, N7, N8, N9]

Letter

:= [A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z]

Input

:= [Ctrl(Ctrl), Action(Action), Arrow(Arrow), Symbol(Symbol), Number(Number), Upper(Letter), Lower(Letter), Unsupported(List(U8))]
DrawFn : CursorPosition, CursorPosition -> Try(Pixel, { })