sub combinations returns Array  (@list is rw) {
  return () unless @list.elems;
  my @ans;
  for 1 .. 2**@list.elems-1-> $num {
      push @ans, [ @list[ (0 .. sqrt($num)).grep:{ $num +& (2**$_) } ] ];
  }
  return @ans;
} 

my @list = (1..4);
combinations(@list).perl.say;
