* @param p1
	 */
	public static <A> void eachSubSet(Set<A> set, final P1<Set<A>> p1) {
		if (Cols.isEmpty(set)) {
			return;
		}
		
		if (set.size() == 1) {
			return;
		}
		
		A a = getSingle(set);
//		System.out.println("a=" + a);
		// The a itself
		p1.e(asSet(a));
		
		HashSet<A> subset = subSetExcept(a, set);
		p1.e(subset);
		eachSubSet(subset, new P1<Set<A>>() {public void e(Set<A> subOfSub) {
//			System.out.println("set=" + set + ", subset=" + subset + ", subOfSub=" + subOfSub);
			// Not with a
			p1.e(subOfSub);
			
			// With a
			HashSet<A> newSub = new HashSet<A>(subOfSub);
			newSub.add(a);
			p1.e(newSub);
		}});
	}