use std::{io::Write, sync::atomic::Ordering}; use matrix::{value::Value, vm::Interupt}; use rustyline::Config; use crate::State; pub struct Repl<'a> { state: State<'a> } impl<'a> Repl<'a> { pub fn new(state: State<'a>) -> Self { Self { state } } pub fn run(&mut self) { let interupt = self.state.vm.interupt(); ctrlc::set_handler(move || { interupt.store(Interupt::KeyboardInterupt as usize, Ordering::SeqCst); }).unwrap(); let config = Config::builder() .check_cursor_position(true) .build(); let mut rl = rustyline::DefaultEditor::with_config(config).unwrap(); loop { let Ok(line) = rl.readline(">> ") else { break; }; match self.state.execute(line) { Err(err) => crate::error(err), Ok(val) => { if val != Value::Nil { println!("{val}"); } } } let _ = std::io::stdout().flush(); } } }