generic
	type Item is private;
package Stacks is

	type Stack( Capacity: Positive ) is limited private;

	function Size( S: Stack ) return Natural;

	procedure Empty( S: in out Stack );

	procedure Push( S: in out Stack; I: in Item );
	-- PRE:  Size(S) < S.Capacity
	-- POST: Size(S) > 0 and Top(S) = I

	procedure Pop( S: in out Stack );
	-- PRE:  Size(S) > 0
	-- POST: Size(S) < S.Capacity

	function Top( S: Stack ) return Item;
	-- PRE:  Size(S) > 0

private

	type Item_Array is array( Positive range <> ) of Item;

	type Stack( Capacity: Positive ) is record
		Size: Natural := 0;
		Data: Item_Array(1..Capacity);
		end record;

end Stacks;