-- Demonstrates creating and calling a generic array sort
with ada.text_io; use ada.text_io; 
with ada.float_text_io; use ada.float_text_io; 
 
with Ada.Containers.Generic_Array_Sort;
procedure generic_sort2  is 
   type Person is record
      ID: Natural;
      age: Natural;
   end record;

   type Person_Array is array(Natural range <>) of Person;
   procedure put_line(a: Person_Array) is
   begin
      for p of a loop
         put(p.ID'img & p.age'img & ", ");
      end loop;
      new_line;
   end put_line;

   function id_less(left, right: Person) return Boolean is
      (left.id < right.id);

   procedure sort is new 
      Ada.Containers.Generic_Array_Sort(Natural, Person, Person_Array, id_less);
      -- Uses default version of < for strings

   function younger(left, right: Person) return Boolean is
      (left.age < right.age);

   procedure young_sort is new Ada.Containers.Generic_Array_Sort(
      Index_Type => Natural, 
      Element_Type => Person, 
      Array_Type => Person_Array,
      "<" => younger);

   people : Person_Array(1 .. 4) := ((30, 10), (40, 5), (20, 15), (25, 99));
begin
   put_line(people);
   sort(people);
   put_line(people);

   young_sort(people);
   put_line(people);
end generic_sort2;
-- Output