namespace LinkedList;

interface

uses
  System.Text;

type
  List<T> = public class
    where T is Object;
  private
    method AppendToString(aBuilder: StringBuilder);
  public
    constructor(aData: T);
    constructor(aData: T; aNext: List<T>);
    property Next: List<T>;
    property Data: T;

    method ToString: string; override;
  end;

implementation

constructor List<T>(aData: T);
begin
  Data := aData;
end;

constructor List<T>(aData: T; aNext: List<T>);
begin
  constructor(aData);
  Next := aNext;
end;

method List<T>.ToString: string;
begin
  with lBuilder := new StringBuilder do begin
    AppendToString(lBuilder);
    result := lBuilder.ToString();
  end;
end;

method List<T>.AppendToString(aBuilder: StringBuilder);
begin
  if assigned(Data) then
    aBuilder.Append(Data.ToString)
  else
    aBuilder.Append('nil');

  if assigned(Next) then begin
    aBuilder.Append(', ');
    Next.AppendToString(aBuilder);
  end;
end;

end.
