From a02b78e348931c483589143668b9ab1f9b766df7 Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Tue, 26 Dec 2023 20:02:16 -0800 Subject: perm: support general sequences. * combi.c (perm_seq_gen_fun, perm_seq): New functions. (perm): Call perm_seq in default case to handle more sequence kinds. --- combi.c | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/combi.c b/combi.c index 7bf6f6a6..5d116aed 100644 --- a/combi.c +++ b/combi.c @@ -210,6 +210,29 @@ static val perm_str(val p, val k) } } +static val perm_seq_gen_fun(val state) +{ + val p = vecref(state, zero); + val kk = vecref(state, one); + val out = vector(kk, nil); + perm_gen_fun_common(state, out, perm_vec_gen_fill); + return make_like(out, p); +} + +static val perm_seq(val p, val k) +{ + if (k == zero) { + return cons(make_like(nil, p), nil); + } else { + val vec = vec_seq(p); + val state = perm_init_common(vec, k); + if (!state) + return nil; + return generate(func_f0(state, perm_while_fun), + func_f0(state, perm_seq_gen_fun)); + } +} + val perm(val seq, val k) { if (null_or_missing_p(k)) { @@ -235,7 +258,7 @@ val perm(val seq, val k) case LIT: return perm_str(seq, k); default: - type_mismatch(lit("perm: ~s is not a sequence"), seq, nao); + return perm_seq(seq, k); } } -- cgit v1.2.3