#!/usr/bin/ruby

#
## https://rosettacode.org/wiki/Ordered_Partitions#Sidef
#

func part(_,    {.is_empty}) { [[]] }
func partitions({.is_empty}) { [[]] }

func part(s, args) {
  var res = [];
  s.combinations(args[0], { |*c|
    part(s - c, args.slice(1)).each{|r| res << ([c] + r)}
  })
  res
}

func partitions(args) {
  part(@(1 .. args.sum), args)
}

[[],[0,0,0],[1,1,1],[2,0,2]].each { |test_case|
  say "partitions #{test_case.dump}:"
  partitions(test_case).each{|part| say part.dump }
  print "\n"
}