Skip to content

Commit

Permalink
common cache class
Browse files Browse the repository at this point in the history
  • Loading branch information
carolhmj committed Oct 23, 2023
1 parent 21cb8de commit 4380004
Show file tree
Hide file tree
Showing 6 changed files with 40 additions and 43 deletions.
@@ -1,17 +1,16 @@
import type { FlowGraphDataConnection } from "../../flowGraphDataConnection";
import { FlowGraphBlock } from "../../flowGraphBlock";
import type { RichType } from "../../flowGraphRichTypes";
import type { FlowGraphContext } from "../../flowGraphContext";
import type { IFlowGraphBlockConfiguration } from "../../flowGraphBlock";
import { FlowGraphCachedOperationBlock } from "./flowGraphCachedOperationBlock";
/**
* @experimental
* The base block for all binary operation blocks. Receives an input of type
* LeftT, one of type RightT, and outputs a value of type ResultT.
*/
export class FlowGraphBinaryOperationBlock<LeftT, RightT, ResultT> extends FlowGraphBlock {
export class FlowGraphBinaryOperationBlock<LeftT, RightT, ResultT> extends FlowGraphCachedOperationBlock<ResultT> {
leftInput: FlowGraphDataConnection<LeftT>;
rightInput: FlowGraphDataConnection<RightT>;
output: FlowGraphDataConnection<ResultT>;

constructor(
leftRichType: RichType<LeftT>,
Expand All @@ -21,22 +20,13 @@ export class FlowGraphBinaryOperationBlock<LeftT, RightT, ResultT> extends FlowG
private _className: string,
config?: IFlowGraphBlockConfiguration
) {
super(config);
super(resultRichType, config);
this.leftInput = this._registerDataInput("leftInput", leftRichType);
this.rightInput = this._registerDataInput("rightInput", rightRichType);
this.output = this._registerDataOutput("Output", resultRichType);
}

public _updateOutputs(_context: FlowGraphContext): void {
// Search for a cached value
const cachedValue = _context._getExecutionVariable(this, "cachedValue" + _context.executionId);
if (cachedValue !== undefined) {
this.output.setValue(cachedValue, _context);
return;
}
const calculatedValue = this._operation(this.leftInput.getValue(_context), this.rightInput.getValue(_context));
_context._setExecutionVariable(this, "cachedValue" + _context.executionId, calculatedValue);
this.output.setValue(calculatedValue, _context);
public override _doOperation(context: FlowGraphContext): ResultT {
return this._operation(this.leftInput.getValue(context), this.rightInput.getValue(context));
}

public getClassName(): string {
Expand Down
@@ -1,8 +1,29 @@
import { FlowGraphBlock } from "core/FlowGraph/flowGraphBlock";
import { FlowGraphContext } from "core/FlowGraph/flowGraphContext";
import type { IFlowGraphBlockConfiguration } from "../../flowGraphBlock";
import { FlowGraphBlock } from "../../flowGraphBlock";
import type { FlowGraphContext } from "../../flowGraphContext";
import type { FlowGraphDataConnection } from "../../flowGraphDataConnection";
import type { RichType } from "../../flowGraphRichTypes";

const CACHE_NAME = "cachedValue";

export class FlowGraphCachedOperationBlock extends FlowGraphBlock {
public _updateOutputs(context: FlowGraphContext) {}
export abstract class FlowGraphCachedOperationBlock<OutputT> extends FlowGraphBlock {
public readonly output: FlowGraphDataConnection<OutputT>;

constructor(outputRichType: RichType<OutputT>, config?: IFlowGraphBlockConfiguration) {
super(config);

this.output = this._registerDataOutput("output", outputRichType);
}
public abstract _doOperation(context: FlowGraphContext): OutputT;

public _updateOutputs(context: FlowGraphContext) {
const cachedValue = context._getExecutionVariable(this, CACHE_NAME + context.executionId);
if (cachedValue !== undefined) {
this.output.setValue(cachedValue, context);
return;
}
const calculatedValue = this._doOperation(context);
context._setExecutionVariable(this, CACHE_NAME + context.executionId, calculatedValue);
this.output.setValue(calculatedValue, context);
}
}
@@ -1,22 +1,18 @@
import type { FlowGraphContext } from "../../flowGraphContext";
import { FlowGraphBlock } from "../../flowGraphBlock";
import type { FlowGraphDataConnection } from "../../flowGraphDataConnection";
import type { RichType } from "../../flowGraphRichTypes";
import type { IFlowGraphBlockConfiguration } from "../../flowGraphBlock";
import { FlowGraphCachedOperationBlock } from "./flowGraphCachedOperationBlock";
/**
* @experimental
* Block that outputs a value of type ResultT, resulting of an operation with no inputs.
*/
export class FlowGraphConstantOperationBlock<ResultT> extends FlowGraphBlock {
public output: FlowGraphDataConnection<ResultT>;

export class FlowGraphConstantOperationBlock<ResultT> extends FlowGraphCachedOperationBlock<ResultT> {
constructor(richType: RichType<ResultT>, private _operation: () => ResultT, private _className: string, config?: IFlowGraphBlockConfiguration) {
super(config);
this.output = this._registerDataOutput("output", richType);
super(richType, config);
}

public _updateOutputs(context: FlowGraphContext): void {
this.output.setValue(this._operation(), context);
public override _doOperation(_context: FlowGraphContext): ResultT {
return this._operation();
}

public getClassName(): string {
Expand Down
@@ -1,16 +1,15 @@
import type { FlowGraphDataConnection } from "../../flowGraphDataConnection";
import type { IFlowGraphBlockConfiguration } from "../../flowGraphBlock";
import { FlowGraphBlock } from "../../flowGraphBlock";
import type { RichType } from "../../flowGraphRichTypes";
import type { FlowGraphContext } from "../../flowGraphContext";
import { FlowGraphCachedOperationBlock } from "./flowGraphCachedOperationBlock";

/**
* @experimental
* The base block for all unary operation blocks. Receives an input of type InputT, and outputs a value of type ResultT.
*/
export class FlowGraphUnaryOperationBlock<InputT, ResultT> extends FlowGraphBlock {
export class FlowGraphUnaryOperationBlock<InputT, ResultT> extends FlowGraphCachedOperationBlock<ResultT> {
input: FlowGraphDataConnection<InputT>;
output: FlowGraphDataConnection<ResultT>;

constructor(
inputRichType: RichType<InputT>,
Expand All @@ -19,13 +18,11 @@ export class FlowGraphUnaryOperationBlock<InputT, ResultT> extends FlowGraphBloc
private _className: string,
config?: IFlowGraphBlockConfiguration
) {
super(config);
super(resultRichType, config);
this.input = this._registerDataInput("input", inputRichType);
this.output = this._registerDataOutput("resultOutput", resultRichType);
}

public _updateOutputs(_context: FlowGraphContext): void {
this.output.setValue(this._operation(this.input.getValue(_context)), _context);
public override _doOperation(context: FlowGraphContext): ResultT {
return this._operation(this.input.getValue(context));
}

public getClassName(): string {
Expand Down
5 changes: 0 additions & 5 deletions packages/dev/core/src/FlowGraph/flowGraphContext.ts
Expand Up @@ -96,11 +96,6 @@ export class FlowGraphContext {
* Incremented every for every block executed.
*/
private _executionId = 0;
/**
* @internal
* Corresponds to the currently executing block
*/
public _currentExecutionBlock: FlowGraphExecutionBlock;

constructor(params: IFlowGraphContextConfiguration) {
this._configuration = params;
Expand Down
2 changes: 0 additions & 2 deletions packages/dev/core/src/FlowGraph/flowGraphSignalConnection.ts
Expand Up @@ -23,8 +23,6 @@ export class FlowGraphSignalConnection extends FlowGraphConnection<FlowGraphExec
*/
public _activateSignal(context: FlowGraphContext): void {
if (this.connectionType === FlowGraphConnectionType.Input) {
// console.log("Executing block", this._ownerBlock.name, "with execution id", context.executionId);
context._currentExecutionBlock = this._ownerBlock;
this._ownerBlock._execute(context, this);
context._increaseExecutionId();
} else {
Expand Down

0 comments on commit 4380004

Please sign in to comment.