generic
   type Component is private;
   type List_Index is range <>;
   type List is array (List_Index range <>) of Component;
   Default_Value : Component;
 --  with function "=" (Left, Right : List) return Boolean is <>;

package Equal8_Pkg is

   pragma Pure;

   Maximum_Length : constant List_Index := List_Index'Last;

   subtype Natural_Index is List_Index'Base range 0 .. Maximum_Length;
   type Sequence (Capacity : Natural_Index) is private;
   --  from zero to Capacity.

   function Value (This : Sequence) return List;
   --  Returns the content of this sequence. The value returned is the
   --  "logical" value in that only that slice which is currently assigned
   --  is returned, as opposed to the entire physical representation.

   overriding
   function "=" (Left, Right : Sequence) return Boolean with
     Inline;

   function "=" (Left : Sequence;  Right : List) return Boolean with
     Inline;

private
   type Sequence (Capacity : Natural_Index) is record
      Current_Length : Natural_Index := 0;
      Content        : List (1 .. Capacity) := (others => Default_Value);
   end record;

   -----------
   -- Value --
   -----------

   function Value (This : Sequence) return List is
     (This.Content (1 .. This.Current_Length));

   ---------
   -- "=" --
   ---------

   overriding
   function "=" (Left, Right : Sequence) return Boolean is
     (Value (Left) = Value (Right));

   ---------
   -- "=" --
   ---------

   function "=" (Left : Sequence;  Right : List) return Boolean is
     (Value (Left) = Right);
end Equal8_Pkg;