program compproblem;

{$mode delphi}{$H+}
{$ModeSwitch functionreferences}
{$ModeSwitch anonymousfunctions}

type

  TPubSubDataConversion<T, S> = reference to function(const AData: T): S;

  IPubSubDataChannel<T> = interface
  ['{6C3DDC7D-A867-4DAE-8B92-D74C8F878E3F}']
  end;

  { TMsg1 }

  TMsg1 = record
  private
   f: string;
  public
    constructor Create(const a: String);
  end;

  { TMsg2 }

  TMsg2 = record
  private
   f: string;
  public
    constructor Create(const a: String);
  end;

  IPubSubDataChannel_Msg1 = IPubSubDataChannel<TMsg1>;

  IPubSubDataChannel_Msg2 = IPubSubDataChannel<TMsg2>;

  { TPubSub }

  TPubSub = class
  public
    procedure NewDataBridge<T, S>(
      const AInChannel: IPubSubDataChannel<T>;
      const AOutChannel: IPubSubDataChannel<S>;
      AConversion: TPubSubDataConversion<T, S>);
  end;


  { TTest }

  TTest = class
  private
    fPubSub: TPubSub;
    fCH1: IPubSubDataChannel_Msg1;
    fCH2: IPubSubDataChannel_Msg2;
  public
    constructor Create;
    destructor Destroy; override;
    procedure Reg;
  end;

{ TMsg1 }

constructor TMsg1.Create(const a: String);
begin
  f := a;
end;

{ TMsg2 }

constructor TMsg2.Create(const a: String);
begin
  f := a;
end;


{ TTest }

constructor TTest.Create;
begin
  fPubSub := TPubSub.Create;
end;

destructor TTest.Destroy;
begin
  fPubSub.Free;
  inherited Destroy;
end;

procedure TTest.Reg;
begin
  fPubSub.NewDataBridge<TMsg1, TMsg2>(
    fCH1,
    fCH2,
    function (const x: TMsg1): TMsg2
    begin
      Result := TMsg2.Create(x.f);
    end);
end;

{ TPubSub }

procedure TPubSub.NewDataBridge<T, S>(const AInChannel: IPubSubDataChannel<T>; const AOutChannel: IPubSubDataChannel<S
  >; AConversion: TPubSubDataConversion<T, S>);
begin

end;

begin
end.

