diff --git a/ASTPlayground/ASTPlayground.delphilsp.json b/ASTPlayground/ASTPlayground.delphilsp.json
index 771498a..76af80f 100644
--- a/ASTPlayground/ASTPlayground.delphilsp.json
+++ b/ASTPlayground/ASTPlayground.delphilsp.json
@@ -1 +1 @@
-{ "settings": { "project": "file:///T%3A/Myc/ASTPlayground/ASTPlayground.dpr", "dllname": "dcc64370.dll", "dccOptions": "-$O- -$W+ --inline:off -$R+ -$Q+ --no-config -Q -TX.exe -AGenerics.Collections=System.Generics.Collections;Generics.Defaults=System.Generics.Defaults;WinTypes=Winapi.Windows;WinProcs=Winapi.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE -DDEBUG;;FRAMEWORK_FMX -E.\\Win64\\Debug -I\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\debug\\DE\";\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\debug\";\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\release\\DE\";T:\\Myc\\Src\\Data;T:\\Myc\\Src\\AST;T:\\Myc\\Src;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\release\";C:\\Users\\Brummel\\Documents\\Embarcadero\\Studio\\37.0\\Imports\\Win64;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\Imports\";C:\\Users\\Public\\Documents\\Embarcadero\\Studio\\37.0\\Dcp\\Win64;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\include\";S:\\sc_famos_src\\svn_vcl\\Virtual-TreeView\\Source;S:\\sc_famos_src\\svn_vcl\\cpxedits;S:\\sc_famos_src\\svn_vcl\\dzChart;S:\\sc_famos_src\\svn_vcl\\eaeditor;S:\\sc_famos_src\\svn_vcl\\FamosEvents;S:\\sc_famos_src\\svn_vcl\\HTML_Viewer\\source;S:\\sc_famos_src\\svn_vcl\\Myc_ChartEdit;S:\\sc_famos_src\\svn_vcl\\Myc_HemiDrag;S:\\sc_famos_src\\svn_vcl\\Myc_SplitControl;S:\\sc_famos_src\\svn_vcl\\plotter;S:\\sc_famos_src\\svn_vcl\\SimpleIPC;S:\\sc_famos_src\\svn_vcl\\SynEdit-master\\Source;S:\\sc_famos_src\\svn_vcl\\ValEdits;S:\\sc_famos_src\\svn_vcl\\ZipMaster;S:\\sc_famos_src\\svn_common\\Myc_VecMath;\"C:\\Program Files (x86)\\DevExpress VCL\\Library\\RS28\\Win64\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressCore Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressCommon Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressGDI+ Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressLibrary\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\XP Theme Manager\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressLayout Control\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressPageControl\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressEditors Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressDocking Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressBars\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressOfficeCore Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressMemData\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressDataController\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressNavBar\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressSkins Library\\Sources\";S:\\3rdParty\\FastMM5;C:\\Users\\Brummel\\AppData\\Local\\Programs\\TestInsight\\Source;T:\\Myc\\Src;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\source\\DUnitX\" -LEC:\\Users\\Public\\Documents\\Embarcadero\\Studio\\37.0\\Bpl\\Win64 -LNC:\\Users\\Public\\Documents\\Embarcadero\\Studio\\37.0\\Dcp\\Win64 -NU.\\Win64\\Debug -NSWinapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;System;Xml;Data;Datasnap;Web;Soap; -OT:\\Myc\\Src\\Data;T:\\Myc\\Src\\AST;T:\\Myc\\Src;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\release\";C:\\Users\\Brummel\\Documents\\Embarcadero\\Studio\\37.0\\Imports\\Win64;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\Imports\";C:\\Users\\Public\\Documents\\Embarcadero\\Studio\\37.0\\Dcp\\Win64;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\include\";S:\\sc_famos_src\\svn_vcl\\Virtual-TreeView\\Source;S:\\sc_famos_src\\svn_vcl\\cpxedits;S:\\sc_famos_src\\svn_vcl\\dzChart;S:\\sc_famos_src\\svn_vcl\\eaeditor;S:\\sc_famos_src\\svn_vcl\\FamosEvents;S:\\sc_famos_src\\svn_vcl\\HTML_Viewer\\source;S:\\sc_famos_src\\svn_vcl\\Myc_ChartEdit;S:\\sc_famos_src\\svn_vcl\\Myc_HemiDrag;S:\\sc_famos_src\\svn_vcl\\Myc_SplitControl;S:\\sc_famos_src\\svn_vcl\\plotter;S:\\sc_famos_src\\svn_vcl\\SimpleIPC;S:\\sc_famos_src\\svn_vcl\\SynEdit-master\\Source;S:\\sc_famos_src\\svn_vcl\\ValEdits;S:\\sc_famos_src\\svn_vcl\\ZipMaster;S:\\sc_famos_src\\svn_common\\Myc_VecMath;\"C:\\Program Files (x86)\\DevExpress VCL\\Library\\RS28\\Win64\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressCore Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressCommon Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressGDI+ Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressLibrary\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\XP Theme Manager\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressLayout Control\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressPageControl\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressEditors Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressDocking Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressBars\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressOfficeCore Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressMemData\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressDataController\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressNavBar\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressSkins Library\\Sources\";S:\\3rdParty\\FastMM5;C:\\Users\\Brummel\\AppData\\Local\\Programs\\TestInsight\\Source;T:\\Myc\\Src;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\source\\DUnitX\" -R\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\release\\DE\";T:\\Myc\\Src\\Data;T:\\Myc\\Src\\AST;T:\\Myc\\Src;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\release\";C:\\Users\\Brummel\\Documents\\Embarcadero\\Studio\\37.0\\Imports\\Win64;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\Imports\";C:\\Users\\Public\\Documents\\Embarcadero\\Studio\\37.0\\Dcp\\Win64;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\include\";S:\\sc_famos_src\\svn_vcl\\Virtual-TreeView\\Source;S:\\sc_famos_src\\svn_vcl\\cpxedits;S:\\sc_famos_src\\svn_vcl\\dzChart;S:\\sc_famos_src\\svn_vcl\\eaeditor;S:\\sc_famos_src\\svn_vcl\\FamosEvents;S:\\sc_famos_src\\svn_vcl\\HTML_Viewer\\source;S:\\sc_famos_src\\svn_vcl\\Myc_ChartEdit;S:\\sc_famos_src\\svn_vcl\\Myc_HemiDrag;S:\\sc_famos_src\\svn_vcl\\Myc_SplitControl;S:\\sc_famos_src\\svn_vcl\\plotter;S:\\sc_famos_src\\svn_vcl\\SimpleIPC;S:\\sc_famos_src\\svn_vcl\\SynEdit-master\\Source;S:\\sc_famos_src\\svn_vcl\\ValEdits;S:\\sc_famos_src\\svn_vcl\\ZipMaster;S:\\sc_famos_src\\svn_common\\Myc_VecMath;\"C:\\Program Files (x86)\\DevExpress VCL\\Library\\RS28\\Win64\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressCore Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressCommon Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressGDI+ Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressLibrary\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\XP Theme Manager\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressLayout Control\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressPageControl\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressEditors Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressDocking Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressBars\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressOfficeCore Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressMemData\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressDataController\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressNavBar\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressSkins Library\\Sources\";S:\\3rdParty\\FastMM5;C:\\Users\\Brummel\\AppData\\Local\\Programs\\TestInsight\\Source;T:\\Myc\\Src;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\source\\DUnitX\" -U\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\debug\\DE\";\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\debug\";\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\release\\DE\";T:\\Myc\\Src\\Data;T:\\Myc\\Src\\AST;T:\\Myc\\Src;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\release\";C:\\Users\\Brummel\\Documents\\Embarcadero\\Studio\\37.0\\Imports\\Win64;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\Imports\";C:\\Users\\Public\\Documents\\Embarcadero\\Studio\\37.0\\Dcp\\Win64;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\include\";S:\\sc_famos_src\\svn_vcl\\Virtual-TreeView\\Source;S:\\sc_famos_src\\svn_vcl\\cpxedits;S:\\sc_famos_src\\svn_vcl\\dzChart;S:\\sc_famos_src\\svn_vcl\\eaeditor;S:\\sc_famos_src\\svn_vcl\\FamosEvents;S:\\sc_famos_src\\svn_vcl\\HTML_Viewer\\source;S:\\sc_famos_src\\svn_vcl\\Myc_ChartEdit;S:\\sc_famos_src\\svn_vcl\\Myc_HemiDrag;S:\\sc_famos_src\\svn_vcl\\Myc_SplitControl;S:\\sc_famos_src\\svn_vcl\\plotter;S:\\sc_famos_src\\svn_vcl\\SimpleIPC;S:\\sc_famos_src\\svn_vcl\\SynEdit-master\\Source;S:\\sc_famos_src\\svn_vcl\\ValEdits;S:\\sc_famos_src\\svn_vcl\\ZipMaster;S:\\sc_famos_src\\svn_common\\Myc_VecMath;\"C:\\Program Files (x86)\\DevExpress VCL\\Library\\RS28\\Win64\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressCore Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressCommon Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressGDI+ Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressLibrary\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\XP Theme Manager\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressLayout Control\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressPageControl\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressEditors Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressDocking Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressBars\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressOfficeCore Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressMemData\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressDataController\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressNavBar\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressSkins Library\\Sources\";S:\\3rdParty\\FastMM5;C:\\Users\\Brummel\\AppData\\Local\\Programs\\TestInsight\\Source;T:\\Myc\\Src;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\source\\DUnitX\" -V -VN -VR -NBC:\\Users\\Public\\Documents\\Embarcadero\\Studio\\37.0\\Dcp\\Win64 -NHC:\\Users\\Public\\Documents\\Embarcadero\\Studio\\37.0\\hpp\\Win64 -NO.\\Win64\\Debug -LU" , "projectFiles":[ { "name": "MainForm", "file": "file:///T%3A/Myc/ASTPlayground/MainForm.pas" }, { "name": "Myc.Ast.Nodes", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Nodes.pas" }, { "name": "Myc.Ast.Scope", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Scope.pas" }, { "name": "Myc.Data.Value", "file": "file:///T%3A/Myc/ASTPlayground/Myc.Data.Value.pas" }, { "name": "Myc.Ast.Visitor", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Visitor.pas" }, { "name": "Myc.Ast.RTL", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.RTL.pas" }, { "name": "Myc.Ast.Dumper", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Dumper.pas" }, { "name": "Myc.Ast.RTL.Core", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.RTL.Core.pas" }, { "name": "Myc.Utils", "file": "file:///T%3A/Myc/Src/Myc.Utils.pas" }, { "name": "Myc.Ast.Script", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Script.pas" }, { "name": "Myc.Ast.Types", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Types.pas" }, { "name": "Myc.Data.Keyword", "file": "file:///T%3A/Myc/Src/Data/Myc.Data.Keyword.pas" }, { "name": "Myc.Ast.Compiler.TCO", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Compiler.TCO.pas" }, { "name": "Myc.Ast.Compiler.Binder", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Compiler.Binder.pas" }, { "name": "Myc.Ast.Compiler.Lowering", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Compiler.Lowering.pas" }, { "name": "Myc.Ast.Compiler.TypeChecker", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Compiler.TypeChecker.pas" }, { "name": "Myc.Ast.Compiler.Macros", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Compiler.Macros.pas" }, { "name": "Myc.Ast.Compiler.Specializer", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Compiler.Specializer.pas" }, { "name": "Myc.Ast.Environment", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Environment.pas" }, { "name": "Myc.Ast.Debugger", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Debugger.pas" }, { "name": "Myc.Ast.Analysis.Purity", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Analysis.Purity.pas" }, { "name": "Myc.Ast.Identities", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Identities.pas" }, { "name": "Myc.Fmx.AstEditor.Visualizer", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Visualizer.pas" }, { "name": "Myc.Fmx.AstEditor.Workspace", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Workspace.pas" }, { "name": "Myc.Fmx.AstEditor.Layout", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Layout.pas" }, { "name": "Myc.Fmx.AstEditor.Node", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Node.pas" }, { "name": "Myc.Ast.Refactoring.Remove", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Refactoring.Remove.pas" }, { "name": "Myc.Fmx.AstEditor.Render", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Render.pas" }, { "name": "Myc.Fmx.AstEditor.Handlers.Lists", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Handlers.Lists.pas" }, { "name": "Myc.Fmx.AstEditor.Handlers.Primitives", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Handlers.Primitives.pas" }, { "name": "Myc.Fmx.AstEditor.Handlers.Control", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Handlers.Control.pas" }, { "name": "Myc.Fmx.AstEditor.Handlers.Data", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Handlers.Data.pas" }, { "name": "Myc.Ast.RTL.TypeRegistry", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.RTL.TypeRegistry.pas" }, { "name": "Myc.Trade.Broker", "file": "file:///T%3A/Myc/Src/Myc.Trade.Broker.pas" }, { "name": "Myc.Data.Stream.Pipes", "file": "file:///T%3A/Myc/Src/Data/Myc.Data.Stream.Pipes.pas" }, { "name": "Myc.Data.Stream", "file": "file:///T%3A/Myc/Src/Data/Myc.Data.Stream.pas" }, { "name": "Myc.Fmx.AstEditor.Handlers.Pipes", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Handlers.Pipes.pas" }, { "name": "Demo.Finance", "file": "file:///T%3A/Myc/Test/Demo.Finance.pas" }, { "name": "Myc.Ast.Script.Print", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Script.Print.pas" }, { "name": "Myc.Ast.Json.Schema.Old", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Json.Schema.Old.pas" }, { "name": "Myc.Ast.Attributes", "file": "file:///T%3A/Myc/ASTPlayground/Myc.Ast.Attributes.pas" }, { "name": "Myc.Ast.Json.Schema", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Json.Schema.pas" }, { "name": "Myc.Ast.RTL.Math", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.RTL.Math.pas" }, { "name": "Myc.Ast.RTL.DateTime", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.RTL.DateTime.pas" }, { "name": "Myc.Ast.RTL.Series", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.RTL.Series.pas" } ] , "includeDCUsInUsesCompletion": true, "enableKeyWordCompletion": true, "browsingPaths": [ "file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/OCX/Servers","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/SOURCE/VCL","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/rtl/common","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/SOURCE/RTL/SYS","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/rtl/win","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/rtl/win/winrt","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/ToolsAPI","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/SOURCE/IBX","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/Internet","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/SOURCE/PROPERTY%20EDITORS","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/soap","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/SOURCE/XML","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/Indy10/Core","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/Indy10/System","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/Indy10/Protocols","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/fmx","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/databinding/components","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/databinding/engine","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/databinding/graph","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/ado","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/cloud","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/datasnap","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/dbx","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/dsnap","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/vclctrls","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/datasnap/connectors","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/datasnap/proxygen","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DataExplorer","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnit/Contrib/DUnitWizard/Source/Common","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnit/Contrib/DUnitWizard/Source/Common/dunit","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnit/Contrib/DUnitWizard/Source/DelphiExperts/Common","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnit/Contrib/DUnitWizard/Source/DelphiExperts/DUnitProject","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnit/Contrib/DUnitWizard/Source/DelphiExperts/DUnitProject/dunit","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnit/src","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnit/tests","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/Experts","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/indy/abstraction","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/indy/implementation","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/indyimpl","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/Property%20Editors/Indy10","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/soap/wsdlimporter","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/Visualizers","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnit/Contrib/XMLReporting","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnit/Contrib/XPGen","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/rest","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/firedac","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/tethering","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnitX","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/ems","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/rtl/net","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/FlatBox2D","file:///C%3A/Users/Public/Documents/Embarcadero/Studio/37.0/Dcp/%25PLATFORM%25","file:///%25TP%25/runtime/vcl","file:///S%3A/sc_famos_src/svn_vcl/cpxedits","file:///S%3A/sc_famos_src/svn_vcl/dzChart","file:///S%3A/sc_famos_src/svn_vcl/eaeditor","file:///S%3A/sc_famos_src/svn_vcl/FamosEvents","file:///S%3A/sc_famos_src/svn_vcl/HTML_Viewer/source","file:///S%3A/sc_famos_src/svn_vcl/Myc_ChartEdit","file:///S%3A/sc_famos_src/svn_vcl/Myc_HemiDrag","file:///S%3A/sc_famos_src/svn_vcl/Myc_SplitControl","file:///S%3A/sc_famos_src/svn_vcl/NiceChart","file:///S%3A/sc_famos_src/svn_vcl/plotter","file:///S%3A/sc_famos_src/svn_vcl/SimpleIPC","file:///S%3A/sc_famos_src/svn_vcl/SynEdit-master/Source","file:///S%3A/sc_famos_src/svn_vcl/ValEdits","file:///S%3A/sc_famos_src/svn_vcl/ZipMaster","file:///S%3A/sc_famos_src/svn_vcl/ZipMaster/zlib","file:///S%3A/sc_famos_src/svn_vcl/ZipMaster/zlib/win32","file:///S%3A/sc_famos_src/svn_vcl/Virtual-TreeView/Source","file:///S%3A/sc_famos_src/svn_common/caHelpSys","file:///S%3A/sc_famos_src/svn_common/Misc","file:///S%3A/sc_famos_src/svn_common/Myc_VecMath","file:///S%3A/sc_famos_src/svn_common/PascalScript/source","file:///S%3A/sc_famos_src/svn_common/TreeBase","file:///S%3A/sc_famos_src/svn_common/TreeBase/Medien","file:///S%3A/3rdParty/spring4d/Source","file:///S%3A/3rdParty/spring4d/Source/Base","file:///S%3A/3rdParty/spring4d/Source/Base/Collections","file:///S%3A/3rdParty/spring4d/Source/Base/Logging","file:///S%3A/3rdParty/spring4d/Source/Base/Patches","file:///S%3A/3rdParty/spring4d/Source/Core/Container","file:///S%3A/3rdParty/spring4d/Source/Core/Interception","file:///S%3A/3rdParty/spring4d/Source/Core/Logging","file:///S%3A/3rdParty/spring4d/Source/Core/Mocking","file:///S%3A/3rdParty/spring4d/Source/Core/Services","file:///S%3A/3rdParty/spring4d/Source/Extensions/Cryptography","file:///S%3A/3rdParty/spring4d/Source/Extensions/Utils","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressCore%20Library/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressCommon%20Library/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressGDI%2B%20Library/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressLibrary/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/XP%20Theme%20Manager/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressLayout%20Control/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressPageControl/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressEditors%20Library/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressDocking%20Library/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressBars/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressOfficeCore%20Library/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressMemData/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressDataController/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressNavBar/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressSkins%20Library/Sources","file:///T%3A/Myc/Src","file:///T%3A/Myc/Src/Data","file:///T%3A/Myc/Src/AST" ] , "CommonAppData": "file:///C%3A/Users/Brummel/AppData/Roaming/Embarcadero/BDS/37.0/" , "Templates": "file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/ObjRepos/" } }
\ No newline at end of file
+{ "settings": { "project": "file:///T%3A/Myc/ASTPlayground/ASTPlayground.dpr", "dllname": "dcc64370.dll", "dccOptions": "-$O- -$W+ --inline:off -$R+ -$Q+ --no-config -Q -TX.exe -AGenerics.Collections=System.Generics.Collections;Generics.Defaults=System.Generics.Defaults;WinTypes=Winapi.Windows;WinProcs=Winapi.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE -DDEBUG;;FRAMEWORK_FMX -E.\\Win64\\Debug -I\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\debug\\DE\";\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\debug\";\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\release\\DE\";T:\\Myc\\Src\\Data;T:\\Myc\\Src\\AST;T:\\Myc\\Src;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\release\";C:\\Users\\Brummel\\Documents\\Embarcadero\\Studio\\37.0\\Imports\\Win64;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\Imports\";C:\\Users\\Public\\Documents\\Embarcadero\\Studio\\37.0\\Dcp\\Win64;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\include\";S:\\sc_famos_src\\svn_vcl\\Virtual-TreeView\\Source;S:\\sc_famos_src\\svn_vcl\\cpxedits;S:\\sc_famos_src\\svn_vcl\\dzChart;S:\\sc_famos_src\\svn_vcl\\eaeditor;S:\\sc_famos_src\\svn_vcl\\FamosEvents;S:\\sc_famos_src\\svn_vcl\\HTML_Viewer\\source;S:\\sc_famos_src\\svn_vcl\\Myc_ChartEdit;S:\\sc_famos_src\\svn_vcl\\Myc_HemiDrag;S:\\sc_famos_src\\svn_vcl\\Myc_SplitControl;S:\\sc_famos_src\\svn_vcl\\plotter;S:\\sc_famos_src\\svn_vcl\\SimpleIPC;S:\\sc_famos_src\\svn_vcl\\SynEdit-master\\Source;S:\\sc_famos_src\\svn_vcl\\ValEdits;S:\\sc_famos_src\\svn_vcl\\ZipMaster;S:\\sc_famos_src\\svn_common\\Myc_VecMath;\"C:\\Program Files (x86)\\DevExpress VCL\\Library\\RS28\\Win64\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressCore Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressCommon Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressGDI+ Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressLibrary\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\XP Theme Manager\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressLayout Control\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressPageControl\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressEditors Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressDocking Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressBars\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressOfficeCore Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressMemData\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressDataController\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressNavBar\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressSkins Library\\Sources\";S:\\3rdParty\\FastMM5;C:\\Users\\Brummel\\AppData\\Local\\Programs\\TestInsight\\Source;T:\\Myc\\Src;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\source\\DUnitX\" -LEC:\\Users\\Public\\Documents\\Embarcadero\\Studio\\37.0\\Bpl\\Win64 -LNC:\\Users\\Public\\Documents\\Embarcadero\\Studio\\37.0\\Dcp\\Win64 -NU.\\Win64\\Debug -NSWinapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;System;Xml;Data;Datasnap;Web;Soap; -OT:\\Myc\\Src\\Data;T:\\Myc\\Src\\AST;T:\\Myc\\Src;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\release\";C:\\Users\\Brummel\\Documents\\Embarcadero\\Studio\\37.0\\Imports\\Win64;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\Imports\";C:\\Users\\Public\\Documents\\Embarcadero\\Studio\\37.0\\Dcp\\Win64;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\include\";S:\\sc_famos_src\\svn_vcl\\Virtual-TreeView\\Source;S:\\sc_famos_src\\svn_vcl\\cpxedits;S:\\sc_famos_src\\svn_vcl\\dzChart;S:\\sc_famos_src\\svn_vcl\\eaeditor;S:\\sc_famos_src\\svn_vcl\\FamosEvents;S:\\sc_famos_src\\svn_vcl\\HTML_Viewer\\source;S:\\sc_famos_src\\svn_vcl\\Myc_ChartEdit;S:\\sc_famos_src\\svn_vcl\\Myc_HemiDrag;S:\\sc_famos_src\\svn_vcl\\Myc_SplitControl;S:\\sc_famos_src\\svn_vcl\\plotter;S:\\sc_famos_src\\svn_vcl\\SimpleIPC;S:\\sc_famos_src\\svn_vcl\\SynEdit-master\\Source;S:\\sc_famos_src\\svn_vcl\\ValEdits;S:\\sc_famos_src\\svn_vcl\\ZipMaster;S:\\sc_famos_src\\svn_common\\Myc_VecMath;\"C:\\Program Files (x86)\\DevExpress VCL\\Library\\RS28\\Win64\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressCore Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressCommon Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressGDI+ Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressLibrary\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\XP Theme Manager\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressLayout Control\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressPageControl\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressEditors Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressDocking Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressBars\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressOfficeCore Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressMemData\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressDataController\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressNavBar\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressSkins Library\\Sources\";S:\\3rdParty\\FastMM5;C:\\Users\\Brummel\\AppData\\Local\\Programs\\TestInsight\\Source;T:\\Myc\\Src;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\source\\DUnitX\" -R\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\release\\DE\";T:\\Myc\\Src\\Data;T:\\Myc\\Src\\AST;T:\\Myc\\Src;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\release\";C:\\Users\\Brummel\\Documents\\Embarcadero\\Studio\\37.0\\Imports\\Win64;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\Imports\";C:\\Users\\Public\\Documents\\Embarcadero\\Studio\\37.0\\Dcp\\Win64;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\include\";S:\\sc_famos_src\\svn_vcl\\Virtual-TreeView\\Source;S:\\sc_famos_src\\svn_vcl\\cpxedits;S:\\sc_famos_src\\svn_vcl\\dzChart;S:\\sc_famos_src\\svn_vcl\\eaeditor;S:\\sc_famos_src\\svn_vcl\\FamosEvents;S:\\sc_famos_src\\svn_vcl\\HTML_Viewer\\source;S:\\sc_famos_src\\svn_vcl\\Myc_ChartEdit;S:\\sc_famos_src\\svn_vcl\\Myc_HemiDrag;S:\\sc_famos_src\\svn_vcl\\Myc_SplitControl;S:\\sc_famos_src\\svn_vcl\\plotter;S:\\sc_famos_src\\svn_vcl\\SimpleIPC;S:\\sc_famos_src\\svn_vcl\\SynEdit-master\\Source;S:\\sc_famos_src\\svn_vcl\\ValEdits;S:\\sc_famos_src\\svn_vcl\\ZipMaster;S:\\sc_famos_src\\svn_common\\Myc_VecMath;\"C:\\Program Files (x86)\\DevExpress VCL\\Library\\RS28\\Win64\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressCore Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressCommon Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressGDI+ Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressLibrary\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\XP Theme Manager\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressLayout Control\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressPageControl\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressEditors Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressDocking Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressBars\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressOfficeCore Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressMemData\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressDataController\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressNavBar\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressSkins Library\\Sources\";S:\\3rdParty\\FastMM5;C:\\Users\\Brummel\\AppData\\Local\\Programs\\TestInsight\\Source;T:\\Myc\\Src;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\source\\DUnitX\" -U\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\debug\\DE\";\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\debug\";\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\release\\DE\";T:\\Myc\\Src\\Data;T:\\Myc\\Src\\AST;T:\\Myc\\Src;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\release\";C:\\Users\\Brummel\\Documents\\Embarcadero\\Studio\\37.0\\Imports\\Win64;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\Imports\";C:\\Users\\Public\\Documents\\Embarcadero\\Studio\\37.0\\Dcp\\Win64;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\include\";S:\\sc_famos_src\\svn_vcl\\Virtual-TreeView\\Source;S:\\sc_famos_src\\svn_vcl\\cpxedits;S:\\sc_famos_src\\svn_vcl\\dzChart;S:\\sc_famos_src\\svn_vcl\\eaeditor;S:\\sc_famos_src\\svn_vcl\\FamosEvents;S:\\sc_famos_src\\svn_vcl\\HTML_Viewer\\source;S:\\sc_famos_src\\svn_vcl\\Myc_ChartEdit;S:\\sc_famos_src\\svn_vcl\\Myc_HemiDrag;S:\\sc_famos_src\\svn_vcl\\Myc_SplitControl;S:\\sc_famos_src\\svn_vcl\\plotter;S:\\sc_famos_src\\svn_vcl\\SimpleIPC;S:\\sc_famos_src\\svn_vcl\\SynEdit-master\\Source;S:\\sc_famos_src\\svn_vcl\\ValEdits;S:\\sc_famos_src\\svn_vcl\\ZipMaster;S:\\sc_famos_src\\svn_common\\Myc_VecMath;\"C:\\Program Files (x86)\\DevExpress VCL\\Library\\RS28\\Win64\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressCore Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressCommon Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressGDI+ Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressLibrary\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\XP Theme Manager\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressLayout Control\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressPageControl\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressEditors Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressDocking Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressBars\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressOfficeCore Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressMemData\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressDataController\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressNavBar\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressSkins Library\\Sources\";S:\\3rdParty\\FastMM5;C:\\Users\\Brummel\\AppData\\Local\\Programs\\TestInsight\\Source;T:\\Myc\\Src;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\source\\DUnitX\" -V -VN -VR -NBC:\\Users\\Public\\Documents\\Embarcadero\\Studio\\37.0\\Dcp\\Win64 -NHC:\\Users\\Public\\Documents\\Embarcadero\\Studio\\37.0\\hpp\\Win64 -NO.\\Win64\\Debug -LU" , "projectFiles":[ { "name": "MainForm", "file": "file:///T%3A/Myc/ASTPlayground/MainForm.pas" }, { "name": "Myc.Ast.Nodes", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Nodes.pas" }, { "name": "Myc.Ast.Scope", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Scope.pas" }, { "name": "Myc.Data.Value", "file": "file:///T%3A/Myc/ASTPlayground/Myc.Data.Value.pas" }, { "name": "Myc.Ast.Visitor", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Visitor.pas" }, { "name": "Myc.Ast.RTL", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.RTL.pas" }, { "name": "Myc.Ast.Dumper", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Dumper.pas" }, { "name": "Myc.Ast.RTL.Core", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.RTL.Core.pas" }, { "name": "Myc.Utils", "file": "file:///T%3A/Myc/Src/Myc.Utils.pas" }, { "name": "Myc.Ast.Script", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Script.pas" }, { "name": "Myc.Ast.Types", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Types.pas" }, { "name": "Myc.Data.Keyword", "file": "file:///T%3A/Myc/Src/Data/Myc.Data.Keyword.pas" }, { "name": "Myc.Ast.Compiler.TCO", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Compiler.TCO.pas" }, { "name": "Myc.Ast.Compiler.Binder", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Compiler.Binder.pas" }, { "name": "Myc.Ast.Compiler.Lowering", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Compiler.Lowering.pas" }, { "name": "Myc.Ast.Compiler.TypeChecker", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Compiler.TypeChecker.pas" }, { "name": "Myc.Ast.Compiler.Macros", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Compiler.Macros.pas" }, { "name": "Myc.Ast.Compiler.Specializer", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Compiler.Specializer.pas" }, { "name": "Myc.Ast.Environment", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Environment.pas" }, { "name": "Myc.Ast.Debugger", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Debugger.pas" }, { "name": "Myc.Ast.Analysis.Purity", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Analysis.Purity.pas" }, { "name": "Myc.Ast.Identities", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Identities.pas" }, { "name": "Myc.Fmx.AstEditor.Visualizer", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Visualizer.pas" }, { "name": "Myc.Fmx.AstEditor.Workspace", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Workspace.pas" }, { "name": "Myc.Fmx.AstEditor.Layout", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Layout.pas" }, { "name": "Myc.Fmx.AstEditor.Node", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Node.pas" }, { "name": "Myc.Ast.Refactoring.Remove", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Refactoring.Remove.pas" }, { "name": "Myc.Fmx.AstEditor.Render", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Render.pas" }, { "name": "Myc.Fmx.AstEditor.Handlers.Lists", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Handlers.Lists.pas" }, { "name": "Myc.Fmx.AstEditor.Handlers.Primitives", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Handlers.Primitives.pas" }, { "name": "Myc.Fmx.AstEditor.Handlers.Control", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Handlers.Control.pas" }, { "name": "Myc.Fmx.AstEditor.Handlers.Data", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Handlers.Data.pas" }, { "name": "Myc.Ast.RTL.TypeRegistry", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.RTL.TypeRegistry.pas" }, { "name": "Myc.Trade.Broker", "file": "file:///T%3A/Myc/Src/Myc.Trade.Broker.pas" }, { "name": "Myc.Data.Stream", "file": "file:///T%3A/Myc/Src/Data/Myc.Data.Stream.pas" }, { "name": "Myc.Fmx.AstEditor.Handlers.Pipes", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Handlers.Pipes.pas" }, { "name": "Demo.Finance", "file": "file:///T%3A/Myc/Test/Demo.Finance.pas" }, { "name": "Myc.Ast.Script.Print", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Script.Print.pas" }, { "name": "Myc.Ast.Json.Schema.Old", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Json.Schema.Old.pas" }, { "name": "Myc.Ast.Attributes", "file": "file:///T%3A/Myc/ASTPlayground/Myc.Ast.Attributes.pas" }, { "name": "Myc.Ast.Json.Schema", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Json.Schema.pas" }, { "name": "Myc.Ast.RTL.Math", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.RTL.Math.pas" }, { "name": "Myc.Ast.RTL.DateTime", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.RTL.DateTime.pas" }, { "name": "Myc.Ast.RTL.Series", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.RTL.Series.pas" } ] , "includeDCUsInUsesCompletion": true, "enableKeyWordCompletion": true, "browsingPaths": [ "file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/OCX/Servers","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/SOURCE/VCL","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/rtl/common","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/SOURCE/RTL/SYS","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/rtl/win","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/rtl/win/winrt","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/ToolsAPI","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/SOURCE/IBX","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/Internet","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/SOURCE/PROPERTY%20EDITORS","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/soap","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/SOURCE/XML","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/Indy10/Core","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/Indy10/System","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/Indy10/Protocols","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/fmx","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/databinding/components","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/databinding/engine","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/databinding/graph","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/ado","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/cloud","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/datasnap","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/dbx","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/dsnap","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/vclctrls","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/datasnap/connectors","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/datasnap/proxygen","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DataExplorer","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnit/Contrib/DUnitWizard/Source/Common","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnit/Contrib/DUnitWizard/Source/Common/dunit","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnit/Contrib/DUnitWizard/Source/DelphiExperts/Common","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnit/Contrib/DUnitWizard/Source/DelphiExperts/DUnitProject","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnit/Contrib/DUnitWizard/Source/DelphiExperts/DUnitProject/dunit","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnit/src","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnit/tests","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/Experts","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/indy/abstraction","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/indy/implementation","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/indyimpl","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/Property%20Editors/Indy10","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/soap/wsdlimporter","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/Visualizers","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnit/Contrib/XMLReporting","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnit/Contrib/XPGen","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/rest","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/firedac","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/tethering","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnitX","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/ems","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/rtl/net","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/FlatBox2D","file:///C%3A/Users/Public/Documents/Embarcadero/Studio/37.0/Dcp/%25PLATFORM%25","file:///%25TP%25/runtime/vcl","file:///S%3A/sc_famos_src/svn_vcl/cpxedits","file:///S%3A/sc_famos_src/svn_vcl/dzChart","file:///S%3A/sc_famos_src/svn_vcl/eaeditor","file:///S%3A/sc_famos_src/svn_vcl/FamosEvents","file:///S%3A/sc_famos_src/svn_vcl/HTML_Viewer/source","file:///S%3A/sc_famos_src/svn_vcl/Myc_ChartEdit","file:///S%3A/sc_famos_src/svn_vcl/Myc_HemiDrag","file:///S%3A/sc_famos_src/svn_vcl/Myc_SplitControl","file:///S%3A/sc_famos_src/svn_vcl/NiceChart","file:///S%3A/sc_famos_src/svn_vcl/plotter","file:///S%3A/sc_famos_src/svn_vcl/SimpleIPC","file:///S%3A/sc_famos_src/svn_vcl/SynEdit-master/Source","file:///S%3A/sc_famos_src/svn_vcl/ValEdits","file:///S%3A/sc_famos_src/svn_vcl/ZipMaster","file:///S%3A/sc_famos_src/svn_vcl/ZipMaster/zlib","file:///S%3A/sc_famos_src/svn_vcl/ZipMaster/zlib/win32","file:///S%3A/sc_famos_src/svn_vcl/Virtual-TreeView/Source","file:///S%3A/sc_famos_src/svn_common/caHelpSys","file:///S%3A/sc_famos_src/svn_common/Misc","file:///S%3A/sc_famos_src/svn_common/Myc_VecMath","file:///S%3A/sc_famos_src/svn_common/PascalScript/source","file:///S%3A/sc_famos_src/svn_common/TreeBase","file:///S%3A/sc_famos_src/svn_common/TreeBase/Medien","file:///S%3A/3rdParty/spring4d/Source","file:///S%3A/3rdParty/spring4d/Source/Base","file:///S%3A/3rdParty/spring4d/Source/Base/Collections","file:///S%3A/3rdParty/spring4d/Source/Base/Logging","file:///S%3A/3rdParty/spring4d/Source/Base/Patches","file:///S%3A/3rdParty/spring4d/Source/Core/Container","file:///S%3A/3rdParty/spring4d/Source/Core/Interception","file:///S%3A/3rdParty/spring4d/Source/Core/Logging","file:///S%3A/3rdParty/spring4d/Source/Core/Mocking","file:///S%3A/3rdParty/spring4d/Source/Core/Services","file:///S%3A/3rdParty/spring4d/Source/Extensions/Cryptography","file:///S%3A/3rdParty/spring4d/Source/Extensions/Utils","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressCore%20Library/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressCommon%20Library/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressGDI%2B%20Library/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressLibrary/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/XP%20Theme%20Manager/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressLayout%20Control/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressPageControl/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressEditors%20Library/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressDocking%20Library/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressBars/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressOfficeCore%20Library/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressMemData/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressDataController/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressNavBar/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressSkins%20Library/Sources","file:///T%3A/Myc/Src","file:///T%3A/Myc/Src/Data","file:///T%3A/Myc/Src/AST" ] , "CommonAppData": "file:///C%3A/Users/Brummel/AppData/Roaming/Embarcadero/BDS/37.0/" , "Templates": "file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/ObjRepos/" } }
\ No newline at end of file
diff --git a/ASTPlayground/ASTPlayground.dpr b/ASTPlayground/ASTPlayground.dpr
index c610919..9e0d22b 100644
--- a/ASTPlayground/ASTPlayground.dpr
+++ b/ASTPlayground/ASTPlayground.dpr
@@ -38,7 +38,6 @@ uses
Myc.Fmx.AstEditor.Handlers.Data in '..\Src\AST\Myc.Fmx.AstEditor.Handlers.Data.pas',
Myc.Ast.RTL.TypeRegistry in '..\Src\AST\Myc.Ast.RTL.TypeRegistry.pas',
Myc.Trade.Broker in '..\Src\Myc.Trade.Broker.pas',
- Myc.Data.Stream.Pipes in '..\Src\Data\Myc.Data.Stream.Pipes.pas',
Myc.Data.Stream in '..\Src\Data\Myc.Data.Stream.pas',
Myc.Fmx.AstEditor.Handlers.Pipes in '..\Src\AST\Myc.Fmx.AstEditor.Handlers.Pipes.pas',
Demo.Finance in '..\Test\Demo.Finance.pas',
diff --git a/ASTPlayground/ASTPlayground.dproj b/ASTPlayground/ASTPlayground.dproj
index 7850f15..b56e27d 100644
--- a/ASTPlayground/ASTPlayground.dproj
+++ b/ASTPlayground/ASTPlayground.dproj
@@ -168,7 +168,6 @@
-
diff --git a/Src/AST/Myc.Ast.Evaluator.pas b/Src/AST/Myc.Ast.Evaluator.pas
index 22f0572..f802b8f 100644
--- a/Src/AST/Myc.Ast.Evaluator.pas
+++ b/Src/AST/Myc.Ast.Evaluator.pas
@@ -62,7 +62,6 @@ uses
Myc.Data.Decimal,
Myc.Data.Series,
Myc.Data.Stream,
- Myc.Data.Stream.Pipes,
Myc.Ast.Types;
type
@@ -602,9 +601,7 @@ begin
// Compile the transformation function
lambdaFunc := Visit(N.Transformation).AsMethod();
- // WARNING: If this is executing dynamically (without TypeChecker), StaticType is Unknown.
- // Pipe creation REQUIRES the output definition.
- // Fixed: Allow both stRecord and stRecordSeries (as TypeChecker correctly assigns stRecordSeries for Pipe nodes)
+ // Allow both stRecord and stRecordSeries (as TypeChecker correctly assigns stRecordSeries for Pipe nodes)
if (N.StaticType.Kind <> stRecordSeries) and (N.StaticType.Kind <> stRecord) then
raise EEvaluatorException.Create('Pipe requires Type Checking to determine output structure (RecordDefinition).');
diff --git a/Src/Data/Myc.Data.Stream.Pipes.pas b/Src/Data/Myc.Data.Stream.Pipes.pas
deleted file mode 100644
index 3d44e1d..0000000
--- a/Src/Data/Myc.Data.Stream.Pipes.pas
+++ /dev/null
@@ -1,280 +0,0 @@
-unit Myc.Data.Stream.Pipes;
-
-interface
-
-uses
- System.SysUtils,
- System.Classes,
- System.Generics.Collections,
- System.SyncObjs,
- Myc.Data.Scalar,
- Myc.Data.Keyword,
- Myc.Data.Stream,
- Myc.Core.Notifier;
-
-type
- // =========================================================================
- // BASE STREAM
- // Implements storage (Series) and broadcasting (Observers).
- // Does not define WHEN data is emitted (Policy).
- // =========================================================================
- TCustomDataStream = class(TInterfacedObject, IStream)
- strict private
- FSeries: IWriteableScalarRecordSeries;
- FObservers: TMycNotifyList;
- function GetSeries: IScalarRecordSeries;
- protected
- // Derived classes call this to write data and notify listeners.
- // ACycleID: The cycle this data belongs to.
- procedure Emit(const Value: array of TScalar.TValue; ACycleID: Int64);
- public
- constructor Create(const ADef: IScalarRecordDefinition);
- destructor Destroy; override;
-
- // IStream
- function Subscribe(const Observer: IStreamObserver): TSubscriptionTag;
- procedure Unsubscribe(Tag: TSubscriptionTag);
- property Series: IScalarRecordSeries read GetSeries;
- end;
-
- // =========================================================================
- // ROOT STREAM (SOURCE)
- // Acts as the clock source. Generates new CycleIDs.
- // =========================================================================
- TRootStream = class(TCustomDataStream)
- private
- FLastCycleID: Int64;
- public
- constructor Create(const ADef: IScalarRecordDefinition);
- // Public API to inject data from Delphi
- procedure Push(const RowData: TArray);
- end;
-
- // =========================================================================
- // PIPE STREAM (NODE)
- // Reacts to upstream signals using barrier synchronization.
- // =========================================================================
- TPipeStream = class; // Forward
-
- TPipeConfig = TArray>;
-
- TPipeSource = class(TContainedObject, IStreamObserver)
- private
- FSource: IStream;
- FTag: TSubscriptionTag;
- FLastSeenCycle: Int64;
- procedure OnSignal(const Signal: TStreamSignal);
- public
- constructor Create(AOwner: TPipeStream; ASource: IStream);
- destructor Destroy; override;
- property LastSeenCycle: Int64 read FLastSeenCycle;
- end;
-
- TPipeStream = class(TCustomDataStream)
- public
- type
- TPipeLambda = reference to function(const Sources: array of ISeries; out Results: array of TScalar.TValue): Boolean;
- private
- FSources: TArray;
- FSourceSeries: TArray;
- FLastFiredCycleID: Int64;
- FLambda: TPipeLambda;
-
- procedure CheckBarrierAndFire(CurrentCycle: Int64);
- public
- constructor Create(
- const AConfig: TPipeConfig;
- const ADef: IScalarRecordDefinition;
- const ASources: TArray;
- const ALambda: TPipeLambda
- );
- destructor Destroy; override;
- end;
-
-implementation
-
-{ TCustomDataStream }
-
-constructor TCustomDataStream.Create(const ADef: IScalarRecordDefinition);
-begin
- inherited Create;
- FSeries := TScalarRecordSeries.Create(ADef);
-end;
-
-destructor TCustomDataStream.Destroy;
-begin
- FObservers.Finalize;
- inherited;
-end;
-
-function TCustomDataStream.GetSeries: IScalarRecordSeries;
-begin
- Result := FSeries;
-end;
-
-function TCustomDataStream.Subscribe(const Observer: IStreamObserver): TSubscriptionTag;
-begin
- FObservers.Lock;
- try
- Result := FObservers.Advise(Observer);
- finally
- FObservers.Release;
- end;
-end;
-
-procedure TCustomDataStream.Unsubscribe(Tag: TSubscriptionTag);
-begin
- FObservers.Lock;
- try
- FObservers.Unadvise(Tag);
- finally
- FObservers.Release;
- end;
-end;
-
-procedure TCustomDataStream.Emit(const Value: array of TScalar.TValue; ACycleID: Int64);
-var
- signal: TStreamSignal;
-begin
- FObservers.Lock;
- try
- // 1. Write Data
- FSeries.Add(Value);
-
- // 2. Broadcast Signal
- signal := TStreamSignal.Create(skData, ACycleID);
-
- FObservers.Notify(
- function(const Obs: IStreamObserver): Boolean
- begin
- Obs.OnSignal(signal);
- Result := True;
- end
- );
- finally
- FObservers.Release;
- end;
-end;
-
-{ TRootStream }
-
-constructor TRootStream.Create(const ADef: IScalarRecordDefinition);
-begin
- inherited Create(ADef);
- FLastCycleID := 0;
-end;
-
-procedure TRootStream.Push(const RowData: TArray);
-begin
- // Root streams increment the global clock
- Inc(FLastCycleID);
- Emit(RowData, FLastCycleID);
-end;
-
-{ TPipeSource }
-
-constructor TPipeSource.Create(AOwner: TPipeStream; ASource: IStream);
-begin
- inherited Create(AOwner);
- FSource := ASource;
- FLastSeenCycle := -1;
- FTag := FSource.Subscribe(Self);
-end;
-
-destructor TPipeSource.Destroy;
-begin
- FSource.Unsubscribe(FTag);
- inherited;
-end;
-
-procedure TPipeSource.OnSignal(const Signal: TStreamSignal);
-begin
- if Signal.Kind = skData then
- begin
- FLastSeenCycle := Signal.CycleID;
- (Controller as TPipeStream).CheckBarrierAndFire(FLastSeenCycle);
- end;
-end;
-
-{ TPipeStream }
-
-constructor TPipeStream.Create(
- const AConfig: TPipeConfig;
- const ADef: IScalarRecordDefinition;
- const ASources: TArray;
- const ALambda: TPipeLambda
-);
-var
- i, j, n: Integer;
-begin
- // Pass Definition to base class
- inherited Create(ADef);
-
- FLambda := ALambda;
- FLastFiredCycleID := -1;
-
- SetLength(FSources, Length(ASources));
-
- // Flatten Sources
- n := 0;
- for i := 0 to High(AConfig) do
- inc(n, Length(AConfig[i]));
- SetLength(FSourceSeries, n);
-
- n := 0;
- for i := 0 to High(ASources) do
- begin
- FSources[i] := TPipeSource.Create(Self, ASources[i]);
- for j := 0 to High(AConfig[i]) do
- begin
- // Extract the specific column series
- FSourceSeries[n] := ASources[i].Series.Fields[AConfig[i][j].Key];
- inc(n);
- end;
- end;
-end;
-
-destructor TPipeStream.Destroy;
-begin
- for var i := High(FSources) downto 0 do
- FSources[i].Free;
- FSources := nil;
- FSourceSeries := nil;
- inherited;
-end;
-
-procedure TPipeStream.CheckBarrierAndFire(CurrentCycle: Int64);
-var
- resultVal: TArray;
-begin
- // We reuse the FObservers lock from the base class to protect state
- // But since FObservers is private, we access it via method or need to make it protected.
- // Making it protected or using a separate lock is cleaner.
- // For now, let's assume we rely on the fact that OnSignal is usually serialized per thread
- // or add a lock.
- // -> Ideally, TCustomDataStream should expose Lock/Unlock or we add a Lock here.
-
- // Simplification: We assume thread safety is handled by the caller or we add a dedicated lock.
- // For this example, let's just do the logic:
-
- for var src in FSources do
- if src.LastSeenCycle < CurrentCycle then
- exit; // Barrier closed
-
- if FLastFiredCycleID >= CurrentCycle then
- exit; // Already fired
-
- FLastFiredCycleID := CurrentCycle;
-
- if Assigned(FLambda) then
- begin
- SetLength(resultVal, Series.Def.Count);
- if FLambda(FSourceSeries, resultVal) then
- begin
- // Pass through CycleID from upstream
- Emit(resultVal, FLastFiredCycleID);
- end;
- end;
-end;
-
-end.
diff --git a/Src/Data/Myc.Data.Stream.pas b/Src/Data/Myc.Data.Stream.pas
index d95fd9e..81a94af 100644
--- a/Src/Data/Myc.Data.Stream.pas
+++ b/Src/Data/Myc.Data.Stream.pas
@@ -43,61 +43,82 @@ type
property Series: IScalarRecordSeries read GetSeries;
end;
- IInputChannel = interface
- {$region 'private'}
- function GetStream: IStream;
- {$endregion}
- procedure Push(const Value: IKeywordMapping);
- property Stream: IStream read GetStream;
- end;
-
- IGraphExecutor = interface
- {$region 'private'}
- function GetCycleID: Int64;
- {$endregion}
-
- function GetInputChannel(const Name: string; const Def: IScalarRecordDefinition): IInputChannel;
- procedure Step;
- property CycleID: Int64 read GetCycleID;
- end;
-
- TGraphExecutor = class(TInterfacedObject, IGraphExecutor)
- private
- type
- TChannel = class(TInterfacedObject, IInputChannel, IStream)
- private
- type
- TStreamNotifier = TMycNotifyList;
- private
- FName: string;
- FSeries: IWriteableScalarRecordSeries;
- FQueue: TQueue>;
- FQueueLock: TSpinLock;
- FObservers: TStreamNotifier;
-
- procedure Push(const Value: IKeywordMapping);
- function GetStream: IStream;
- function Subscribe(const Observer: IStreamObserver): TSubscriptionTag;
- procedure Unsubscribe(Tag: TSubscriptionTag);
- procedure Emit(ACycle: Int64);
-
- function GetSeries: IScalarRecordSeries;
-
- public
- constructor Create(const AName: string; const ASeries: IWriteableScalarRecordSeries);
- destructor Destroy; override;
- end;
-
- private
- FCycleID: Int64;
- FChannels: TDictionary;
- FLock: TSpinLock;
- function GetInputChannel(const Name: string; const Def: IScalarRecordDefinition): IInputChannel;
- function GetCycleID: Int64;
+ // =========================================================================
+ // BASE STREAM
+ // Implements storage (Series) and broadcasting (Observers).
+ // Does not define WHEN data is emitted (Policy).
+ // =========================================================================
+ TCustomDataStream = class(TInterfacedObject, IStream)
+ strict private
+ FSeries: IWriteableScalarRecordSeries;
+ FObservers: TMycNotifyList;
+ function GetSeries: IScalarRecordSeries;
+ protected
+ // Derived classes call this to write data and notify listeners.
+ // ACycleID: The cycle this data belongs to.
+ procedure Emit(const Value: array of TScalar.TValue; ACycleID: Int64);
public
- constructor Create;
+ constructor Create(const ADef: IScalarRecordDefinition);
+ destructor Destroy; override;
+
+ // IStream
+ function Subscribe(const Observer: IStreamObserver): TSubscriptionTag;
+ procedure Unsubscribe(Tag: TSubscriptionTag);
+ property Series: IScalarRecordSeries read GetSeries;
+ end;
+
+ // =========================================================================
+ // ROOT STREAM (SOURCE)
+ // Acts as the clock source. Generates new CycleIDs.
+ // =========================================================================
+ TRootStream = class(TCustomDataStream)
+ private
+ FLastCycleID: Int64;
+ public
+ constructor Create(const ADef: IScalarRecordDefinition);
+ // Public API to inject data from Delphi
+ procedure Push(const RowData: TArray);
+ end;
+
+ // =========================================================================
+ // PIPE STREAM (NODE)
+ // Reacts to upstream signals using barrier synchronization.
+ // =========================================================================
+ TPipeStream = class; // Forward
+
+ TPipeConfig = TArray>;
+
+ TPipeSource = class(TContainedObject, IStreamObserver)
+ private
+ FSource: IStream;
+ FTag: TSubscriptionTag;
+ FLastSeenCycle: Int64;
+ procedure OnSignal(const Signal: TStreamSignal);
+ public
+ constructor Create(AOwner: TPipeStream; ASource: IStream);
+ destructor Destroy; override;
+ property LastSeenCycle: Int64 read FLastSeenCycle;
+ end;
+
+ TPipeStream = class(TCustomDataStream)
+ public
+ type
+ TPipeLambda = reference to function(const Sources: array of ISeries; out Results: array of TScalar.TValue): Boolean;
+ private
+ FSources: TArray;
+ FSourceSeries: TArray;
+ FLastFiredCycleID: Int64;
+ FLambda: TPipeLambda;
+
+ procedure CheckBarrierAndFire(CurrentCycle: Int64);
+ public
+ constructor Create(
+ const AConfig: TPipeConfig;
+ const ADef: IScalarRecordDefinition;
+ const ASources: TArray;
+ const ALambda: TPipeLambda
+ );
destructor Destroy; override;
- procedure Step;
end;
implementation
@@ -119,39 +140,26 @@ begin
Result := Format('Signal(Heartbeat, #%d)', [CycleID]);
end;
-{ TGraphExecutor.TChannel }
+{ TCustomDataStream }
-constructor TGraphExecutor.TChannel.Create(const AName: string; const ASeries: IWriteableScalarRecordSeries);
+constructor TCustomDataStream.Create(const ADef: IScalarRecordDefinition);
begin
inherited Create;
- FName := AName;
- FSeries := ASeries;
- FQueue := TQueue>.Create;
+ FSeries := TScalarRecordSeries.Create(ADef);
end;
-destructor TGraphExecutor.TChannel.Destroy;
+destructor TCustomDataStream.Destroy;
begin
FObservers.Finalize;
- FQueue.Free;
inherited;
end;
-procedure TGraphExecutor.TChannel.Push(const Value: IKeywordMapping);
+function TCustomDataStream.GetSeries: IScalarRecordSeries;
begin
- FQueueLock.Enter;
- try
- FQueue.Enqueue(Value);
- finally
- FQueueLock.Exit;
- end;
+ Result := FSeries;
end;
-function TGraphExecutor.TChannel.GetStream: IStream;
-begin
- Result := Self;
-end;
-
-function TGraphExecutor.TChannel.Subscribe(const Observer: IStreamObserver): TSubscriptionTag;
+function TCustomDataStream.Subscribe(const Observer: IStreamObserver): TSubscriptionTag;
begin
FObservers.Lock;
try
@@ -161,7 +169,7 @@ begin
end;
end;
-procedure TGraphExecutor.TChannel.Unsubscribe(Tag: TSubscriptionTag);
+procedure TCustomDataStream.Unsubscribe(Tag: TSubscriptionTag);
begin
FObservers.Lock;
try
@@ -171,25 +179,18 @@ begin
end;
end;
-procedure TGraphExecutor.TChannel.Emit(ACycle: Int64);
+procedure TCustomDataStream.Emit(const Value: array of TScalar.TValue; ACycleID: Int64);
var
signal: TStreamSignal;
begin
- FQueueLock.Enter;
- try
- FSeries.Add(FQueue.Dequeue);
- signal :=
- TStreamSignal.Create(
- if FQueue.Count > 0 then skData
- else skHeartbeat,
- ACycle
- )
- finally
- FQueueLock.Exit;
- end;
-
FObservers.Lock;
try
+ // 1. Write Data
+ FSeries.Add(Value);
+
+ // 2. Broadcast Signal
+ signal := TStreamSignal.Create(skData, ACycleID);
+
FObservers.Notify(
function(const Obs: IStreamObserver): Boolean
begin
@@ -202,63 +203,125 @@ begin
end;
end;
-function TGraphExecutor.TChannel.GetSeries: IScalarRecordSeries;
+{ TRootStream }
+
+constructor TRootStream.Create(const ADef: IScalarRecordDefinition);
begin
- Result := FSeries;
+ inherited Create(ADef);
+ FLastCycleID := 0;
end;
-{ TGraphExecutor }
-
-constructor TGraphExecutor.Create;
+procedure TRootStream.Push(const RowData: TArray);
begin
- inherited Create;
- FChannels := TDictionary.Create;
- FCycleID := 0;
+ // Root streams increment the global clock
+ Inc(FLastCycleID);
+ Emit(RowData, FLastCycleID);
end;
-destructor TGraphExecutor.Destroy;
+{ TPipeSource }
+
+constructor TPipeSource.Create(AOwner: TPipeStream; ASource: IStream);
begin
- FChannels.Free;
+ inherited Create(AOwner);
+ FSource := ASource;
+ FLastSeenCycle := -1;
+ FTag := FSource.Subscribe(Self);
+end;
+
+destructor TPipeSource.Destroy;
+begin
+ FSource.Unsubscribe(FTag);
inherited;
end;
-function TGraphExecutor.GetInputChannel(const Name: string; const Def: IScalarRecordDefinition): IInputChannel;
-var
- impl: TChannel;
+procedure TPipeSource.OnSignal(const Signal: TStreamSignal);
begin
- FLock.Enter;
- try
- if not FChannels.TryGetValue(Name, Result) then
+ if Signal.Kind = skData then
+ begin
+ FLastSeenCycle := Signal.CycleID;
+ (Controller as TPipeStream).CheckBarrierAndFire(FLastSeenCycle);
+ end;
+end;
+
+{ TPipeStream }
+
+constructor TPipeStream.Create(
+ const AConfig: TPipeConfig;
+ const ADef: IScalarRecordDefinition;
+ const ASources: TArray;
+ const ALambda: TPipeLambda
+);
+var
+ i, j, n: Integer;
+begin
+ // Pass Definition to base class
+ inherited Create(ADef);
+
+ FLambda := ALambda;
+ FLastFiredCycleID := -1;
+
+ SetLength(FSources, Length(ASources));
+
+ // Flatten Sources
+ n := 0;
+ for i := 0 to High(AConfig) do
+ inc(n, Length(AConfig[i]));
+ SetLength(FSourceSeries, n);
+
+ n := 0;
+ for i := 0 to High(ASources) do
+ begin
+ FSources[i] := TPipeSource.Create(Self, ASources[i]);
+ for j := 0 to High(AConfig[i]) do
begin
- impl := TChannel.Create(Name, TScalarRecordSeries.Create(Def));
- Result := impl;
- FChannels.Add(Name, Result);
+ // Extract the specific column series
+ FSourceSeries[n] := ASources[i].Series.Fields[AConfig[i][j].Key];
+ inc(n);
end;
- finally
- FLock.Exit;
end;
end;
-function TGraphExecutor.GetCycleID: Int64;
+destructor TPipeStream.Destroy;
begin
- Result := FCycleID;
+ for var i := High(FSources) downto 0 do
+ FSources[i].Free;
+ FSources := nil;
+ FSourceSeries := nil;
+ inherited;
end;
-procedure TGraphExecutor.Step;
+procedure TPipeStream.CheckBarrierAndFire(CurrentCycle: Int64);
var
- channelsArr: TArray;
- channel: IInputChannel;
+ resultVal: TArray;
begin
- FLock.Enter;
- try
- Inc(FCycleID);
- channelsArr := FChannels.Values.ToArray;
- finally
- FLock.Exit;
- end;
+ // We reuse the FObservers lock from the base class to protect state
+ // But since FObservers is private, we access it via method or need to make it protected.
+ // Making it protected or using a separate lock is cleaner.
+ // For now, let's assume we rely on the fact that OnSignal is usually serialized per thread
+ // or add a lock.
+ // -> Ideally, TCustomDataStream should expose Lock/Unlock or we add a Lock here.
- for channel in channelsArr do
- (channel as TChannel).Emit(FCycleID);
+ // Simplification: We assume thread safety is handled by the caller or we add a dedicated lock.
+ // For this example, let's just do the logic:
+
+ for var src in FSources do
+ if src.LastSeenCycle < CurrentCycle then
+ exit; // Barrier closed
+
+ if FLastFiredCycleID >= CurrentCycle then
+ exit; // Already fired
+
+ FLastFiredCycleID := CurrentCycle;
+
+ if Assigned(FLambda) then
+ begin
+ SetLength(resultVal, Series.Def.Count);
+ if FLambda(FSourceSeries, resultVal) then
+ begin
+ // Pass through CycleID from upstream
+ Emit(resultVal, FLastFiredCycleID);
+ end;
+ end;
end;
initialization
diff --git a/Test/AST/Test.Myc.Ast.Stream.Pipes.pas b/Test/AST/Test.Myc.Ast.Stream.Pipes.pas
deleted file mode 100644
index 7f37b73..0000000
--- a/Test/AST/Test.Myc.Ast.Stream.Pipes.pas
+++ /dev/null
@@ -1,313 +0,0 @@
-unit Test.Myc.Ast.Stream.Pipes;
-
-interface
-
-uses
- DUnitX.TestFramework,
- System.SysUtils,
- System.Generics.Collections,
- // Core Units
- Myc.Data.Scalar,
- Myc.Data.Keyword,
- Myc.Data.Value,
- Myc.Data.Series,
- Myc.Data.Stream,
- Myc.Data.Stream.Pipes,
- // AST & Compiler
- Myc.Ast,
- Myc.Ast.Nodes,
- Myc.Ast.Scope,
- Myc.Ast.Types,
- Myc.Ast.Identities,
- Myc.Ast.Script,
- Myc.Ast.Compiler.Binder,
- Myc.Ast.Compiler.TypeChecker,
- Myc.Ast.Evaluator;
-
-type
- // Helper: Captures compiler errors so we can assert on them
- TCapturingLog = class(TInterfacedObject, ICompilerLog)
- private
- FErrors: TList;
- public
- constructor Create;
- destructor Destroy; override;
- procedure Add(ALevel: TCompilerErrorLevel; const AMessage: string; const ANode: IAstNode = nil);
- procedure AddError(const AMessage: string; const ANode: IAstNode = nil);
- procedure AddWarning(const AMessage: string; const ANode: IAstNode = nil);
- function HasErrors: Boolean;
- function GetEntryCount: Integer;
- function GetEntries: TArray;
- property Errors: TList read FErrors;
- end;
-
- // Helper: Collects stream output for assertions
- TDataCollector = class(TInterfacedObject, IStreamObserver)
- private
- FStream: IStream;
- FLastRecord: IScalarRecord;
- FSignalCount: Integer;
- public
- constructor Create(AStream: IStream);
- procedure OnSignal(const Signal: TStreamSignal);
- property LastRecord: IScalarRecord read FLastRecord;
- property SignalCount: Integer read FSignalCount;
- end;
-
- [TestFixture]
- TPipeIntegrationTests = class
- private
- FGraph: IGraphExecutor;
- FLog: TCapturingLog;
- FRootLayout: IScopeLayout;
- FRootScope: IExecutionScope;
- FInputChannel: IInputChannel;
-
- // Simulates the Host Application setting up the environment ('btc' variable)
- procedure SetupHostEnvironment;
- // Compiles and Runs a script source
- function CompileAndRun(const Source: string): IStream;
- public
- [Setup]
- procedure Setup;
- [Teardown]
- procedure Teardown;
-
- [Test]
- procedure Test_Simple_Pipe_Throughput;
-
- [Test]
- procedure Test_Pipe_Field_Mapping_And_Calculation;
- end;
-
-implementation
-
-{ TCapturingLog }
-
-constructor TCapturingLog.Create;
-begin
- FErrors := TList.Create;
-end;
-
-destructor TCapturingLog.Destroy;
-begin
- FErrors.Free;
- inherited;
-end;
-
-procedure TCapturingLog.Add(ALevel: TCompilerErrorLevel; const AMessage: string; const ANode: IAstNode);
-begin
- if ALevel = elError then
- FErrors.Add(AMessage);
-end;
-
-procedure TCapturingLog.AddError(const AMessage: string; const ANode: IAstNode);
-begin
- Add(elError, AMessage, ANode);
-end;
-
-procedure TCapturingLog.AddWarning(const AMessage: string; const ANode: IAstNode);
-begin
- // Ignore warnings for tests
-end;
-
-function TCapturingLog.GetEntries: TArray;
-begin
- Result := nil;
-end;
-
-function TCapturingLog.GetEntryCount: Integer;
-begin
- Result := FErrors.Count;
-end;
-
-function TCapturingLog.HasErrors: Boolean;
-begin
- Result := FErrors.Count > 0;
-end;
-
-{ TDataCollector }
-
-constructor TDataCollector.Create(AStream: IStream);
-begin
- FStream := AStream;
- FSignalCount := 0;
- FLastRecord := nil;
-end;
-
-procedure TDataCollector.OnSignal(const Signal: TStreamSignal);
-var
- scalarVal: TScalar;
-begin
- if Signal.Kind = skData then
- begin
- Inc(FSignalCount);
- // Grab the latest item from the series
- if FStream.Series.Count > 0 then
- begin
- scalarVal := FStream.Series.Items[FStream.Series.Count - 1];
- // FIX: Cast TScalar to TDataValue to access AsScalarRecord
- FLastRecord := TDataValue(scalarVal).AsScalarRecord;
- end;
- end;
-end;
-
-{ TPipeIntegrationTests }
-
-procedure TPipeIntegrationTests.Setup;
-begin
- FGraph := TGraphExecutor.Create;
- FLog := TCapturingLog.Create;
- SetupHostEnvironment;
-end;
-
-procedure TPipeIntegrationTests.Teardown;
-begin
- FGraph := nil; // Interfaces release automatically
- FLog.Free; // Class implementation needs free (ref counting mixed usage)
-end;
-
-procedure TPipeIntegrationTests.SetupHostEnvironment;
-var
- btcDef: IScalarRecordDefinition;
- btcType: IStaticType;
- typeDesc: IScopeDescriptor;
- btcSlot: Integer;
- scopeBuilder: IScopeBuilder;
-begin
- // 1. Create the physical Input Channel in the Graph
- // FIX: Use TKeywordRegistry.Intern for Keywords
- // FIX: Using TScalarRecordDefinition class (check if renamed to TRecordDef in your codebase)
- btcDef :=
- TScalarRecordDefinition.Create(
- [
- TScalarRecordField.Create(TKeywordRegistry.Intern('Close'), skInt64),
- TScalarRecordField.Create(TKeywordRegistry.Intern('Open'), skInt64)
- ]
- );
- FInputChannel := FGraph.GetInputChannel('btc', btcDef);
-
- // 2. Prepare the Compiler Environment (Symbol Table)
- // FIX: Use Builder to define symbols
- scopeBuilder := TScope.CreateBuilder(nil);
- btcSlot := scopeBuilder.Define('btc');
- FRootLayout := scopeBuilder.Build;
-
- // 3. Prepare Type Information
- // Tell the TypeChecker that 'btc' is a RecordSeries with Open/Close fields
- btcType := TTypes.CreateRecordSeries(btcDef);
- typeDesc := TScope.CreateDescriptor(FRootLayout, [btcType]);
-
- // 4. Prepare Runtime Scope
- // Create scope and inject the actual Stream object into slot 0
- FRootScope := TScope.CreateScope(nil, typeDesc, nil);
- FRootScope.DefineBoxed(btcSlot, TDataValue.FromStream(FInputChannel.Stream));
-end;
-
-function TPipeIntegrationTests.CompileAndRun(const Source: string): IStream;
-var
- rawAst, boundAst, typedAst: IAstNode;
- evaluator: IEvaluatorVisitor;
- res: TDataValue;
-begin
- // 1. Parse
- try
- rawAst := TAstScript.Parse(Source);
- except
- on E: Exception do
- Assert.Fail('Parsing failed: ' + E.Message);
- end;
-
- // 2. Bind
- boundAst := TAstBinder.Bind(FRootLayout, rawAst, FRootLayout, FLog);
- if FLog.HasErrors then
- Assert.Fail('Binding failed: ' + FLog.Errors[0]);
-
- // 3. TypeCheck
- typedAst := TTypeChecker.CheckTypes(boundAst, FRootLayout, FRootScope, FLog);
- if FLog.HasErrors then
- Assert.Fail('TypeCheck failed: ' + FLog.Errors[0]);
-
- // 4. Evaluate
- evaluator := TEvaluatorVisitor.Create(FRootScope);
- res := evaluator.Execute(typedAst);
-
- Assert.AreEqual(vkStream, res.Kind, 'Evaluation did not return a Stream');
- Result := res.AsStream;
-end;
-
-procedure TPipeIntegrationTests.Test_Simple_Pipe_Throughput;
-var
- pipeStream: IStream;
- observer: TDataCollector;
- inputData: IKeywordMapping;
-begin
- // A simple pipe that just passes 'Close' through as 'Val'
- var source := '(pipe [btc [:Close]] (fn [c] { :Val c }))';
-
- pipeStream := CompileAndRun(source);
-
- // Attach Observer
- observer := TDataCollector.Create(pipeStream);
- pipeStream.Subscribe(observer);
-
- // --- Step 1: Input 100 ---
- inputData := TKeywordMapping.Create([TPair.Create(TKeywordRegistry.Intern('Close'), 100)]);
- FInputChannel.Push(inputData);
-
- FGraph.Step;
-
- // Assertions
- Assert.AreEqual(1, observer.SignalCount, 'Should have received 1 signal');
- Assert.IsNotNull(observer.LastRecord, 'Record should not be nil');
- Assert.AreEqual(Int64(100), observer.LastRecord.Fields[TKeywordRegistry.Intern('Val')].Value.AsInt64, 'Output Value wrong');
-
- // --- Step 2: Input 200 ---
- inputData := TKeywordMapping.Create([TPair.Create(TKeywordRegistry.Intern('Close'), 200)]);
- FInputChannel.Push(inputData);
-
- FGraph.Step;
-
- Assert.AreEqual(2, observer.SignalCount);
- Assert.AreEqual(Int64(200), observer.LastRecord.Fields[TKeywordRegistry.Intern('Val')].Value.AsInt64);
-end;
-
-procedure TPipeIntegrationTests.Test_Pipe_Field_Mapping_And_Calculation;
-var
- pipeStream: IStream;
- observer: TDataCollector;
- inputData: IKeywordMapping;
-begin
- // A pipe that takes Open and Close, calculates the delta, and renames fields
- // fn params: o -> Open, c -> Close
- var source := '(pipe [btc [:Open :Close]] (fn [o c] { :Delta (- c o) :Original c }))';
-
- pipeStream := CompileAndRun(source);
- observer := TDataCollector.Create(pipeStream);
- pipeStream.Subscribe(observer);
-
- // Input: Open=100, Close=110 -> Delta should be 10
- inputData :=
- TKeywordMapping.Create(
- [
- TPair.Create(TKeywordRegistry.Intern('Open'), 100),
- TPair.Create(TKeywordRegistry.Intern('Close'), 110)
- ]
- );
- FInputChannel.Push(inputData);
-
- FGraph.Step;
-
- Assert.AreEqual(1, observer.SignalCount);
-
- var delta := observer.LastRecord.Fields[TKeywordRegistry.Intern('Delta')].Value.AsInt64;
- var orig := observer.LastRecord.Fields[TKeywordRegistry.Intern('Original')].Value.AsInt64;
-
- Assert.AreEqual(Int64(10), delta, 'Delta calculation wrong');
- Assert.AreEqual(Int64(110), orig, 'Original value passthrough wrong');
-end;
-
-initialization
- TDUnitX.RegisterTestFixture(TPipeIntegrationTests);
-
-end.
diff --git a/Test/Demo.Finance.pas b/Test/Demo.Finance.pas
index 0ec4506..f8e677b 100644
--- a/Test/Demo.Finance.pas
+++ b/Test/Demo.Finance.pas
@@ -11,7 +11,6 @@ uses
Myc.Data.Scalar,
Myc.Data.Keyword,
Myc.Data.Stream, // IStream
- Myc.Data.Stream.Pipes, // TRootStream
Myc.Ast.Types,
Myc.Ast.Scope,
Myc.Ast;