/*
 *        Permutations - Tim Tyler 2000.
 * 
 *         A generator of permutations.
 *
 * This code has been placed in the public domain.
 * This means that you can do what you like with it.
 * Please note that this code comes with no warranty.
 *
 */

/*
 * To Do:
 *
 */

   import java.lang.Object;

   public class Permutations extends Object {
      public static int size;
      public static int sizemo;
      public static int sizeo2;
      public static int max;
      public static int min;
      public static int debug = 0;
      public static int i, j;
      public static int ret_val;
      public static int temp;
      public static int[] data;
      public static int[] checklist;
      public static int position;
      public static int total_number;
      public static int iterations;
      public static int count;
   
      public static Executor executor;
   
      public static void permute(int n, Executor executor) {
         size = n;
         // total_number = n;
      
         data = new int[size];
      
         for (i = 0; i < size; i++) {
            data[i] = i;
         }
      
         executor.execute();
      
         iterations = factorial(size);
         for (count = 0; count < iterations - 1; count++) {
            getNext();
            executor.execute();
         }
      
         // System.out.println("\nFINISHED");
      }
   
   
      public static void getNext() {
         int i = size - 1;
      
         while (data[i-1] >= data[i]) 
            i = i-1;
      
         int j = size;
      
         while (data[j-1] <= data[i-1]) 
            j = j-1;
      
         swap(i-1, j-1);
      
         i++; 
         j = size;
      
         while (i < j) {
            swap(i-1, j-1);
            i++;
            j--;
         }
      }
   
   
      public static void swap(int a, int b) {
         temp = data[a];
         data[a] = data[b];
         data[b] = temp;
      }
   
   
      public static int factorial(int a) {
         temp = 1;
         if (a > 1) {
            for (i = 1; i <= a; i++) {
               temp *= i;
            }
         }
      
         return temp;
      }
   
   
      public static void main(String args[]) {
         executor = 
               new Executor() {
                  public void execute() {
                     int size = data.length;
                  
                     for (i = 0; i < size; i++) {
                        System.out.print("" + data[i] + " ");
                     }
                  
                     System.out.println("");
                  
                  }                         
               };
      
         total_number = 5;
      
         permute(total_number, executor);
      
         do {
         } while (true);
      
      }
   
   
   }
