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, 3]]