unit dualdigitsset;

{$mode objfpc}{$H+}

interface

uses
	SysUtils;

type
	TDigits = 0..9;
	TDigitSet = set of TDigits;

	{ TDualAZSet }

	TDualAZSet = class
		private
			FsetA, FsetZ: TDigitSet;
			function GetDiffAZAsText: string;
			function GetDiffZAAsText: string;
			function GetIntersectionAsText: string;
			function GetSetAasText: string;
			function GetSetZasText: string;
			function GetSymDiffAsText: string;
			function GetUnionAsText: string;
			function SetAsString(s: TDigitSet): string;
		public
			property DiffAZAsText: string read GetDiffAZAsText;
			property DiffZAAsText: string read GetDiffZAAsText;
			property IntersectionAsText: string read GetIntersectionAsText;
			property SetA: TDigitSet read FsetA write FsetA;
			property SetAasText: string read GetSetAasText;
			property SetZ: TDigitSet read FsetZ write FsetZ;
			property SetZasText: string read GetSetZasText;
			property SymDiffAsText: string read GetSymDiffAsText;
			property UnionAsText: string read GetUnionAsText;
	end;

implementation

{ TDualAZSet }

function TDualAZSet.GetDiffAZAsText: string;
begin
	Result := SetAsString(FsetA - FsetZ);
end;

function TDualAZSet.GetDiffZAAsText: string;
begin
	Result := SetAsString(FsetZ - FsetA);
end;

function TDualAZSet.GetIntersectionAsText: string;
begin
	Result := SetAsString(FsetA * FsetZ);
end;

function TDualAZSet.GetSetAasText: string;
begin
	Result := SetAsString(FsetA);
end;

function TDualAZSet.GetSetZasText: string;
begin
	Result := SetAsString(FsetZ);
end;

function TDualAZSet.GetSymDiffAsText: string;
begin
	Result := SetAsString(FsetA + FsetZ - FsetA * FsetZ);
end;

function TDualAZSet.GetUnionAsText: string;
begin
	Result := SetAsString(FsetA + FsetZ);
end;

function TDualAZSet.SetAsString(s: TDigitSet): string;
var d: TDigits;
begin
	Result := EmptyStr;
  for d in TDigitSet do
  	if (d in s) then
    begin
      if Length(Result) > 0
      	then AppendStr(Result, ',');

      AppendStr(Result, IntToStr(d));
		end;

  Result := Format('[%s]', [Result]);
end;

end.

