From 959c9394dcdee41b0515b705bf8d60921e1532a6 Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Sat, 15 Jun 2024 18:18:10 -0700 Subject: New function: copy-iter. * eval.c (eval_init): Register copy-iter intrinsic. * lib.[ch] (copy_iter): New function. --- eval.c | 1 + lib.c | 16 ++++++++++++++++ lib.h | 1 + 3 files changed, 18 insertions(+) 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); -- cgit v1.2.3