-- Inputs 2 numbers in range 0 .. 999 and prints whether they are reverse of each other
-- Demonstrates declaring and calling functions
-- Functions are equivalent to  methods with a non-void return type (eg int sqrt(int i))
-- Functions are used as values!

with ada.text_io; use ada.text_io; 
with ada.integer_text_io; use ada.integer_text_io; 
procedure func1  is 
    subtype Digit is Natural range 0 .. 9;
    subtype Small_Nat is Natural range 0 .. 999;

    -- Functions and procedures are declared and defined in the declaration section
    function ones_dig(n: Small_Nat) return Digit is
    begin
        return n mod 10;
    end ones_dig;

    function tens_dig(n: Small_Nat) return Digit is
        temp: constant Small_Nat range 0 .. 99 := n / 10;
    begin
        return temp mod 10;
    end tens_dig;

    function hundreds_dig(n: Small_Nat) return Digit is
        temp: constant Small_Nat := n / 100;
    begin
        return temp;
    end hundreds_dig;

    function eq_rev(n1, n2: Small_Nat) return Boolean is
        eq1, eq10, eq100: Boolean;
    begin
        eq1 := ones_dig(n1) = hundreds_dig(n2);
        eq10 := tens_dig(n1) = tens_dig(n2);
        eq100 := hundreds_dig(n1) = ones_dig(n2);
        
        return eq1 and eq10 and eq100;
    end eq_rev;

    s1, s2: Small_Nat;
begin
    get(s1);
    get(s2);

    if eq_rev(s1, s2) then  -- How could you improve this if?
        put_line(s1'img & " and " & s2'img & " are THE SAME in reverse");
    else
        put_line(s1'img & " and " & s2'img & " are DIFFERENT in reverse");
    end if;

exception
    when constraint_error => put_line("Value out of range");
    when others => put_line("Error occurred");
end func1;

-- Input: 123 321
-- Output: 123 and  321 are THE SAME in reverse
  
-- Input: 123 123
-- Output: 123 and  123 are DIFFERENT in reverse