generic

    Max : in Positive := 100;             -- MAX NUMBER OF ELEMENTS

    type Element_Type is private; -- TYPE OF SEQUENCE ELEMENTS

package X0seq is



    type Sequence is limited private;

    --NO_ELEMENT: EXCEPTION;



    --START AT BEGINNING OF SEQUENCE

    procedure Reset (S : in out Sequence);



    --READ NEXT MEMBER INTO C

    procedure Get_Next (S : in out Sequence; C : out Element_Type);



    --TRUNCATE DATA AFTER POINTER AND WRITE NEXT MEMBER OF S FROM C

    procedure Put_Next (S : in out Sequence; C : in Element_Type);



    --READ CURRENT MEMBER INTO C (REREAD)

    procedure Get_Current (S : in Sequence; C : out Element_Type);



    --WRITE CURRENT MEMBER OF S FROM C (UPDATE)

    procedure Put_Current (S : in out Sequence; C : in Element_Type);



    --READ CURRENT MEMBER INTO C AND DELETE CURRENT MEMBER

    procedure Get_Mid (S : in out Sequence; C : out Element_Type);



    --INSERT MEMBER FROM C BEFORE CURRENT MEMBER

    procedure Put_Mid (S : in out Sequence; C : in Element_Type);



    --TRUNCATE SEQUENCE AFTER POINTER

    procedure Make_Empty_To_End (S : in out Sequence);



    --TEST FOR NO MEMBERS AFTER POINTER

    function Is_Empty_To_End (S : in Sequence) return Boolean;



    --TEST FOR MEMBERS AFTER POINTER

    function Is_Not_Empty_To_End (S : in Sequence) return Boolean;



    --COPY ONE SEQUENCE TO ANOTHER SEQUENCE

    procedure Assign (Sin : in Sequence; Sout : out Sequence);



private

    --SEQUENCE IS IMPLEMENTED AS A LINKED LIST OF TYPE SDATA_TYPE

    type Sdata_Type;



    type Link is access Sdata_Type;



    type Sdata_Type is

        record

            Sdata : Element_Type;

            Next, Previous : Link;

        end record;



    type Sequence is

        record

            Head, Tail, Before, After : Link := null;

        end record;



end X0seq;

