package body Lines is
    function Make return Lines_Type is
    begin
        return null;
    end Make;

    function Is_Empty (Lines : Lines_Type) return Boolean is
    begin
        return Lines = null;
    end Is_Empty;

    procedure Add (New_Line : Line; To : in out Lines_Type) is
    begin
        To := new Line_Rec'(Ubs.Value (New_Line), To);
    end Add;

    function Initialize (Lines : Lines_Type) return Line_Iterator is
        function Transpose (The_Fields : Lines_Type) return Lines_Type is
            Reverse_Fields : Lines_Type := Make;
            Field_Iterator : Lines_Type := The_Fields;
        begin
            while not (Field_Iterator = null) loop
                Add (Value (Line_Iterator (Field_Iterator)), Reverse_Fields);
                Field_Iterator := Field_Iterator.all.Next;
            end loop;

            return Reverse_Fields;
        end Transpose;
    begin
        if Lines /= null then
            return Line_Iterator (Transpose (Lines));
        else
            return null;
        end if;
    end Initialize;

    function Value (Iterator : Line_Iterator) return Line is
    begin
        return Ubs.Image (Iterator.A_Line);
    exception
        when others =>
            return "";
    end Value;

    procedure Next (Iterator : in out Line_Iterator) is
    begin
        Iterator := Line_Iterator (Iterator.all.Next);
    end Next;

    function Done (Iterator : Line_Iterator) return Boolean is
    begin
        return Iterator = null;
    end Done;
end Lines;