--=====================================================================
pragma Page;

package body Set_Package is

    function "*" (Set_1 : Set; Set_2 : Set) return Set is
        -- intersection
    begin
        return (Set_1 and Set_2);
    end "*";
    -------------------------------------------------------------------------


    function "+" (Element : Universe; Set_1 : Set) return Set is
        Value_Set : Set := Set_1;
    begin
        Value_Set (Element) := True;
        return Value_Set;
    end "+";
    -------------------------------------------------------------------------

    function "+" (Set_1 : Set; Set_2 : Set) return Set is
    begin
        return (Set_1 or Set_2);
    end "+";

    -------------------------------------------------------------------------
    function "+" (Set_1 : Set; Element : Universe) return Set is
        Value_Set : Set := Set_1;

    begin
        Value_Set (Element) := True;
        return Value_Set;
    end "+";

    -------------------------------------------------------------------------
    function "-" (Set_1 : Set; Set_2 : Set) return Set is
    begin
        return (Set_1 and (not Set_2));
    end "-";
    -------------------------------------------------------------------------

    function "-" (Set_1 : Set; Element : Universe) return Set is
        Value_Set : Set := Set_1;

    begin
        Value_Set (Element) := False;
        return Value_Set;
    end "-";
    -------------------------------------------------------------------------

    function "<=" (Set_1 : Set; Set_2 : Set) return Boolean is
        Value_Set : Set := (Set_1 and Set_2);
    begin
        return (Value_Set = Set_1);
    end "<=";
    -------------------------------------------------------------------------

    function "<" (Set_1 : Set; Set_2 : Set) return Boolean is
        Value_Set : Set := (Set_1 and Set_2);
    begin
        return ((Value_Set = Set_1) and (Value_Set /= Set_2));
    end "<";
    -------------------------------------------------------------------------

    function Is_A_Member (Element : Universe; Of_Set : Set) return Boolean is
    begin
        return Of_Set (Element);
    end Is_A_Member;
    -------------------------------------------------------------------------

    function Is_Empty (Set_1 : Set) return Boolean is

    begin
        return (Set_1 = Null_Set);
    end Is_Empty;
    -------------------------------------------------------------------------

    function Number_In (Set_1 : Set) return Number is

        Count : Integer := 0;

    begin
        for Index in Universe loop
            if Set_1 (Index) then
                Count := Count + 1;
            end if;
        end loop;

        return Count;
    end Number_In;
end Set_Package;