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]

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, {  })