val .factorial = f if(.x < 2: 1; .x x self(.x - 1)) val .permute = f(.arr) { if not isArray(.arr): throw "expected array" val .limit = 10 if len(.arr) > .limit: throw $"permutation limit exceeded (currently \.limit;)" var .elements = .arr var .ordinals = pseries len .elements val .n = len(.ordinals) var .i, .j for[.p=[.arr]] of .factorial(len .arr)-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 }