private static <T> PartitionList<T> eparition(PartitionListElement<T> tail2) {
		PartitionList<T> returner = new PartitionList<T>();
		for(int i = 1; i <= tail2.size(); i++){
			
			PartitionListItem<T> partition = OrderConstrainedPartitionList.partition(tail2, i);
			returner.add(partition);
			if(partition.size() > 1){
				PartitionListElement<T> head =  partition.get(0);
				PartitionListElement<T> tail = new PartitionListElement<T>();
				for(int j = 1; j < partition.size(); j++){
					for(T backend : partition.get(j))
						tail.add(backend);
				}
				
				//if(count-- > 0) System.out.println(count + "::" + "Head:" + head.toString() + " ; Tail: " + tail.toString());
				
				PartitionList<T> tail_results = eparition(tail);
				for(PartitionListItem<T> tails : tail_results){	
					PartitionListItem<T> merged = new PartitionListItem<T>();
					merged.add(head);
					for(PartitionListElement<T> mergeTail : tails){					
						
						merged.add(mergeTail);
						
					}
					returner.add(merged);
					//if(count-- > 0) System.out.println(count + ":: added" + merged.toString()); 
				}
				
				
			}
			//if(count-- > 0) System.out.println(count + "::" +partition.size() + " <-- Number of partitions -->" + partition.toString()); 
		}
		return returner;
	}