diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2023-12-27 19:21:07 -0800 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2023-12-27 19:21:07 -0800 |
commit | eaa53bd84f8dcef22b35b4a889ae46476307d6eb (patch) | |
tree | 3d935a097c35562922d77476996034339005a6c3 /combi.c | |
parent | 6e0746c832be034d2e580e37c81f1f8a6952d23a (diff) | |
download | txr-eaa53bd84f8dcef22b35b4a889ae46476307d6eb.tar.gz txr-eaa53bd84f8dcef22b35b4a889ae46476307d6eb.tar.bz2 txr-eaa53bd84f8dcef22b35b4a889ae46476307d6eb.zip |
rcomb: support general sequences.
* combi.c (rcomb_seq_gen_fun, rcomb_seq): New static functions.
(rcomb): Replace error throw in default case with call to
rcomb_seq.
Diffstat (limited to 'combi.c')
-rw-r--r-- | combi.c | 18 |
1 files changed, 17 insertions, 1 deletions
@@ -674,6 +674,22 @@ static val rcomb_str(val str, val k) func_f0(state, rcomb_str_gen_fun)); } +static val rcomb_seq_gen_fun(val sstate) +{ + cons_bind (state, seq, sstate); + val list = rcomb_list_gen_fun(state); + rcomb_gen_fun_common(state); + return make_like(list, seq); +} + +static val rcomb_seq(val seq, val k) +{ + val state = nreverse(list_vec(vector(k, list_seq(seq)))); + val sstate = cons(state, seq); + return generate(func_f0(state, rcomb_while_fun), + func_f0(sstate, rcomb_seq_gen_fun)); +} + val rcomb(val seq, val k) { if (!integerp(k)) @@ -701,6 +717,6 @@ val rcomb(val seq, val k) return cons(string(L""), nil); return rcomb_str(seq, k); default: - type_mismatch(lit("rcomb: ~s is not a sequence"), seq, nao); + return rcomb_seq(seq, k); } } |