with TEXT_IO; USE TEXT_IO;
	--
	-- This program has many powerful features of Ada: generics,
	-- packages, procedures, private data types, attributes, 
	-- enumeration types, and overloading in addition to: integers,
	-- floating point, strings, conatenation and multiple argument IO
	--
procedure NESTED_GENERICS is
   type MISSION is (BUILD_BRIDGE, LAUNCH_SHIP, SATELLITE, TEST_SYSTEM);
   I1,I2,I3 : INTEGER;
   F1,F2,F3 : FLOAT;
   M1,M2,M3 : MISSION;

   generic
      type ITEM is private;
   procedure EXCHANGE(I1,I2:in out ITEM);

   generic
      type THING is private;
   procedure SWITCH(A,B,C: in out THING);

   procedure EXCHANGE(I1,I2:in out ITEM) is
	T:ITEM;
   begin
	T:=I1;I1:=I2;I2:=T;
   end;

   procedure SWITCH(A,B,C: in out THING) is
        procedure SWAP is new EXCHANGE(THING);
   begin
     SWAP(A,B);
     SWAP(A,C);
   end SWITCH;

package INT_IO is new INTEGER_IO(INTEGER);
use INT_IO;

package FLO_IO is new FLOAT_IO(FLOAT);	
use FLO_IO;		

package MISSION_IO is new ENUMERATION_IO(MISSION);
use MISSION_IO;

   procedure CHANGE_EM is new SWITCH(INTEGER);	-- integer swapper
   procedure CHANGE_EM is new SWITCH(FLOAT);	-- float swapper
   procedure CHANGE_EM is new SWITCH(MISSION);	-- mission swapper

begin
   I1:=1;I2:=2;I3:=3;
   PUT(I1,10);PUT(I2,10);PUT(I3,10);NEW_LINE;
   CHANGE_EM(I1,I2,I3);				-- try with integers
   PUT(I1,10);PUT(I2,10);PUT(I3,10);NEW_line;

   F1:=1.5;F2:=2.5;F3:=3.5;
   PUT(F1,10);PUT(F2,10);PUT(F3,10);NEW_LINE;
   CHANGE_EM(F1,F2,F3);				-- floats
   PUT(F1,10);PUT(F2,10);PUT(F3,10);NEW_LINE;

   M1:=BUILD_BRIDGE;M2:=LAUNCH_SHIP;M3:=SATELLITE;
   PUT_LINE(MISSION'IMAGE(M1)&"  "&MISSION'IMAGE(M2)&"  "&MISSION'IMAGE(M3));
   CHANGE_EM(M1,M2,M3);				-- and missions
   PUT_LINE(MISSION'IMAGE(M1)&"  "&MISSION'IMAGE(M2)&"  "&MISSION'IMAGE(M3));
end NESTED_GENERICS ;
  