summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLLLL Colonq <llll@colonq>2026-10-04 19:14:06 -0400
committerLLLL Colonq <llll@colonq>2026-10-04 19:14:06 -0400
commit86ce8c5dc505f67257f8f9d85d886f09b89e7a82 (patch)
tree32f7da31f41a7283ce2014e0e07f6a78e0bf2eda
parent569ffe54a44f0c5aa23ca97c20a4ac28121fd2bd (diff)
Update
-rw-r--r--crates/teleia/src/script.rs52
-rw-r--r--crates/teleia/src/ui.rs1
2 files changed, 51 insertions, 2 deletions
diff --git a/crates/teleia/src/script.rs b/crates/teleia/src/script.rs
index 2e7ea3c..cf80a16 100644
--- a/crates/teleia/src/script.rs
+++ b/crates/teleia/src/script.rs
@@ -116,12 +116,16 @@ unsafe extern "C" {
fn pit_symtab_fget(rt: *mut PitRuntime, sym: PitValue) -> PitValue;
fn pit_value_sort(x: PitValue) -> i64;
- fn pit_value_sort_or_heavy_sort(x: PitValue) -> i64;
+ fn pit_value_sort_or_heavy_sort(rt: *mut PitRuntime, x: PitValue) -> i64;
fn pit_value_eq(x: PitValue, y: PitValue) -> bool;
+ fn pit_value_integer_new(rt: *mut PitRuntime, x: i64) -> PitValue;
+ fn pit_value_double_new(rt: *mut PitRuntime, x: f64) -> PitValue;
fn pit_value_as_integer(rt: *mut PitRuntime, v: PitValue) -> i64;
fn pit_value_as_double(rt: *mut PitRuntime, v: PitValue) -> f64;
+ fn pit_value_bytes_new(rt: *mut PitRuntime, buf: *const u8, len: i64) -> PitValue;
+
fn pit_value_array_new(rt: *mut PitRuntime, len: i64) -> PitValue;
fn pit_value_array_from_buf(rt: *mut PitRuntime, xs: *const PitValue, len: i64) -> PitValue;
fn pit_value_array_len(rt: *mut PitRuntime, arr: PitValue) -> i64;
@@ -176,6 +180,9 @@ impl Runtime {
if self.eq(ve, NIL) { return Ok(()) };
Err(Error { msg: self.dump(ve).unwrap_or("<unable to dump>".to_owned()) }.into())
}
+ pub fn to_value<T>(&mut self, v: T) -> utils::Erm<Value> where T: PitValuable {
+ v.to_value(self)
+ }
pub fn set_fuel(&mut self, fuel: i64) {
unsafe {
pit_runtime_set_fuel(self.rt, fuel);
@@ -183,7 +190,7 @@ impl Runtime {
}
pub fn sort_of(&mut self, v: Value) -> utils::Erm<Sort> {
unsafe {
- let vt = pit_value_sort_or_heavy_sort(v.val);
+ let vt = pit_value_sort_or_heavy_sort(self.rt, v.val);
self.error()?;
if vt == PIT__SORT_DOUBLE { Ok(Sort::Double) }
else if vt == PIT__SORT_INTEGER { Ok(Sort::Integer) }
@@ -335,3 +342,44 @@ impl Parser {
pub struct Value {
val: PitValue,
}
+
+pub trait PitValuable {
+ fn to_value(self, rt: &mut Runtime) -> utils::Erm<Value>;
+}
+impl PitValuable for i64 {
+ fn to_value(self, rt: &mut Runtime) -> utils::Erm<Value> {
+ unsafe {
+ let val = pit_value_integer_new(rt.rt, self);
+ rt.error()?;
+ Ok(Value { val })
+ }
+ }
+}
+impl PitValuable for bool {
+ fn to_value(self, rt: &mut Runtime) -> utils::Erm<Value> {
+ unsafe {
+ let val = pit_value_integer_new(rt.rt, self as i64);
+ rt.error()?;
+ Ok(Value { val })
+ }
+ }
+}
+impl PitValuable for f64 {
+ fn to_value(self, rt: &mut Runtime) -> utils::Erm<Value> {
+ unsafe {
+ let val = pit_value_double_new(rt.rt, self);
+ rt.error()?;
+ Ok(Value { val })
+ }
+ }
+}
+impl<T: AsRef<[u8]>> PitValuable for &T {
+ fn to_value(self, rt: &mut Runtime) -> utils::Erm<Value> {
+ unsafe {
+ let bs = self.as_ref();
+ let val = pit_value_bytes_new(rt.rt, bs.as_ptr(), bs.len() as i64);
+ rt.error()?;
+ Ok(Value { val })
+ }
+ }
+}
diff --git a/crates/teleia/src/ui.rs b/crates/teleia/src/ui.rs
index a4069ba..9f21fe2 100644
--- a/crates/teleia/src/ui.rs
+++ b/crates/teleia/src/ui.rs
@@ -126,6 +126,7 @@ impl Cursor {
self.index = val;
self.index %= self.bound;
}
+ pub fn finish_visually(&mut self) { self.prev_index = self.index; }
pub fn increment_unlocked(&mut self, tick: Tick) -> bool { self.set_unlocked(self.index + 1, tick); true }
pub fn decrement_unlocked(&mut self, tick: Tick) -> bool { self.set_unlocked(self.index + self.bound - 1, tick); true }