diff --git a/src/CodeCasa.AutomationPipelines.Lights.NetDaemon/Extensions/LightPipelineFactoryExtensions.cs b/src/CodeCasa.AutomationPipelines.Lights.NetDaemon/Extensions/LightPipelineFactoryExtensions.cs
index 8c0240f..fe3d1e0 100644
--- a/src/CodeCasa.AutomationPipelines.Lights.NetDaemon/Extensions/LightPipelineFactoryExtensions.cs
+++ b/src/CodeCasa.AutomationPipelines.Lights.NetDaemon/Extensions/LightPipelineFactoryExtensions.cs
@@ -1,4 +1,5 @@
using CodeCasa.AutomationPipelines.Lights.Pipeline;
+using CodeCasa.Lights.NetDaemon;
using CodeCasa.Lights.NetDaemon.Extensions;
using NetDaemon.HassModel.Entities;
@@ -17,7 +18,7 @@ public static class LightPipelineFactoryExtensions
/// An action to configure the pipeline behavior.
/// An async disposable representing the created pipeline(s) that can be disposed to clean up resources.
public static IAsyncDisposable SetupLightPipeline(this LightPipelineFactory lightPipelineFactory, ILightEntityCore lightEntity,
- Action pipelineBuilder)
+ Action> pipelineBuilder)
{
return lightPipelineFactory.SetupLightPipeline(lightEntity.AsLight(), pipelineBuilder);
}
diff --git a/src/CodeCasa.AutomationPipelines.Lights.NetDaemon/Extensions/LightTransitionCycleConfiguratorExtensions.cs b/src/CodeCasa.AutomationPipelines.Lights.NetDaemon/Extensions/LightTransitionCycleConfiguratorExtensions.cs
index 6449c5f..6a10b3e 100644
--- a/src/CodeCasa.AutomationPipelines.Lights.NetDaemon/Extensions/LightTransitionCycleConfiguratorExtensions.cs
+++ b/src/CodeCasa.AutomationPipelines.Lights.NetDaemon/Extensions/LightTransitionCycleConfiguratorExtensions.cs
@@ -1,4 +1,5 @@
using CodeCasa.AutomationPipelines.Lights.Cycle;
+using CodeCasa.Lights.NetDaemon;
using CodeCasa.Lights.NetDaemon.Extensions;
using NetDaemon.HassModel.Entities;
@@ -17,8 +18,8 @@ public static class LightTransitionCycleConfiguratorExtensions
/// An action to configure the cycle for this specific light.
/// Specifies the behavior for lights not included in this scoped configuration. Defaults to .
/// The configurator instance for method chaining.
- public static ILightTransitionCycleConfigurator ForLight(this ILightTransitionCycleConfigurator configurator,
- ILightEntityCore lightEntity, Action configure,
+ public static ILightTransitionCycleConfigurator ForLight(this ILightTransitionCycleConfigurator configurator,
+ ILightEntityCore lightEntity, Action> configure,
ExcludedLightBehaviours excludedLightBehaviour = ExcludedLightBehaviours.None)
{
return configurator.ForLight(lightEntity.AsLight(), configure, excludedLightBehaviour);
@@ -32,8 +33,8 @@ public static ILightTransitionCycleConfigurator ForLight(this ILightTransitionCy
/// An action to configure the cycle for these lights.
/// Specifies the behavior for lights not included in this scoped configuration. Defaults to .
/// The configurator instance for method chaining.
- public static ILightTransitionCycleConfigurator ForLights(this ILightTransitionCycleConfigurator configurator,
- IEnumerable lightEntities, Action configure,
+ public static ILightTransitionCycleConfigurator ForLights(this ILightTransitionCycleConfigurator configurator,
+ IEnumerable lightEntities, Action> configure,
ExcludedLightBehaviours excludedLightBehaviour = ExcludedLightBehaviours.None)
{
return configurator.ForLights(lightEntities.Select(l => l.AsLight()), configure, excludedLightBehaviour);
diff --git a/src/CodeCasa.AutomationPipelines.Lights.NetDaemon/Extensions/LightTransitionPipelineConfiguratorExtensions.cs b/src/CodeCasa.AutomationPipelines.Lights.NetDaemon/Extensions/LightTransitionPipelineConfiguratorExtensions.cs
index 9483207..462b5f4 100644
--- a/src/CodeCasa.AutomationPipelines.Lights.NetDaemon/Extensions/LightTransitionPipelineConfiguratorExtensions.cs
+++ b/src/CodeCasa.AutomationPipelines.Lights.NetDaemon/Extensions/LightTransitionPipelineConfiguratorExtensions.cs
@@ -1,4 +1,5 @@
using CodeCasa.AutomationPipelines.Lights.Pipeline;
+using CodeCasa.Lights.NetDaemon;
using CodeCasa.Lights.NetDaemon.Extensions;
using NetDaemon.HassModel.Entities;
@@ -16,8 +17,8 @@ public static class LightTransitionPipelineConfiguratorExtensions
/// The NetDaemon light entity to configure.
/// An action to configure the pipeline for this specific light.
/// The configurator instance for method chaining.
- public static ILightTransitionPipelineConfigurator ForLight(this ILightTransitionPipelineConfigurator configurator,
- ILightEntityCore lightEntity, Action compositeNodeBuilder)
+ public static ILightTransitionPipelineConfigurator ForLight(this ILightTransitionPipelineConfigurator configurator,
+ ILightEntityCore lightEntity, Action> compositeNodeBuilder)
{
return configurator.ForLight(lightEntity.AsLight(), compositeNodeBuilder);
}
@@ -29,8 +30,8 @@ public static ILightTransitionPipelineConfigurator ForLight(this ILightTransitio
/// The NetDaemon light entities to configure.
/// An action to configure the pipeline for these lights.
/// The configurator instance for method chaining.
- public static ILightTransitionPipelineConfigurator ForLights(this ILightTransitionPipelineConfigurator configurator,
- IEnumerable lightEntities, Action compositeNodeBuilder)
+ public static ILightTransitionPipelineConfigurator ForLights(this ILightTransitionPipelineConfigurator configurator,
+ IEnumerable lightEntities, Action> compositeNodeBuilder)
{
return configurator.ForLights(lightEntities.Select(l => l.AsLight()), compositeNodeBuilder);
}
diff --git a/src/CodeCasa.AutomationPipelines.Lights.NetDaemon/Extensions/LightTransitionReactiveNodeConfiguratorExtensions.cs b/src/CodeCasa.AutomationPipelines.Lights.NetDaemon/Extensions/LightTransitionReactiveNodeConfiguratorExtensions.cs
index 01b93d4..e54e1bc 100644
--- a/src/CodeCasa.AutomationPipelines.Lights.NetDaemon/Extensions/LightTransitionReactiveNodeConfiguratorExtensions.cs
+++ b/src/CodeCasa.AutomationPipelines.Lights.NetDaemon/Extensions/LightTransitionReactiveNodeConfiguratorExtensions.cs
@@ -1,4 +1,5 @@
using CodeCasa.AutomationPipelines.Lights.ReactiveNode;
+using CodeCasa.Lights.NetDaemon;
using CodeCasa.Lights.NetDaemon.Extensions;
using NetDaemon.HassModel.Entities;
@@ -16,9 +17,9 @@ public static class LightTransitionReactiveNodeConfiguratorExtensions
/// The NetDaemon light entity to configure.
/// An action to configure the reactive node for this specific light.
/// The configurator instance for method chaining.
- public static ILightTransitionReactiveNodeConfigurator ForLight(
- this ILightTransitionReactiveNodeConfigurator configurator,
- ILightEntityCore lightEntity, Action configure)
+ public static ILightTransitionReactiveNodeConfigurator ForLight(
+ this ILightTransitionReactiveNodeConfigurator configurator,
+ ILightEntityCore lightEntity, Action> configure)
{
return configurator.ForLight(lightEntity.AsLight(), configure);
}
@@ -30,9 +31,9 @@ public static ILightTransitionReactiveNodeConfigurator ForLight(
/// The NetDaemon light entities to configure.
/// An action to configure the reactive node for these lights.
/// The configurator instance for method chaining.
- public static ILightTransitionReactiveNodeConfigurator ForLights(
- this ILightTransitionReactiveNodeConfigurator configurator,
- IEnumerable lightEntities, Action configure)
+ public static ILightTransitionReactiveNodeConfigurator ForLights(
+ this ILightTransitionReactiveNodeConfigurator configurator,
+ IEnumerable lightEntities, Action> configure)
{
return configurator.ForLights(lightEntities.Select(l => l.AsLight()), configure);
}
diff --git a/src/CodeCasa.AutomationPipelines.Lights.NetDaemon/Extensions/LightTransitionToggleConfiguratorExtensions.cs b/src/CodeCasa.AutomationPipelines.Lights.NetDaemon/Extensions/LightTransitionToggleConfiguratorExtensions.cs
index 7bb5934..712a416 100644
--- a/src/CodeCasa.AutomationPipelines.Lights.NetDaemon/Extensions/LightTransitionToggleConfiguratorExtensions.cs
+++ b/src/CodeCasa.AutomationPipelines.Lights.NetDaemon/Extensions/LightTransitionToggleConfiguratorExtensions.cs
@@ -1,4 +1,5 @@
using CodeCasa.AutomationPipelines.Lights.Toggle;
+using CodeCasa.Lights.NetDaemon;
using CodeCasa.Lights.NetDaemon.Extensions;
using NetDaemon.HassModel.Entities;
@@ -17,8 +18,8 @@ public static class LightTransitionToggleConfiguratorExtensions
/// An action to configure the toggle for this specific light.
/// Specifies the behavior for lights not included in this scoped configuration. Defaults to .
/// The configurator instance for method chaining.
- public static ILightTransitionToggleConfigurator ForLight(this ILightTransitionToggleConfigurator configurator,
- ILightEntityCore lightEntity, Action configure,
+ public static ILightTransitionToggleConfigurator ForLight(this ILightTransitionToggleConfigurator configurator,
+ ILightEntityCore lightEntity, Action> configure,
ExcludedLightBehaviours excludedLightBehaviour = ExcludedLightBehaviours.None)
{
return configurator.ForLight(lightEntity.AsLight(), configure, excludedLightBehaviour);
@@ -32,8 +33,8 @@ public static ILightTransitionToggleConfigurator ForLight(this ILightTransitionT
/// An action to configure the toggle for these lights.
/// Specifies the behavior for lights not included in this scoped configuration. Defaults to .
/// The configurator instance for method chaining.
- public static ILightTransitionToggleConfigurator ForLights(this ILightTransitionToggleConfigurator configurator,
- IEnumerable lightEntities, Action configure,
+ public static ILightTransitionToggleConfigurator ForLights(this ILightTransitionToggleConfigurator configurator,
+ IEnumerable lightEntities, Action> configure,
ExcludedLightBehaviours excludedLightBehaviour = ExcludedLightBehaviours.None)
{
return configurator.ForLights(lightEntities.Select(l => l.AsLight()), configure, excludedLightBehaviour);
diff --git a/src/CodeCasa.AutomationPipelines.Lights/CodeCasa.AutomationPipelines.Lights.csproj b/src/CodeCasa.AutomationPipelines.Lights/CodeCasa.AutomationPipelines.Lights.csproj
index c18f3ad..5d21a86 100644
--- a/src/CodeCasa.AutomationPipelines.Lights/CodeCasa.AutomationPipelines.Lights.csproj
+++ b/src/CodeCasa.AutomationPipelines.Lights/CodeCasa.AutomationPipelines.Lights.csproj
@@ -38,6 +38,10 @@
+
+
+
+
diff --git a/src/CodeCasa.AutomationPipelines.Lights/CompositeHelper.cs b/src/CodeCasa.AutomationPipelines.Lights/CompositeHelper.cs
index dcc56af..82805a7 100644
--- a/src/CodeCasa.AutomationPipelines.Lights/CompositeHelper.cs
+++ b/src/CodeCasa.AutomationPipelines.Lights/CompositeHelper.cs
@@ -46,13 +46,13 @@ public static void ValidateLightSupported(IEnumerable lights, string sup
}
}
- public static string[] ResolveGroupsAndValidateLightsSupported(IEnumerable lights, IEnumerable supportedLightIds)
+ public static string[] ResolveGroupsAndValidateLightsSupported(IEnumerable lights, IEnumerable supportedLightIds) where TLight : ILight
{
return ValidateLightsSupported(lights.SelectMany(le => le.Flatten()).Select(l => l.Id).Distinct(), supportedLightIds);
}
- public static void ResolveGroupsAndValidateLightSupported(IEnumerable lights, string supportedLightId)
+ public static void ResolveGroupsAndValidateLightSupported(IEnumerable lights, string supportedLightId) where TLight : ILight
{
ValidateLightSupported(lights.SelectMany(le => le.Flatten()).Select(l => l.Id).Distinct(), supportedLightId);
}
diff --git a/src/CodeCasa.AutomationPipelines.Lights/Context/ILightPipelineContext.cs b/src/CodeCasa.AutomationPipelines.Lights/Context/ILightPipelineContext.cs
deleted file mode 100644
index 14f0e94..0000000
--- a/src/CodeCasa.AutomationPipelines.Lights/Context/ILightPipelineContext.cs
+++ /dev/null
@@ -1,19 +0,0 @@
-using CodeCasa.Lights;
-
-namespace CodeCasa.AutomationPipelines.Lights.Context;
-
-///
-/// Represents the context for a light pipeline, providing access to the service provider and the light being controlled.
-///
-public interface ILightPipelineContext
-{
- ///
- /// Gets the service provider instance used to resolve dependencies in the pipeline.
- ///
- IServiceProvider ServiceProvider { get; }
-
- ///
- /// Gets the light being controlled by the pipeline.
- ///
- ILight Light { get; }
-}
\ No newline at end of file
diff --git a/src/CodeCasa.AutomationPipelines.Lights/Context/LightPipelineContext.cs b/src/CodeCasa.AutomationPipelines.Lights/Context/LightPipelineContext.cs
deleted file mode 100644
index d725d59..0000000
--- a/src/CodeCasa.AutomationPipelines.Lights/Context/LightPipelineContext.cs
+++ /dev/null
@@ -1,24 +0,0 @@
-using CodeCasa.Lights;
-
-namespace CodeCasa.AutomationPipelines.Lights.Context;
-
-///
-public class LightPipelineContext : ILightPipelineContext
-{
- ///
- /// Initializes a new instance of the class.
- ///
- /// The service provider instance used to resolve dependencies in the pipeline.
- /// The light being controlled by the pipeline.
- internal LightPipelineContext(IServiceProvider serviceProvider, ILight light)
- {
- ServiceProvider = serviceProvider;
- Light = light;
- }
-
- ///
- public IServiceProvider ServiceProvider { get; }
-
- ///
- public ILight Light { get; }
-}
\ No newline at end of file
diff --git a/src/CodeCasa.AutomationPipelines.Lights/Context/LightPipelineContextProvider.cs b/src/CodeCasa.AutomationPipelines.Lights/Context/LightPipelineContextProvider.cs
deleted file mode 100644
index fd2e978..0000000
--- a/src/CodeCasa.AutomationPipelines.Lights/Context/LightPipelineContextProvider.cs
+++ /dev/null
@@ -1,22 +0,0 @@
-namespace CodeCasa.AutomationPipelines.Lights.Context
-{
- internal class LightPipelineContextProvider
- {
- private ILightPipelineContext? _lightPipelineContext;
-
- public ILightPipelineContext GetLightPipelineContext()
- {
- return _lightPipelineContext ?? throw new InvalidOperationException("Current context not set.");
- }
-
- public void SetLightPipelineContext(ILightPipelineContext context)
- {
- _lightPipelineContext = context;
- }
-
- public void ResetLight()
- {
- _lightPipelineContext = null;
- }
- }
-}
diff --git a/src/CodeCasa.AutomationPipelines.Lights/Cycle/CompositeLightTransitionCycleConfigurator.cs b/src/CodeCasa.AutomationPipelines.Lights/Cycle/CompositeLightTransitionCycleConfigurator.cs
index cff8c61..70cc764 100644
--- a/src/CodeCasa.AutomationPipelines.Lights/Cycle/CompositeLightTransitionCycleConfigurator.cs
+++ b/src/CodeCasa.AutomationPipelines.Lights/Cycle/CompositeLightTransitionCycleConfigurator.cs
@@ -1,5 +1,4 @@
-using System.Reactive.Concurrency;
-using CodeCasa.AutomationPipelines.Lights.Context;
+using System.Reactive.Concurrency;
using CodeCasa.AutomationPipelines.Lights.Extensions;
using CodeCasa.AutomationPipelines.Lights.Nodes;
using CodeCasa.Lights;
@@ -8,12 +7,13 @@
namespace CodeCasa.AutomationPipelines.Lights.Cycle;
-internal class CompositeLightTransitionCycleConfigurator(
- Dictionary activeConfigurators,
- Dictionary inactiveConfigurators)
- : ILightTransitionCycleConfigurator
+internal class CompositeLightTransitionCycleConfigurator(
+ Dictionary> activeConfigurators,
+ Dictionary> inactiveConfigurators)
+ : ILightTransitionCycleConfigurator
+ where TLight : ILight
{
- public ILightTransitionCycleConfigurator AddOff()
+ public ILightTransitionCycleConfigurator AddOff()
{
var matchesNodeState = () => activeConfigurators.Values.All(c => c.Light.IsOff());
activeConfigurators.Values.ForEach(c => c.Add(_ => matchesNodeState()));
@@ -21,27 +21,27 @@ public ILightTransitionCycleConfigurator AddOff()
return this;
}
- public ILightTransitionCycleConfigurator AddOn()
+ public ILightTransitionCycleConfigurator AddOn()
{
return Add(LightTransition.On());
}
- public ILightTransitionCycleConfigurator Add(LightParameters lightParameters, IEqualityComparer? comparer = null)
+ public ILightTransitionCycleConfigurator Add(LightParameters lightParameters, IEqualityComparer? comparer = null)
{
return Add(lightParameters.AsTransition(), comparer);
}
- public ILightTransitionCycleConfigurator Add(Func lightParametersFactory, Func matchesNodeState)
+ public ILightTransitionCycleConfigurator Add(Func lightParametersFactory, Func matchesNodeState)
{
return Add(c => lightParametersFactory(c)?.AsTransition(), matchesNodeState);
}
- public ILightTransitionCycleConfigurator Add(Func lightParametersFactory, Func matchesNodeState)
+ public ILightTransitionCycleConfigurator Add(Func lightParametersFactory, Func matchesNodeState)
{
return Add((c, t) => lightParametersFactory(c, t)?.AsTransition(), matchesNodeState);
}
- public ILightTransitionCycleConfigurator Add(LightTransition lightTransition, IEqualityComparer? comparer = null)
+ public ILightTransitionCycleConfigurator Add(LightTransition lightTransition, IEqualityComparer? comparer = null)
{
comparer ??= EqualityComparer.Default;
return Add(
@@ -51,43 +51,43 @@ public ILightTransitionCycleConfigurator Add(LightTransition lightTransition, IE
lightTransition.LightParameters)));
}
- public ILightTransitionCycleConfigurator Add(Func lightTransitionFactory, Func matchesNodeState)
+ public ILightTransitionCycleConfigurator Add(Func lightTransitionFactory, Func matchesNodeState)
{
- return Add(c => new StaticLightTransitionNode(lightTransitionFactory(c), c.ServiceProvider.GetRequiredService()), matchesNodeState);
+ return Add(c => new StaticLightTransitionNode(lightTransitionFactory(c), c.GetRequiredService()), matchesNodeState);
}
- public ILightTransitionCycleConfigurator Add(Func lightTransitionFactory, Func matchesNodeState)
+ public ILightTransitionCycleConfigurator Add(Func lightTransitionFactory, Func matchesNodeState)
{
return Add(c => new FactoryNode(t => lightTransitionFactory(c, t)), matchesNodeState);
}
- public ILightTransitionCycleConfigurator Add(Func matchesNodeState) where TNode : IPipelineNode
+ public ILightTransitionCycleConfigurator Add(Func matchesNodeState) where TNode : IPipelineNode
{
activeConfigurators.Values.ForEach(c => c.Add(matchesNodeState));
inactiveConfigurators.Values.ForEach(c => c.AddPassThrough(matchesNodeState));
return this;
}
- public ILightTransitionCycleConfigurator Add(Func> nodeFactory, Func matchesNodeState)
+ public ILightTransitionCycleConfigurator Add(Func> nodeFactory, Func matchesNodeState)
{
activeConfigurators.Values.ForEach(c => c.Add(nodeFactory, matchesNodeState));
inactiveConfigurators.Values.ForEach(c => c.AddPassThrough(matchesNodeState));
return this;
}
- public ILightTransitionCycleConfigurator AddPassThrough(Func matchesNodeState)
+ public ILightTransitionCycleConfigurator AddPassThrough(Func matchesNodeState)
{
activeConfigurators.Values.ForEach(c => c.AddPassThrough(matchesNodeState));
inactiveConfigurators.Values.ForEach(c => c.AddPassThrough(matchesNodeState));
return this;
}
- public ILightTransitionCycleConfigurator ForLight(string lightId, Action configure, ExcludedLightBehaviours excludedLightBehaviour = ExcludedLightBehaviours.None) => ForLights([lightId], configure, excludedLightBehaviour);
+ public ILightTransitionCycleConfigurator ForLight(string lightId, Action> configure, ExcludedLightBehaviours excludedLightBehaviour = ExcludedLightBehaviours.None) => ForLights([lightId], configure, excludedLightBehaviour);
- public ILightTransitionCycleConfigurator ForLight(ILight light, Action configure, ExcludedLightBehaviours excludedLightBehaviour = ExcludedLightBehaviours.None) => ForLights([light], configure, excludedLightBehaviour);
+ public ILightTransitionCycleConfigurator ForLight(TLight light, Action> configure, ExcludedLightBehaviours excludedLightBehaviour = ExcludedLightBehaviours.None) => ForLights([light], configure, excludedLightBehaviour);
- public ILightTransitionCycleConfigurator ForLights(IEnumerable lightIds,
- Action configure,
+ public ILightTransitionCycleConfigurator ForLights(IEnumerable lightIds,
+ Action> configure,
ExcludedLightBehaviours excludedLightBehaviour = ExcludedLightBehaviours.None)
{
var lightIdArray =
@@ -107,13 +107,13 @@ public ILightTransitionCycleConfigurator ForLights(IEnumerable lightIds,
return this;
}
- configure(new CompositeLightTransitionCycleConfigurator(
+ configure(new CompositeLightTransitionCycleConfigurator(
activeConfigurators.Where(kvp => lightIdArray.Contains(kvp.Key))
.ToDictionary(kvp => kvp.Key, kvp => kvp.Value), []));
return this;
}
- configure(new CompositeLightTransitionCycleConfigurator(
+ configure(new CompositeLightTransitionCycleConfigurator(
activeConfigurators.Where(kvp => lightIdArray.Contains(kvp.Key))
.ToDictionary(kvp => kvp.Key, kvp => kvp.Value),
activeConfigurators.Where(kvp => !lightIdArray.Contains(kvp.Key))
@@ -121,7 +121,7 @@ public ILightTransitionCycleConfigurator ForLights(IEnumerable lightIds,
return this;
}
- public ILightTransitionCycleConfigurator ForLights(IEnumerable lights, Action configure, ExcludedLightBehaviours excludedLightBehaviour = ExcludedLightBehaviours.None)
+ public ILightTransitionCycleConfigurator ForLights(IEnumerable lights, Action> configure, ExcludedLightBehaviours excludedLightBehaviour = ExcludedLightBehaviours.None)
{
var lightIds = CompositeHelper.ResolveGroupsAndValidateLightsSupported(lights, activeConfigurators.Keys);
return ForLights(lightIds, configure, excludedLightBehaviour);
diff --git a/src/CodeCasa.AutomationPipelines.Lights/Cycle/ILightTransitionCycleConfigurator.cs b/src/CodeCasa.AutomationPipelines.Lights/Cycle/ILightTransitionCycleConfigurator.cs
index fb53fe4..97b214e 100644
--- a/src/CodeCasa.AutomationPipelines.Lights/Cycle/ILightTransitionCycleConfigurator.cs
+++ b/src/CodeCasa.AutomationPipelines.Lights/Cycle/ILightTransitionCycleConfigurator.cs
@@ -1,4 +1,3 @@
-using CodeCasa.AutomationPipelines.Lights.Context;
using CodeCasa.Lights;
namespace CodeCasa.AutomationPipelines.Lights.Cycle
@@ -8,19 +7,20 @@ namespace CodeCasa.AutomationPipelines.Lights.Cycle
/// if the light matches a state in the cycle, it advances to the next state.
/// If the current state is not recognized, the cycle starts from the beginning.
///
- public interface ILightTransitionCycleConfigurator
+ /// The specific type of light being controlled, which must implement .
+ public interface ILightTransitionCycleConfigurator where TLight : ILight
{
///
/// Adds an "off" state to the cycle.
///
/// The configurator instance for method chaining.
- ILightTransitionCycleConfigurator AddOff();
+ ILightTransitionCycleConfigurator AddOff();
///
/// Adds an "on" state to the cycle.
///
/// The configurator instance for method chaining.
- ILightTransitionCycleConfigurator AddOn();
+ ILightTransitionCycleConfigurator AddOn();
///
/// Adds light parameters to the cycle. The cycle will advance to these parameters when the current state matches the previous entry in the cycle.
@@ -28,7 +28,7 @@ public interface ILightTransitionCycleConfigurator
/// The light parameters to add to the cycle.
/// An optional equality comparer for determining if light parameters match. If null, the default equality comparison is used.
/// The configurator instance for method chaining.
- ILightTransitionCycleConfigurator Add(LightParameters lightParameters, IEqualityComparer? comparer = null);
+ ILightTransitionCycleConfigurator Add(LightParameters lightParameters, IEqualityComparer? comparer = null);
///
/// Adds light parameters created by a factory to the cycle, with a custom state matching function.
@@ -37,7 +37,7 @@ public interface ILightTransitionCycleConfigurator
/// A factory function that creates light parameters based on the pipeline context.
/// A function that determines if the current state matches this cycle entry.
/// The configurator instance for method chaining.
- ILightTransitionCycleConfigurator Add(Func lightParametersFactory, Func matchesNodeState);
+ ILightTransitionCycleConfigurator Add(Func lightParametersFactory, Func matchesNodeState);
///
/// Adds light parameters created by a factory to the cycle, with a custom state matching function.
@@ -47,7 +47,7 @@ public interface ILightTransitionCycleConfigurator
/// A factory function that creates light parameters based on the pipeline context and current transition.
/// A function that determines if the current state matches this cycle entry.
/// The configurator instance for method chaining.
- ILightTransitionCycleConfigurator Add(Func lightParametersFactory, Func matchesNodeState);
+ ILightTransitionCycleConfigurator Add(Func lightParametersFactory, Func matchesNodeState);
///
/// Adds a light transition to the cycle. The cycle will advance to this transition when the current state matches the previous entry in the cycle.
@@ -55,7 +55,7 @@ public interface ILightTransitionCycleConfigurator
/// The light transition to add to the cycle.
/// An optional equality comparer for determining if light parameters match. If null, the default equality comparison is used.
/// The configurator instance for method chaining.
- ILightTransitionCycleConfigurator Add(LightTransition lightTransition, IEqualityComparer? comparer = null);
+ ILightTransitionCycleConfigurator Add(LightTransition lightTransition, IEqualityComparer? comparer = null);
///
/// Adds a light transition created by a factory to the cycle, with a custom state matching function.
@@ -64,7 +64,7 @@ public interface ILightTransitionCycleConfigurator
/// A factory function that creates a light transition based on the pipeline context.
/// A function that determines if the current state matches this cycle entry.
/// The configurator instance for method chaining.
- ILightTransitionCycleConfigurator Add(Func lightTransitionFactory, Func matchesNodeState);
+ ILightTransitionCycleConfigurator Add(Func lightTransitionFactory, Func matchesNodeState);
///
/// Adds a light transition created by a factory to the cycle, with a custom state matching function.
@@ -74,7 +74,7 @@ public interface ILightTransitionCycleConfigurator
/// A factory function that creates a light transition based on the pipeline context and current transition.
/// A function that determines if the current state matches this cycle entry.
/// The configurator instance for method chaining.
- ILightTransitionCycleConfigurator Add(Func lightTransitionFactory, Func matchesNodeState);
+ ILightTransitionCycleConfigurator Add(Func lightTransitionFactory, Func matchesNodeState);
///
/// Adds a pipeline node of type to the cycle, with a custom state matching function.
@@ -84,7 +84,7 @@ public interface ILightTransitionCycleConfigurator
/// The type of the pipeline node to add to the cycle.
/// A function that determines if the current state matches this cycle entry.
/// The configurator instance for method chaining.
- ILightTransitionCycleConfigurator Add(Func matchesNodeState) where TNode : IPipelineNode;
+ ILightTransitionCycleConfigurator Add(Func matchesNodeState) where TNode : IPipelineNode;
///
/// Adds a pipeline node created by a factory to the cycle, with a custom state matching function.
@@ -93,7 +93,7 @@ public interface ILightTransitionCycleConfigurator
/// A factory function that creates a pipeline node based on the pipeline context.
/// A function that determines if the current state matches this cycle entry.
/// The configurator instance for method chaining.
- ILightTransitionCycleConfigurator Add(Func> nodeFactory, Func matchesNodeState);
+ ILightTransitionCycleConfigurator Add(Func> nodeFactory, Func matchesNodeState);
///
/// Adds a pass-through state to the cycle that maintains the current light state.
@@ -101,7 +101,7 @@ public interface ILightTransitionCycleConfigurator
///
/// A function that determines if the current state matches this cycle entry.
/// The configurator instance for method chaining.
- ILightTransitionCycleConfigurator AddPassThrough(Func matchesNodeState);
+ ILightTransitionCycleConfigurator AddPassThrough(Func matchesNodeState);
///
/// Creates a scoped cycle configuration for a specific light identified by its entity ID.
@@ -110,7 +110,7 @@ public interface ILightTransitionCycleConfigurator
/// An action to configure the cycle for this specific light.
/// Specifies the behavior for lights not included in this scoped configuration. Defaults to .
/// The configurator instance for method chaining.
- ILightTransitionCycleConfigurator ForLight(string lightId, Action configure, ExcludedLightBehaviours excludedLightBehaviour = ExcludedLightBehaviours.None);
+ ILightTransitionCycleConfigurator ForLight(string lightId, Action> configure, ExcludedLightBehaviours excludedLightBehaviour = ExcludedLightBehaviours.None);
///
/// Creates a scoped cycle configuration for a specific light.
@@ -119,7 +119,7 @@ public interface ILightTransitionCycleConfigurator
/// An action to configure the cycle for this specific light.
/// Specifies the behavior for lights not included in this scoped configuration. Defaults to .
/// The configurator instance for method chaining.
- ILightTransitionCycleConfigurator ForLight(ILight light, Action configure, ExcludedLightBehaviours excludedLightBehaviour = ExcludedLightBehaviours.None);
+ ILightTransitionCycleConfigurator ForLight(TLight light, Action> configure, ExcludedLightBehaviours excludedLightBehaviour = ExcludedLightBehaviours.None);
///
/// Creates a scoped cycle configuration for multiple light entities identified by their entity IDs.
@@ -128,7 +128,7 @@ public interface ILightTransitionCycleConfigurator
/// An action to configure the cycle for these lights.
/// Specifies the behavior for lights not included in this scoped configuration. Defaults to .
/// The configurator instance for method chaining.
- ILightTransitionCycleConfigurator ForLights(IEnumerable lightIds, Action configure, ExcludedLightBehaviours excludedLightBehaviour = ExcludedLightBehaviours.None);
+ ILightTransitionCycleConfigurator ForLights(IEnumerable lightIds, Action> configure, ExcludedLightBehaviours excludedLightBehaviour = ExcludedLightBehaviours.None);
///
/// Creates a scoped cycle configuration for multiple light entities.
@@ -137,6 +137,6 @@ public interface ILightTransitionCycleConfigurator
/// An action to configure the cycle for these lights.
/// Specifies the behavior for lights not included in this scoped configuration. Defaults to .
/// The configurator instance for method chaining.
- ILightTransitionCycleConfigurator ForLights(IEnumerable lights, Action configure, ExcludedLightBehaviours excludedLightBehaviour = ExcludedLightBehaviours.None);
+ ILightTransitionCycleConfigurator ForLights(IEnumerable lights, Action> configure, ExcludedLightBehaviours excludedLightBehaviour = ExcludedLightBehaviours.None);
}
}
diff --git a/src/CodeCasa.AutomationPipelines.Lights/Cycle/LightTransitionCycleConfigurator.cs b/src/CodeCasa.AutomationPipelines.Lights/Cycle/LightTransitionCycleConfigurator.cs
index 20d476a..1cd2e06 100644
--- a/src/CodeCasa.AutomationPipelines.Lights/Cycle/LightTransitionCycleConfigurator.cs
+++ b/src/CodeCasa.AutomationPipelines.Lights/Cycle/LightTransitionCycleConfigurator.cs
@@ -1,47 +1,47 @@
-using System.Reactive.Concurrency;
-using CodeCasa.AutomationPipelines.Lights.Context;
-using CodeCasa.AutomationPipelines.Lights.Extensions;
using CodeCasa.AutomationPipelines.Lights.Nodes;
using CodeCasa.Lights;
using CodeCasa.Lights.Extensions;
+using Microsoft.Extensions.DependencyInjection;
+using System.Reactive.Concurrency;
namespace CodeCasa.AutomationPipelines.Lights.Cycle;
-internal class LightTransitionCycleConfigurator(ILight light, IScheduler scheduler) : ILightTransitionCycleConfigurator
+internal class LightTransitionCycleConfigurator(TLight light, IScheduler scheduler) : ILightTransitionCycleConfigurator
+ where TLight : ILight
{
- public ILight Light { get; } = light;
+ public TLight Light { get; } = light;
- internal List<(Func> nodeFactory, Func matchesNodeState)> CycleNodeFactories
+ internal List<(Func> nodeFactory, Func matchesNodeState)> CycleNodeFactories
{
get;
} = [];
- public ILightTransitionCycleConfigurator AddOff()
+ public ILightTransitionCycleConfigurator AddOff()
{
return Add(_ => Light.IsOff());
}
- public ILightTransitionCycleConfigurator AddOn()
+ public ILightTransitionCycleConfigurator AddOn()
{
return Add(LightTransition.On());
}
- public ILightTransitionCycleConfigurator Add(LightParameters lightParameters, IEqualityComparer? comparer = null)
+ public ILightTransitionCycleConfigurator Add(LightParameters lightParameters, IEqualityComparer? comparer = null)
{
return Add(lightParameters.AsTransition(), comparer);
}
- public ILightTransitionCycleConfigurator Add(Func lightParametersFactory, Func matchesNodeState)
+ public ILightTransitionCycleConfigurator Add(Func lightParametersFactory, Func matchesNodeState)
{
return Add(c => lightParametersFactory(c)?.AsTransition(), matchesNodeState);
}
- public ILightTransitionCycleConfigurator Add(Func lightParametersFactory, Func matchesNodeState)
+ public ILightTransitionCycleConfigurator Add(Func lightParametersFactory, Func matchesNodeState)
{
return Add((c, t) => lightParametersFactory(c, t)?.AsTransition(), matchesNodeState);
}
- public ILightTransitionCycleConfigurator Add(LightTransition lightTransition, IEqualityComparer? comparer = null)
+ public ILightTransitionCycleConfigurator Add(LightTransition lightTransition, IEqualityComparer? comparer = null)
{
comparer ??= EqualityComparer.Default;
return Add(new StaticLightTransitionNode(lightTransition, scheduler), _ => comparer.Equals(
@@ -49,48 +49,48 @@ public ILightTransitionCycleConfigurator Add(LightTransition lightTransition, IE
lightTransition.LightParameters));
}
- public ILightTransitionCycleConfigurator Add(Func lightTransitionFactory, Func matchesNodeState)
+ public ILightTransitionCycleConfigurator Add(Func lightTransitionFactory, Func matchesNodeState)
{
return Add(c => new StaticLightTransitionNode(lightTransitionFactory(c), scheduler), matchesNodeState);
}
- public ILightTransitionCycleConfigurator Add(Func lightTransitionFactory, Func matchesNodeState)
+ public ILightTransitionCycleConfigurator Add(Func lightTransitionFactory, Func matchesNodeState)
{
return Add(c => new FactoryNode(t => lightTransitionFactory(c, t)), matchesNodeState);
}
- public ILightTransitionCycleConfigurator Add(Func matchesNodeState) where TNode : IPipelineNode
+ public ILightTransitionCycleConfigurator Add(Func matchesNodeState) where TNode : IPipelineNode
{
- return Add(c => c.ServiceProvider.CreateInstanceWithinContext(c), matchesNodeState);
+ return Add(c => ActivatorUtilities.CreateInstance(c), matchesNodeState);
}
- public ILightTransitionCycleConfigurator Add(IPipelineNode node, Func matchesNodeState)
+ public ILightTransitionCycleConfigurator Add(IPipelineNode node, Func matchesNodeState)
{
return Add(_ => node, matchesNodeState);
}
- public ILightTransitionCycleConfigurator Add(Func> nodeFactory, Func matchesNodeState)
+ public ILightTransitionCycleConfigurator Add(Func> nodeFactory, Func