package body Generator_Of_Static_Items is

    procedure Generate (Vector : out Vector_Type) is
        Temp : Item_Type;
        Local_Vector : Vector_Type (Vector'Range);
    begin
        for I in Vector'Range loop
            Assign (Local_Vector (I), Item_Type (I));
        end loop;
        for I in reverse Vector'Range loop
            if I mod 3 /= 0 then
                Assign (Temp, Local_Vector (Vector'First));
                Assign (Local_Vector (Vector'First), Local_Vector (I));
                Assign (Local_Vector (I), Temp);
            end if;
        end loop;
        Vector := Local_Vector;
    end Generate;

    procedure Generate2 (Vector : out Vector_Type) is
        Temp : Item_Type;
        Local_Vector : Vector_Type (Vector'Range);
    begin
        for I in Vector'Range loop
            Assign (Local_Vector (I), Item_Type (I + Vector'Last));
        end loop;
        for I in reverse Vector'Range loop
            if I mod 3 /= 0 then
                Assign (Temp, Local_Vector (Vector'First));
                Assign (Local_Vector (Vector'First), Local_Vector (I));
                Assign (Local_Vector (I), Temp);
            end if;
        end loop;
        Vector := Local_Vector;
    end Generate2;

    procedure Generate_Ascending (Vector : out Vector_Type) is
    begin
        for I in Vector'Range loop
            Assign (Vector (I), Item_Type (I));
        end loop;
    end Generate_Ascending;

    procedure Generate_Descending (Vector : out Vector_Type) is
    begin
        for I in Vector'Range loop
            Assign (Vector (I), Item_Type (Vector'Last - I + Vector'First));
        end loop;
    end Generate_Descending;

    procedure Assign (Dest : out Item_Type; Source : in Item_Type) is
    begin
        Dest := Source;
    end Assign;


    function Less (Left, Right : Item_Type) return Boolean is
    begin
        return Integer (Left) < Integer (Right);
    end Less;

end Generator_Of_Static_Items;