Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Enabling multiple triggers for the same state if they have different conditional predicates #7

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -188,4 +188,5 @@ FakesAssemblies/
# LightSwitch generated files
GeneratedArtifacts/
_Pvt_Extensions/
ModelManifest.xml
ModelManifest.xml
*.userprefs
134 changes: 79 additions & 55 deletions LiquidState/Configuration/AwaitableStateConfigurationHelper.cs

Large diffs are not rendered by default.

74 changes: 46 additions & 28 deletions LiquidState/Configuration/StateConfigurationHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
using System;
using System.Collections.Generic;
using System.Diagnostics.Contracts;
using System.Linq;
using LiquidState.Common;
using LiquidState.Representations;

Expand All @@ -17,15 +18,14 @@ public class StateConfigurationHelper<TState, TTrigger>
private readonly StateRepresentation<TState, TTrigger> currentStateRepresentation;

internal StateConfigurationHelper(Dictionary<TState, StateRepresentation<TState, TTrigger>> config,
TState currentState)
TState currentState)
{
Contract.Requires(config != null);
Contract.Requires(currentState != null);

Contract.Ensures(this.config != null);
Contract.Ensures(currentStateRepresentation != null);


this.config = config;
currentStateRepresentation = FindOrCreateStateRepresentation(currentState, config);
}
Expand Down Expand Up @@ -76,7 +76,7 @@ public StateConfigurationHelper<TState, TTrigger> PermitReentryIf(Func<bool> pre
}

public StateConfigurationHelper<TState, TTrigger> PermitReentryIf(Func<bool> predicate, TTrigger trigger,
Action onEntryAction)
Action onEntryAction)
{
Contract.Requires(trigger != null);
Contract.Assume(currentStateRepresentation.State != null);
Expand All @@ -85,8 +85,8 @@ public StateConfigurationHelper<TState, TTrigger> PermitReentryIf(Func<bool> pre
}

public StateConfigurationHelper<TState, TTrigger> PermitReentryIf<TArgument>(Func<bool> predicate,
ParameterizedTrigger<TTrigger, TArgument> trigger,
Action<TArgument> onEntryAction)
ParameterizedTrigger<TTrigger, TArgument> trigger,
Action<TArgument> onEntryAction)
{
Contract.Requires(trigger != null);
Contract.Assume(currentStateRepresentation.State != null);
Expand Down Expand Up @@ -117,7 +117,7 @@ public StateConfigurationHelper<TState, TTrigger> IgnoreIf(Func<bool> predicate,
}

public StateConfigurationHelper<TState, TTrigger> Permit(TTrigger trigger, TState resultingState,
Action onEntryAction)
Action onEntryAction)
{
Contract.Requires(trigger != null);
Contract.Requires(resultingState != null);
Expand All @@ -136,7 +136,7 @@ public StateConfigurationHelper<TState, TTrigger> Permit<TArgument>(
}

public StateConfigurationHelper<TState, TTrigger> PermitIf(Func<bool> predicate, TTrigger trigger,
TState resultingState)
TState resultingState)
{
Contract.Requires(trigger != null);
Contract.Requires(resultingState != null);
Expand All @@ -145,7 +145,7 @@ public StateConfigurationHelper<TState, TTrigger> PermitIf(Func<bool> predicate,
}

public StateConfigurationHelper<TState, TTrigger> PermitIf(Func<bool> predicate, TTrigger trigger,
TState resultingState, Action onEntryAction)
TState resultingState, Action onEntryAction)
{
Contract.Requires(trigger != null);
Contract.Requires(resultingState != null);
Expand All @@ -154,8 +154,8 @@ public StateConfigurationHelper<TState, TTrigger> PermitIf(Func<bool> predicate,
}

public StateConfigurationHelper<TState, TTrigger> PermitIf<TArgument>(Func<bool> predicate,
ParameterizedTrigger<TTrigger, TArgument> trigger,
TState resultingState, Action<TArgument> onEntryAction)
ParameterizedTrigger<TTrigger, TArgument> trigger,
TState resultingState, Action<TArgument> onEntryAction)
{
Contract.Requires(trigger != null);
Contract.Requires(resultingState != null);
Expand All @@ -164,7 +164,7 @@ public StateConfigurationHelper<TState, TTrigger> PermitIf<TArgument>(Func<bool>
}

internal static StateRepresentation<TState, TTrigger> FindOrCreateStateRepresentation(TState state,
Dictionary<TState, StateRepresentation<TState, TTrigger>> config)
Dictionary<TState, StateRepresentation<TState, TTrigger>> config)
{
Contract.Requires(state != null);
Contract.Requires(config != null);
Expand All @@ -184,38 +184,56 @@ internal static StateRepresentation<TState, TTrigger> FindOrCreateStateRepresent
}

