Generating all possible rules
We need a method to generate all possible combinations of elements of this array. Combinations are found via the binary representation of subsets, as shown in the following snippet:
public extension Array { public func combinations() -> [[Element]] { if isEmpty { return [] } let numberOfSubsets = Int(pow(2, Double(count))) var result = [[Element]]() for i in 0..<numberOfSubsets { var remainder = i var index = 0 var combination = [Element]() while remainder > 0 { if remainder % 2 == 1 { combination.append(self[index]) } index += 1 remainder /= 2 } result.append(combination) } return result } }
The following usage example:
let array = [1,2,3] print(array.combinations())
Produces:
[[], [1], [2], [1, 2], [3], [1, 3], [2, 3], [1, 2...