DataFlow refactoring

This commit is contained in:
Michael Schimmel
2025-07-23 20:14:24 +02:00
parent b623be13fa
commit 7b2446b220
6 changed files with 260 additions and 486 deletions
+26 -27
View File
@@ -22,7 +22,7 @@ type
end;
// Concrete data provider that manages a list of processors (listeners).
TMycContainedDataProvider<T> = class abstract(TContainedObject, TDataProvider<T>.IDataProvider)
TMycContainedDataProvider<T> = class abstract(TContainedObject, IDataProvider<T>)
private
FListeners: TMycNotifyList<IMycProcessor<T>>;
public
@@ -31,9 +31,9 @@ type
// Notifies all linked processors.
function Broadcast(const Value: T): TState;
// Link a Processor
function Link(const Processor: IMycProcessor<T>): TDataProvider<T>.TTag;
function Link(const Processor: IMycProcessor<T>): TTag;
// Unlink a linked strategy
procedure Unlink(Tag: TDataProvider<T>.TTag);
procedure Unlink(Tag: TTag);
end;
TMycSequence<T> = class(TMycProcessor<T>, IMycDataSequence<T>)
@@ -50,17 +50,17 @@ type
end;
// Null object implementation for IDataProvider.
TNullDataProvider<T> = class(TInterfacedObject, TDataProvider<T>.IDataProvider)
TNullDataProvider<T> = class(TInterfacedObject, IDataProvider<T>)
public
function Link(const Receiver: IMycProcessor<T>): TDataProvider<T>.TTag;
procedure Unlink(Tag: TDataProvider<T>.TTag);
function Link(const Receiver: IMycProcessor<T>): TTag;
procedure Unlink(Tag: TTag);
end;
// Abstract base class for components that process data of type S and provide data of type T.
TMycConverter<S, T> = class abstract(TMycProcessor<S>, TConverter<S, T>.IConverter)
TMycConverter<S, T> = class abstract(TMycProcessor<S>, IConverter<S, T>)
private
FSender: TMycContainedDataProvider<T>;
function GetSender: TDataProvider<T>.IDataProvider;
function GetSender: IDataProvider<T>;
protected
function ProcessData(const Value: S): TState; override; abstract;
// Broadcasts the given data to all linked processors.
@@ -68,13 +68,13 @@ type
public
constructor Create;
destructor Destroy; override;
property Sender: TDataProvider<T>.IDataProvider read GetSender;
property Sender: IDataProvider<T> read GetSender;
end;
// Null object implementation for IConverter.
TNullConverter<S, T> = class(TInterfacedObject, TConverter<S, T>.IConverter)
TNullConverter<S, T> = class(TInterfacedObject, IConverter<S, T>)
private
function GetSender: TDataProvider<T>.IDataProvider;
function GetSender: IDataProvider<T>;
public
function ProcessData(const Value: S): TState;
end;
@@ -174,8 +174,8 @@ type
end;
private
FProcessor: TMycContainedProcessor<T>;
FTag: TDataProvider<T>.TTag;
FDataProvider: TDataProvider<T>;
FTag: TTag;
FDataProvider: IDataProvider<T>;
FLookback: Int64;
FChanged: TFlag;
FLock: TLightweightMREW;
@@ -225,12 +225,12 @@ type
end;
// Endpoint that collects data into a series.
TMycDataJoin<T> = class(TInterfacedObject, TDataProvider<TArray<T>>.IDataProvider)
TMycDataJoin<T> = class(TInterfacedObject, IDataProvider<TArray<T>>)
private
FReceivers: array of record
DataProvider: TDataProvider<T>;
DataProvider: IDataProvider<T>;
Processor: TMycContainedProcessor<T>;
Tag: TDataProvider<T>.TTag;
Tag: TTag;
Queue: TQueue<T>;
end;
@@ -241,16 +241,16 @@ type
public
constructor Create(const ADataProviders: TArray<TDataProvider<T>>);
destructor Destroy; override;
property Sender: TMycContainedDataProvider<TArray<T>> read FSender implements TDataProvider<TArray<T>>.IDataProvider;
property Sender: TMycContainedDataProvider<TArray<T>> read FSender implements IDataProvider<TArray<T>>;
end;
TMycComposedConverter<S, T> = class(TMycProcessor<S>, TConverter<S, T>.IConverter)
TMycComposedConverter<S, T> = class(TMycProcessor<S>, IConverter<S, T>)
private
FProcessor: IMycProcessor<S>;
FDataProvider: TDataProvider<T>;
protected
function ProcessData(const Value: S): TState; override;
function GetSender: TDataProvider<T>.IDataProvider;
function GetSender: IDataProvider<T>;
public
constructor Create(const AProcessor: IMycProcessor<S>; const ADataProvider: TDataProvider<T>);
end;
@@ -314,7 +314,7 @@ begin
end;
end;
function TMycContainedDataProvider<T>.Link(const Processor: IMycProcessor<T>): TDataProvider<T>.TTag;
function TMycContainedDataProvider<T>.Link(const Processor: IMycProcessor<T>): TTag;
begin
// Add the Processor to the notification list
FListeners.Lock;
@@ -325,7 +325,7 @@ begin
end;
end;
procedure TMycContainedDataProvider<T>.Unlink(Tag: TDataProvider<T>.TTag);
procedure TMycContainedDataProvider<T>.Unlink(Tag: TTag);
begin
FListeners.Lock;
try
@@ -337,12 +337,12 @@ end;
{ TNullDataProvider<T> }
function TNullDataProvider<T>.Link(const Receiver: IMycProcessor<T>): TDataProvider<T>.TTag;
function TNullDataProvider<T>.Link(const Receiver: IMycProcessor<T>): TTag;
begin
Result := nil;
end;
procedure TNullDataProvider<T>.Unlink(Tag: TDataProvider<T>.TTag);
procedure TNullDataProvider<T>.Unlink(Tag: TTag);
begin
// Do nothing in the null implementation.
end;
@@ -366,14 +366,14 @@ begin
Result := FSender.Broadcast(Value);
end;
function TMycConverter<S, T>.GetSender: TDataProvider<T>.IDataProvider;
function TMycConverter<S, T>.GetSender: IDataProvider<T>;
begin
Result := FSender;
end;
{ TNullConverter<S, T> }
function TNullConverter<S, T>.GetSender: TDataProvider<T>.IDataProvider;
function TNullConverter<S, T>.GetSender: IDataProvider<T>;
begin
Result := TDataProvider<T>.Null;
end;
@@ -499,7 +499,6 @@ begin
FProcessor := TMycContainedProcessor<T>.Create(Self, ProcessData);
FTag := FDataProvider.Link(FProcessor);
end;
destructor TMycDataEndpoint<T>.Destroy;
@@ -930,7 +929,7 @@ begin
FDataProvider := ADataProvider;
end;
function TMycComposedConverter<S, T>.GetSender: TDataProvider<T>.IDataProvider;
function TMycComposedConverter<S, T>.GetSender: IDataProvider<T>;
begin
Result := FDataProvider;
end;