86 lines
1.8 KiB
ObjectPascal
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.
|