From 89eb0e18c6af1dc2150e34af19e81b1ad3b52f81 Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Sun, 26 May 2024 21:25:20 -0700 Subject: interpose: use seq_iter and seq_build. * lib.c (interpose): non-list cases consolidated into one, which uses generic iteration and building. * tests/012/seq.tl: New tests --- lib.c | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) (limited to 'lib.c') diff --git a/lib.c b/lib.c index 1d06d645..7a0d2522 100644 --- a/lib.c +++ b/lib.c @@ -11151,6 +11151,8 @@ static val lazy_interpose(val sep, val list) val interpose(val sep, val seq) { + val self = lit("interpose"); + switch (type(seq)) { case NIL: return nil; @@ -11171,14 +11173,26 @@ val interpose(val sep, val seq) } case LCONS: return lazy_interpose(sep, seq); - case LIT: - case STR: - case LSTR: - return cat_str(interpose(sep, tolist(seq)), nil); - case VEC: - return vec_list(interpose(sep, tolist(seq))); default: - type_mismatch(lit("interpose: ~s is not a sequence"), seq, nao); + { + seq_build_t bu; + seq_iter_t it; + val elem; + + seq_build_init(self, &bu, seq); + seq_iter_init(self, &it, seq); + + if (seq_get(&it, &elem)) { + seq_add(&bu, elem); + + while (seq_get(&it, &elem)) { + seq_add(&bu, sep); + seq_add(&bu, elem); + } + } + + return seq_finish(&bu); + } } } -- cgit v1.2.3