diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2023-12-26 20:02:16 -0800 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2023-12-26 20:02:16 -0800 |
commit | a02b78e348931c483589143668b9ab1f9b766df7 (patch) | |
tree | 2bb95ef0ed809488674aa70f5758f3a7216a318c | |
parent | f61fe3d62026429b56793093808cc24dd488d4bd (diff) | |
download | txr-a02b78e348931c483589143668b9ab1f9b766df7.tar.gz txr-a02b78e348931c483589143668b9ab1f9b766df7.tar.bz2 txr-a02b78e348931c483589143668b9ab1f9b766df7.zip |
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.
-rw-r--r-- | combi.c | 25 |
1 files changed, 24 insertions, 1 deletions
@@ -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); } } |