stn := @use("../../../libraries/stn/src/lib.hb"); .{string, log} := stn; .{Vec2} := stn.math render := @use("../../../libraries/render/src/lib.hb"); .{Surface} := render; .{Font} := render.text UI := struct {raw: ^u8, raw_length: uint, is_dirty: bool, surface: Surface, // Each child has their WidgetType as their first byte // children: ^^u8, } render_ui := fn(surface: Surface, ui: UI): void { if ui.is_dirty { render.clear(ui.surface, render.black) ui.is_dirty = false } pos := Vec2(uint).(0, 0) render.put_surface(surface, ui.surface, pos, false) } sexpr_parser := fn(sexpr: ^u8): UI { cursor := sexpr paren_balance := 0 loop { if *cursor == 0 { if paren_balance != 0 { log.error("Unbalanced Parens\0") } break } else if *cursor == 40 { log.info("Open paren\0") paren_balance += 1 } else if *cursor == 41 { log.info("Closed paren\0") paren_balance -= 1 } cursor += 1 } length := string.length(sexpr) ui_surface := render.new_surface(100, 100) return UI.(sexpr, length, true, ui_surface) }