val .factorial = fn(.x) if(.x < 2: 1; .x * self(.x - 1)) val .permute = fn(.list) { if .list is not list: throw "expected list" val .limit = 10 if len(.list) > .limit: throw $"permutation limit exceeded (currently \.limit;)" var .elements = .list var .ordinals = pseries len .elements val .n = len(.ordinals) var .i, .j for[.p=[.list]] of .factorial(len .list)-1 { .i = .n - 1 .j = .n while .ordinals[.i] > .ordinals[.i+1] { .i -= 1 } while .ordinals[.j] < .ordinals[.i] { .j -= 1 } .ordinals[.i], .ordinals[.j] = .ordinals[.j], .ordinals[.i] .elements[.i], .elements[.j] = .elements[.j], .elements[.i] .i += 1 for .j = .n; .i < .j ; .i, .j = .i+1, .j-1 { .ordinals[.i], .ordinals[.j] = .ordinals[.j], .ordinals[.i] .elements[.i], .elements[.j] = .elements[.j], .elements[.i] } .p = more .p, .elements } } for .e in .permute([1, 3.14, 7]) { writeln .e }