summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--eval.c1
-rw-r--r--lib.c16
-rw-r--r--lib.h1
3 files changed, 18 insertions, 0 deletions
diff --git a/eval.c b/eval.c
index 815d488f..f8d8c047 100644
--- a/eval.c
+++ b/eval.c
@@ -7839,6 +7839,7 @@ void eval_init(void)
reg_fun(intern(lit("iter-step"), user_package), func_n1(iter_step));
reg_fun(intern(lit("iter-reset"), user_package), func_n2(iter_reset));
reg_fun(intern(lit("iter-cat"), user_package), func_n0v(iter_catv));
+ reg_fun(intern(lit("copy-iter"), user_package), func_n1(copy_iter));
reg_fun(intern(lit("rcons"), user_package), func_n2(rcons));
reg_fun(intern(lit("rangep"), user_package), func_n1(rangep));
diff --git a/lib.c b/lib.c
index 7db83d78..97b4cfd5 100644
--- a/lib.c
+++ b/lib.c
@@ -1493,6 +1493,22 @@ val iter_catv(varg iters)
return nil;
}
+val copy_iter(val iter)
+{
+ if (type(iter) == COBJ && iter->co.cls == seq_iter_cls) {
+ val iter_copy;
+ const struct seq_iter *sit = coerce(struct seq_iter *, iter->co.handle);
+ struct seq_iter *dit = coerce(struct seq_iter *,
+ chk_calloc(1, sizeof *dit));
+ seq_iter_clone(dit, sit);
+ iter_copy = cobj(coerce(mem_t *, dit), seq_iter_cls, &seq_iter_cobj_ops);
+ gc_hint(iter);
+ return iter_copy;
+ } else {
+ return iter;
+ }
+}
+
static void seq_build_generic_pend(seq_build_t *bu, val seq)
{
seq_iter_t it;
diff --git a/lib.h b/lib.h
index 95964c04..4f3ddf1c 100644
--- a/lib.h
+++ b/lib.h
@@ -776,6 +776,7 @@ val iter_item(val iter);
val iter_step(val iter);
val iter_reset(val iter, val obj);
val iter_catv(varg iters);
+val copy_iter(val iter);
void seq_build_init(val self, seq_build_t *bu, val likeobj);
void seq_add(seq_build_t *bu, val item);
void seq_pend(seq_build_t *bu, val items);