--Password
package Password_Manager is

   type Login_T is (Email, Banking, Amazon, Streaming);
   type Password_T is record
      Count    : Natural;
      Password : access String;
   end record;

   type Modifiable_T is access all Password_T;
   type Viewable_T is access constant Password_T;

   function Update (Login : Login_T) return Modifiable_T;
   function View (Login : Login_T) return Viewable_T;

end Password_Manager;

package body Password_Manager is

   Passwords : array (Login_T) of aliased Password_T;

   function Update (Login : Login_T) return Modifiable_T is
      (Passwords (Login)'Access);
   function View (Login : Login_T) return Viewable_T is
      (Passwords (Login)'Access);

end Password_Manager;
--Password

--Main
with Ada.Text_IO;      use Ada.Text_IO;
with Password_Manager; use Password_Manager;
procedure Main is

   procedure Update (Which : Password_Manager.Login_T;
                     Pw    : String;
                     Count : Natural) is
   begin
      Update (Which).Password := new String'(Pw);
      Update (Which).Count    := Count;
   end Update;

begin
   Update (Email, "QWE!@#", 1);
   Update (Banking, "asd123", 22);
   Update (Amazon, "098poi", 333);
   Update (Streaming, ")(*LKJ", 444);

   for Login in Login_T'Range loop
      Put_Line
        (Login'Image & " => " & View (Login).Password.all &
         View (Login).Count'Image);
   end loop;
end Main;
--Main
