public void whenCalculatingPowerSet_thenCorrect() {
    Set<Character> chars = ImmutableSet.of('a', 'b');
 
    Set<Set<Character>> result = Sets.powerSet(chars);
 
    Set<Character> empty =  ImmutableSet.<Character> builder().build();
    Set<Character> a = ImmutableSet.of('a');
    Set<Character> b = ImmutableSet.of('b');
    Set<Character> aB = ImmutableSet.of('a', 'b');
 
    assertThat(result, contains(empty, a, b, aB));
}

        

class GFG { 
  
    // Driver's code 
    public static void main(String[] args) 
    { 
  
        // Creating a set 
        Set<Integer> 
            set = Sets.newHashSet(1, 2, 3); 
  
        // powerSet to store all subsets of a set 
        Set<Set<Integer> > 
            powerSet = Sets.powerSet(set); 
  
        // Displaying all possible subsets of a set 
        for (Set<Integer> s : powerSet) 
            System.out.println(s); 
    } 
} 

        

class SetUtils
{
	// Java program to demonstrate Guava's Sets.powerSet() method
	public static void main(String[] args)
	{
		Set<Integer> set = Sets.newHashSet(1, 2, 3);
		Set<Set<Integer>> powerSet = Sets.powerSet(set);

		for (Set<Integer> s: powerSet)
			System.out.println(s);
	}
}

        

public static <T> Set<Set<T>> powerSet(Set<T> originalSet) {
    Set<Set<T>> sets = new HashSet<Set<T>>();
    if (originalSet.isEmpty()) {
        sets.add(new HashSet<T>());
        return sets;
    }
    List<T> list = new ArrayList<T>(originalSet);
    T head = list.get(0);
    Set<T> rest = new HashSet<T>(list.subList(1, list.size())); 
    for (Set<T> set : powerSet(rest)) {
        Set<T> newSet = new HashSet<T>();
        newSet.add(head);
        newSet.addAll(set);
        sets.add(newSet);
        sets.add(set);
    }       
    return sets;
}  

        

public static void main(String[] args) { 
	Set<String> animals = ImmutableSet.of("gerbil", "hamster");
	Set<String> fruits = ImmutableSet.of("apple", "orange", "banana");

	Set<Set<String>> animalSets = Sets.powerSet(animals);
	// {{}, {"gerbil"}, {"hamster"}, {"gerbil", "hamster"}}
}

        

private void initPowersetIterator() {
    // Create set of definition with leftover quantities
    Set<T> leftOverQuantities = new HashSet<>();
    for (T def : allDefintions) {
        if (roundSize.get(def) < def.numberOfLicenses()) {
            leftOverQuantities.add(def);
        }
    }
    if (leftOverQuantities.size() == 0) {
        hasNext = false;
        return;
    } else {
        hasNext = true;
        Set<Set<T>> definitionPowerset = Sets.powerSet(leftOverQuantities);
        List<Set<T>> sorted = new ArrayList<>(definitionPowerset);
        sorted.sort(getIncreasingSizeComparator());
        definitionPowersetIterator = sorted.iterator();
    }

}

        

public void testContainsAll() {
 ImmutableSortedSet<Integer> set = ContiguousSet.create(Range.closed(1, 3), integers());
 for (Set<Integer> subset : Sets.powerSet(ImmutableSet.of(1, 2, 3))) {
  assertTrue(set.containsAll(subset));
 }
 for (Set<Integer> subset : Sets.powerSet(ImmutableSet.of(1, 2, 3))) {
  assertFalse(set.containsAll(Sets.union(subset, ImmutableSet.of(9))));
 }
 assertFalse(set.containsAll((Collection<?>) ImmutableSet.of("blah")));
}

        

public void recompile() {
  TIntIntIterator it = disposalAction.shaderPrograms.iterator();
  while (it.hasNext()) {
    it.advance();
    GL20.glDeleteProgram(it.value());
  }
  disposalAction.shaderPrograms.clear();
  uniformLocationMap.clear();
  bindMap.clear();
  disposalAction.shaderPrograms.put(0, shader.linkShaderProgram(0));
  for (Set<ShaderProgramFeature> permutation : Sets.powerSet(shader.getAvailableFeatures())) {
    int featureMask = ShaderProgramFeature.getBitset(permutation);
    disposalAction.shaderPrograms.put(featureMask, shader.linkShaderProgram(featureMask));
  }
  //resolves #966
  //Some of the uniforms are not updated constantly between frames
  //this function will rebind any uniforms that are not bound
  rebindVariables(materialData);
}

        

private void registerAllShaderPermutations() {
  Set<Set<ShaderProgramFeature>> allPermutations = Sets.powerSet(availableFeatures);
  for (Set<ShaderProgramFeature> permutation : allPermutations) {
    int fragShaderId = compileShader(GL20.GL_FRAGMENT_SHADER, permutation);
    int vertShaderId = compileShader(GL20.GL_VERTEX_SHADER, permutation);
    if (compileSuccess(fragShaderId) && compileSuccess(vertShaderId)) {
      int featureHash = ShaderProgramFeature.getBitset(permutation);
      disposalAction.fragmentPrograms.put(featureHash, fragShaderId);
      disposalAction.vertexPrograms.put(featureHash, vertShaderId);
    } else {
      throw new RuntimeException(String.format("Shader '%s' failed to compile for features '%s'.%n%n"
              + "Vertex Shader Info: %n%s%n"
              + "Fragment Shader Info: %n%s",
          getUrn(), permutation,
          getLogInfo(vertShaderId), getLogInfo(fragShaderId)));
    }
  }
  logger.debug("Compiled {} permutations for {}.", allPermutations.size(), getUrn());
}

        

public List<Set<Expression>> enumerateGroupingSets()
{
  return ImmutableList.copyOf(Sets.powerSet(columns.stream()
      .map(QualifiedNameReference::new)
      .collect(toSet())));
}        
main