diff --git a/src/EcsPipeline.Builder.cs b/src/EcsPipeline.Builder.cs index cec6ecb..22457e7 100644 --- a/src/EcsPipeline.Builder.cs +++ b/src/EcsPipeline.Builder.cs @@ -37,13 +37,51 @@ namespace DCFApixels.DragonECS private readonly List _initDeclaredRunners = new List(4); public readonly LayersMap Layers; - public readonly Injector.Builder Injector; + public readonly InitInjector Injector; public readonly Configurator Configs; private AddParams _defaultAddParams = new AddParams(BASIC_LAYER, 0, false); private HashSet _uniqueSystemsSet = new HashSet(); + + #region InitInjector + public readonly struct InitInjector + { + public readonly Injector.Builder Instance; + public readonly Builder PipelineBuilder; + public InitInjector(Injector.Builder instance, Builder pipelineBuilder) + { + Instance = instance; + PipelineBuilder = pipelineBuilder; + } + public Builder AddNode() + { + Instance.AddNode(); + return PipelineBuilder; + } + public Builder Inject(T obj) + { + Instance.Inject(obj); + return PipelineBuilder; + } + public Builder Extract(ref T obj) + { + Instance.Extract(ref obj); + return PipelineBuilder; + } + public Builder Add(Injector.Builder other) + { + Instance.Add(other); + return PipelineBuilder; + } + public Injector Build(EcsPipeline pipeline) + { + return Instance.Build(pipeline); + } + } + #endregion + #region Properties //private ReadOnlySpan SystemRecords //{ @@ -57,7 +95,8 @@ namespace DCFApixels.DragonECS if (config == null) { config = new ConfigContainer(); } Configs = new Configurator(config, this); - Injector = new Injector.Builder(this); + var injectorBuilder = new Injector.Builder(); + Injector = new InitInjector(injectorBuilder, this); Injector.AddNode(); Injector.AddNode(); Injector.AddNode(); @@ -368,7 +407,7 @@ namespace DCFApixels.DragonECS } } - EcsPipeline pipeline = new EcsPipeline(allSystems, Configs.Instance.GetContainer(), Injector); + EcsPipeline pipeline = new EcsPipeline(allSystems, Configs.Instance.GetContainer(), Injector.Instance); foreach (var item in _initDeclaredRunners) { item.Declare(pipeline); diff --git a/src/EcsPipeline.cs b/src/EcsPipeline.cs index 2eb1627..0806af7 100644 --- a/src/EcsPipeline.cs +++ b/src/EcsPipeline.cs @@ -90,7 +90,7 @@ namespace DCFApixels.DragonECS } if(injectorBuilder == null) { - injectorBuilder = new Injector.Builder(null); + injectorBuilder = new Injector.Builder(); } _configs = configs; diff --git a/src/Injections/Injector.cs b/src/Injections/Injector.cs index 3b9aa24..aa15fb5 100644 --- a/src/Injections/Injector.cs +++ b/src/Injections/Injector.cs @@ -176,21 +176,18 @@ namespace DCFApixels.DragonECS public class Builder : IInjector { - private EcsPipeline.Builder _source; private Injector _instance; private List _initInjections = new List(32); private EcsWorld _monoWorld; - internal Builder(EcsPipeline.Builder source) + internal Builder() { - _source = source; _instance = new Injector(); } - public EcsPipeline.Builder AddNode() + public void AddNode() { _instance.TryDeclare(); - return _source; } - public EcsPipeline.Builder Inject(T obj) + public void Inject(T obj) { if (obj is EcsWorld objWorld) { @@ -217,9 +214,8 @@ namespace DCFApixels.DragonECS } } _initInjections.Add(new InitInject(obj)); - return _source; } - public EcsPipeline.Builder Extract(ref T obj) // TODO проверить + public void Extract(ref T obj) // TODO проверить { Type type = typeof(T); for (int i = _initInjections.Count - 1; i >= 0; i--) @@ -228,11 +224,10 @@ namespace DCFApixels.DragonECS if (type.IsAssignableFrom(item.Type)) { obj = (T)item.Raw; - return _source; + return; } } Throw.UndefinedException(); - return default; } public Injector Build(EcsPipeline pipeline) { @@ -242,7 +237,6 @@ namespace DCFApixels.DragonECS monoWorldSystem.World = _monoWorld; } - var initInjectionCallbacks = pipeline.GetProcess(); foreach (var system in initInjectionCallbacks) { @@ -292,7 +286,7 @@ namespace DCFApixels.DragonECS } public override void InjectTo(Injector instance) { - instance.Inject(_injectedData); + instance.Inject(_injectedData); } } }