Files
MycLib/Src/Myc.Lazy.pas
T
Michael Schimmel 6bed68748d Code formatting
2025-06-05 10:26:28 +02:00

82 lines
1.8 KiB
ObjectPascal

unit Myc.Lazy;
interface
uses
System.SysUtils,
Myc.Signals;
type
IMycLazy<T> = interface
{$REGION 'property access'}
function GetChanged: IMycState;
{$ENDREGION}
function Pop(out Res: T): Boolean;
property Changed: IMycState read GetChanged;
end;
TLazy<T> = record
private
FLazy: IMycLazy<T>;
function GetChanged: IMycState; inline;
class var
FNull: IMycLazy<T>;
class constructor CreateClass;
public
constructor Create(const ALazy: IMycLazy<T>);
class function Construct(const Changing: IMycState; const Proc: TFunc<T>): IMycLazy<T>; static;
class operator Implicit(const A: IMycLazy<T>): TLazy<T>; overload;
class operator Implicit(const A: TLazy<T>): IMycLazy<T>; overload;
function Pop(out Res: T): Boolean; inline;
property Changed: IMycState read GetChanged;
end;
implementation
uses
Myc.Core.Lazy;
constructor TLazy<T>.Create(const ALazy: IMycLazy<T>);
begin
FLazy := ALazy;
if not Assigned(FLazy) then
FLazy := FNull;
end;
class function TLazy<T>.Construct(const Changing: IMycState; const Proc: TFunc<T>): IMycLazy<T>;
begin
Result := TMycFuncLazy<T>.Create(Changing, Proc);
end;
class constructor TLazy<T>.CreateClass;
begin
FNull := TMycNullLazy<T>.Create;
end;
function TLazy<T>.GetChanged: IMycState;
begin
Result := FLazy.Changed;
end;
function TLazy<T>.Pop(out Res: T): Boolean;
begin
Result := FLazy.Pop(Res);
end;
class operator TLazy<T>.Implicit(const A: IMycLazy<T>): TLazy<T>;
begin
Result.Create(A);
end;
class operator TLazy<T>.Implicit(const A: TLazy<T>): IMycLazy<T>;
begin
Result := A.FLazy;
end;
end.