internal static TriggerRepresentation<TTrigger, TState> FindOrCreateTriggerRepresentation(TTrigger trigger,
StateRepresentation<TState, TTrigger> stateRepresentation)
Func<bool> predicate,
StateRepresentation<TState, TTrigger> stateRepresentation)
{
Contract.Requires(stateRepresentation != null);
Contract.Requires(trigger != null);

Contract.Ensures(Contract.Result<TriggerRepresentation<TTrigger, TState>>() != null);

var rep = FindTriggerRepresentation(trigger, stateRepresentation);
if (rep != null)
var repList = FindTriggerRepresentation(trigger, stateRepresentation);
if (repList != null && repList.Count == 1)
{
Contract.Assume(rep.Trigger != null);
return rep;
var rep = repList[0];
if (rep.ConditionalTriggerPredicate == predicate)
{
Contract.Assume(rep.Trigger != null);
return rep;
}
}

foreach (var rep in repList)
{
if (rep.Trigger.Equals(trigger) &&
rep.ConditionalTriggerPredicate == predicate)
{
Contract.Assume(rep.Trigger != null);
return rep;
}
}

rep = new TriggerRepresentation<TTrigger, TState>(trigger);
stateRepresentation.Triggers.Add(rep);
return rep;
var newRep = new TriggerRepresentation<TTrigger, TState>(trigger);
stateRepresentation.Triggers.Add(newRep, null);
return newRep;
}

internal static TriggerRepresentation<TTrigger, TState> FindTriggerRepresentation(TTrigger trigger,
StateRepresentation<TState, TTrigger> stateRepresentation)
internal static List<TriggerRepresentation<TTrigger, TState>> FindTriggerRepresentation(TTrigger trigger,
StateRepresentation<TState, TTrigger> stateRepresentation)
{
return stateRepresentation.Triggers.Find(x => x.Trigger.Equals(trigger));
var list = from state in stateRepresentation.Triggers
where state.Key.Trigger.Equals(trigger)
select state.Key;
return list.ToList();
}

private StateConfigurationHelper<TState, TTrigger> PermitInternal(Func<bool> predicate, TTrigger trigger,
TState resultingState, Action onEntryAction)
TState resultingState, Action onEntryAction)
{
Contract.Requires<ArgumentNullException>(trigger != null);
Contract.Requires<ArgumentNullException>(resultingState != null);

var rep = FindOrCreateTriggerRepresentation(trigger, currentStateRepresentation);
var rep = FindOrCreateTriggerRepresentation(trigger, predicate, currentStateRepresentation);

rep.NextStateRepresentation = FindOrCreateStateRepresentation(resultingState, config);
rep.OnTriggerAction = onEntryAction;
Expand All @@ -225,15 +243,15 @@ private StateConfigurationHelper<TState, TTrigger> PermitInternal(Func<bool> pre
}

private StateConfigurationHelper<TState, TTrigger> PermitInternal<TArgument>(Func<bool> predicate,
ParameterizedTrigger<TTrigger, TArgument> trigger,
TState resultingState, Action<TArgument> onEntryAction)
ParameterizedTrigger<TTrigger, TArgument> trigger,
TState resultingState, Action<TArgument> onEntryAction)
{
Contract.Requires<ArgumentNullException>(trigger != null);
Contract.Requires<ArgumentNullException>(resultingState != null);

Contract.Assume(trigger.Trigger != null);

var rep = FindOrCreateTriggerRepresentation(trigger.Trigger, currentStateRepresentation);
var rep = FindOrCreateTriggerRepresentation(trigger.Trigger, predicate, currentStateRepresentation);

rep.NextStateRepresentation = FindOrCreateStateRepresentation(resultingState, config);
rep.OnTriggerAction = onEntryAction;
Expand All @@ -246,7 +264,7 @@ private StateConfigurationHelper<TState, TTrigger> IgnoreInternal(Func<bool> pre
{
Contract.Requires<ArgumentNullException>(trigger != null);

var rep = FindOrCreateTriggerRepresentation(trigger, currentStateRepresentation);
var rep = FindOrCreateTriggerRepresentation(trigger, predicate, currentStateRepresentation);

rep.NextStateRepresentation = null;
rep.ConditionalTriggerPredicate = predicate;
Expand Down
Loading