with Unbounded_String;
package Lines is
    subtype Line is String;

    type Lines_Type is private;

    function Make return Lines_Type;

    function Is_Empty (Lines : Lines_Type) return Boolean;

    procedure Add (New_Line : Line; To : in out Lines_Type);

    type Line_Iterator is private;

    function Initialize (Lines : Lines_Type) return Line_Iterator;
    function Value (Iterator : Line_Iterator) return Line;
    procedure Next (Iterator : in out Line_Iterator);
    function Done (Iterator : Line_Iterator) return Boolean;

private
    package Ubs is new Unbounded_String;

    type Line_Rec;
    type Lines_Type is access Line_Rec;

    type Line_Rec is
        record
            A_Line : Ubs.Variable_String;
            Next : Lines_Type;
        end record;

    type Line_Iterator is new Lines_Type;
end Lines;
