diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2024-06-15 18:18:10 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2024-06-15 18:18:10 -0700 |
commit | 959c9394dcdee41b0515b705bf8d60921e1532a6 (patch) | |
tree | f9ff708ed52d8a708f38d48f6d36a486bf565e6a /lib.c | |
parent | a787e16583463ed15c0aa2911253e8ba78d3f4c8 (diff) | |
download | txr-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.c | 16 |
1 files changed, 16 insertions, 0 deletions
@@ -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; |