summaryrefslogtreecommitdiffstats
path: root/lib.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2024-06-15 18:18:10 -0700
committerKaz Kylheku <kaz@kylheku.com>2024-06-15 18:18:10 -0700
commit959c9394dcdee41b0515b705bf8d60921e1532a6 (patch)
treef9ff708ed52d8a708f38d48f6d36a486bf565e6a /lib.c
parenta787e16583463ed15c0aa2911253e8ba78d3f4c8 (diff)
downloadtxr-959c9394dcdee41b0515b705bf8d60921e1532a6.tar.gz
txr-959c9394dcdee41b0515b705bf8d60921e1532a6.tar.bz2
txr-959c9394dcdee41b0515b705bf8d60921e1532a6.zip
New function: copy-iter.
* eval.c (eval_init): Register copy-iter intrinsic. * lib.[ch] (copy_iter): New function.
Diffstat (limited to 'lib.c')
-rw-r--r--lib.c16
1 files changed, 16 insertions, 0 deletions
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;