diff options
Diffstat (limited to '')
-rw-r--r-- | matrix-std/src/iter.rs (renamed from matrix-stdlib/src/iter.rs) | 32 |
1 files changed, 20 insertions, 12 deletions
diff --git a/matrix-stdlib/src/iter.rs b/matrix-std/src/iter.rs index 630e52c..638755c 100644 --- a/matrix-stdlib/src/iter.rs +++ b/matrix-std/src/iter.rs @@ -1,7 +1,7 @@ use std::{cell::RefCell, rc::Rc}; -use matrix::{iter, vm::Vm, value::Value, Result, unpack_varargs, unpack_args}; +use matrix_lang::prelude::*; use matrix_macros::native_func; -use crate::{error, next, VmArgs}; +use crate::{error, next, VmArgs, unpack_args, unpack_varargs}; use Value as V; @@ -54,7 +54,7 @@ fn range(_: VmArgs, args: Vec<Value>) -> Result<Value> { Ok(iter!(move |_,_| { let curr = *(i.borrow()); *(i.borrow_mut()) = curr + step; - if curr >= max { + if (step >= 0 && curr >= max) || (step <= 0 && curr <= max) { return Ok(V::Nil) } else { return Ok(V::Int(curr)) @@ -235,7 +235,7 @@ fn lines(_: VmArgs, args: Vec<Value>) -> Result<Value> { let Value::String(str) = str else { return error!("lines arg must be a string") }; - let lines: Vec<Rc<str>> = str.split_inclusive("\n").map(|s| Rc::from(s)).collect(); + let lines: Vec<Rc<str>> = str.split("\n").map(|s| Rc::from(s)).collect(); let res = RefCell::new(lines.into_iter()); Ok(iter!(move |_,_| { match res.borrow_mut().next() { @@ -245,7 +245,7 @@ fn lines(_: VmArgs, args: Vec<Value>) -> Result<Value> { })) } -#[native_func(1)] +#[native_func(2)] fn skip((vm, frame): VmArgs, args: Vec<Value>) -> Result<Value> { let [count, iter] = unpack_args!(args); let iter = iter.into_iter_fn()?; @@ -291,25 +291,32 @@ fn alternate(_: VmArgs, args: Vec<Value>) -> Result<Value> { } #[native_func(2)] -fn intersperse(_: VmArgs, args: Vec<Value>) -> Result<Value> { +fn intersperse((vm, frame): VmArgs, args: Vec<Value>) -> Result<Value> { let [value, iter] = unpack_args!(args); let iter = iter.into_iter_fn()?; let flag = RefCell::new(Some(0)); + let next = RefCell::new(next!(vm, frame, iter)?); Ok(iter!(move |(vm, frame),_| { let f = *flag.borrow(); match f { Some(0) => { - let val = next!(vm, frame, iter)?; - if val == Value::Nil { + let val = next.borrow(); + if *val == Value::Nil { *flag.borrow_mut() = None; } else { *flag.borrow_mut() = Some(1); } - Ok(val) + Ok(val.clone()) }, Some(1) => { + *next.borrow_mut() = next!(vm, frame, iter)?; + if *next.borrow() == Value::Nil { + *flag.borrow_mut() = None; + return Ok(Value::Nil) + } else { + *flag.borrow_mut() = Some(0); + } let val = value.clone(); - *flag.borrow_mut() = Some(0); Ok(val) }, _ => Ok(Value::Nil) @@ -331,6 +338,7 @@ fn zip(_: VmArgs, args: Vec<Value>) -> Result<Value> { let vr = next!(vm, frame, ir)?; if vl == Value::Nil || vr == Value::Nil { *flag.borrow_mut() = false; + return Ok(Value::Nil) } Ok(Value::List(vec![vl, vr].into())) }, @@ -401,7 +409,7 @@ fn take((vm, frame): VmArgs, args: Vec<Value>) -> Result<Value> { Ok(Value::List(values.into())) } -#[native_func(2)] +#[native_func(1)] fn last((vm, frame): VmArgs, args: Vec<Value>) -> Result<Value> { let [iter] = unpack_args!(args); let iter = iter.into_iter_fn()?; @@ -414,7 +422,7 @@ fn last((vm, frame): VmArgs, args: Vec<Value>) -> Result<Value> { Ok(last) } -#[native_func(2)] +#[native_func(1)] fn next((vm, frame): VmArgs, args: Vec<Value>) -> Result<Value> { let [iter] = unpack_args!(args); let iter = iter.into_iter_fn()?; |