import gbf/internal/ascii
import gbf/internal/eval
import gbf/internal/lexer
import gbf/internal/parser
import gbf/internal/vm.{type VirtualMachine}
import gleam/list
import gleam/result
import gleam/string
pub type Error {
Parser(reason: parser.Error)
Eval(reason: eval.Error)
}
pub fn run(source: String) -> Result(VirtualMachine, Error) {
let bvm =
source
|> string.split(on: "")
|> list.map(ascii.to_code)
|> vm.new
use ast <- result.try(parse_ast(source))
use bvm <- result.try(eval_ast(bvm, ast))
Ok(bvm)
}
pub fn output(virtual_machine: VirtualMachine) -> String {
vm.output(virtual_machine)
}
fn parse_ast(source: String) {
source
|> lexer.new
|> lexer.lex
|> parser.parse
|> result.map_error(fn(e) { Parser(e) })
}
fn eval_ast(vm, ast) {
eval.eval(vm, ast)
|> result.map_error(fn(e) { Eval(e) })
}
|