summaryrefslogtreecommitdiffstats
path: root/combi.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2023-12-27 19:21:07 -0800
committerKaz Kylheku <kaz@kylheku.com>2023-12-27 19:21:07 -0800
commiteaa53bd84f8dcef22b35b4a889ae46476307d6eb (patch)
tree3d935a097c35562922d77476996034339005a6c3 /combi.c
parent6e0746c832be034d2e580e37c81f1f8a6952d23a (diff)
downloadtxr-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.c18
1 files changed, 17 insertions, 1 deletions
diff --git a/combi.c b/combi.c
index 986ea38d..09d1684f 100644
--- a/combi.c
+++ b/combi.c
@@ -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);
}
}