summaryrefslogtreecommitdiff
path: root/matrix-std/src/iter.rs
diff options
context:
space:
mode:
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()?;