Files
MycLib/Src/Myc.Lazy.pas
T
Michael Schimmel 556690fa5e Refactoring
2025-06-03 18:20:02 +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.