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

86 lines
1.8 KiB
ObjectPascal

unit Myc.Core.Lazy;
interface
uses
System.SysUtils,
Myc.Signals,
Myc.Lazy;
type
TMycLazy<T> = class abstract(TInterfacedObject, IMycLazy<T>)
protected
function GetChanged: IMycState; virtual; abstract;
public
function Pop(out Res: T): Boolean; virtual; abstract;
end;
TMycNullLazy<T> = class(TMycLazy<T>)
protected
function GetChanged: IMycState; override;
public
function Pop(out Res: T): Boolean; override;
end;
TMycFuncLazy<T> = class(TMycLazy<T>)
private
FChanged: IMycDirty;
FChangeState: TState.TSubscription;
FProc: TFunc<T>;
protected
function GetChanged: IMycState; override;
public
constructor Create(const AChanged: TState; const AProc: TFunc<T>);
destructor Destroy; override;
function Pop(out Res: T): Boolean; override;
end;
implementation
{ TMycNullLazy<T> }
function TMycNullLazy<T>.GetChanged: IMycState;
begin
Result := TState.Null;
end;
function TMycNullLazy<T>.Pop(out Res: T): Boolean;
begin
Res := Default(T);
Result := true;
end;
{ TMycFuncLazy<T> }
constructor TMycFuncLazy<T>.Create(const AChanged: TState; const AProc: TFunc<T>);
begin
inherited Create;
FChanged := TDirty.Construct;
FProc := AProc;
FChangeState := AChanged.Subscribe(FChanged);
end;
destructor TMycFuncLazy<T>.Destroy;
begin
FChangeState.Unsubscribe;
inherited;
end;
function TMycFuncLazy<T>.GetChanged: IMycState;
begin
Result := FChanged.State;
end;
function TMycFuncLazy<T>.Pop(out Res: T): Boolean;
begin
Result := FChanged.State.IsSet;
if Result then
begin
if Assigned(FProc) then
Res := FProc;
FChanged.Reset;
end;
end;
end.