blob: 3be6f270946396599aaaf53760de5eaf1577ab4c [file] [log] [blame]
void main() {
List<int> list = [1, 2, 3];
print(f(list));
print(subs(list));
print(perms(list));
print(equals(list, list));
}
List<X> f<X>(List<X> list) => /*
checkingOrder={List<X>,<X>[...]},
subtypes={<X>[...]},
type=List<X>
*/ switch (list) {
[] /*space=<[]>*/ => [],
[...] /*space=<[...List<X>]>*/ => [],
};
List<List<A>> subs<A>(List<A> list) => /*
checkingOrder={List<A>,<A>[],<A>[(), ...]},
subtypes={<A>[],<A>[(), ...]},
type=List<A>
*/ switch (list) {
[] /*space=<[]>*/ => [],
[var x, ...var xs] /*space=<[Object?, ...List<A>]>*/ => [
for (var ys in subs(xs)) ...[
[x] + ys,
ys,
],
[x],
],
};
List<List<A>> perms<A>(List<A> list) => /*
checkingOrder={List<A>,<A>[],<A>[(), ...]},
subtypes={<A>[],<A>[(), ...]},
type=List<A>
*/ switch (list) {
[] || [_] /*space=<[]|[Object?]>*/ => [list],
[var x, ...var xs] /*space=<[Object?, ...List<A>]>*/ => [
for (var i = 0; i < list.length; i++)
for (var perm in perms(xs)) [...perm.take(i), x, ...perm.skip(i)],
],
};
bool equals<A>(List<A> a, List<A> b) => /*
fields={$1:List<A>,$2:List<A>},
type=(List<A>, List<A>)
*/ switch ((a, b)) {
([], []) /*space=([], [])*/ => true,
([_, ...], []) /*space=([Object?, ...List<A>], [])*/ => false,
([], [_, ...]) /*space=([], [Object?, ...List<A>])*/ => false,
(
[var l, ...var ls],
[var r, ...var rs],
) /*space=([Object?, ...List<A>], [Object?, ...List<A>])*/ =>
l == r && equals(ls, rs),
};