CGC_Codes

StateMachine.Async

Feb 21st, 2017
298
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.93 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Threading.Tasks;
  5.  
  6. namespace Stateless
  7. {
  8.     public partial class StateMachine<TState, TTrigger>
  9.     {
  10.        
  11.         public Task ActivateAsync()
  12.         {
  13.             var representativeState = GetRepresentation(State);
  14.             return representativeState.ActivateAsync();
  15.         }
  16.  
  17.         public Task DeactivateAsync()
  18.         {
  19.             var representativeState = GetRepresentation(State);
  20.             return representativeState.DeactivateAsync();
  21.         }
  22.  
  23.         public Task FireAsync(TTrigger trigger)
  24.         {
  25.             return InternalFireAsync(trigger, new object[0]);
  26.         }
  27.  
  28.    
  29.         public Task FireAsync<TArg0>(TriggerWithParameters<TArg0> trigger, TArg0 arg0)
  30.         {
  31.             Enforce.ArgumentNotNull(trigger, "trigger");
  32.             return InternalFireAsync(trigger.Trigger, arg0);
  33.         }
  34.  
  35.        
  36.         public Task FireAsync<TArg0, TArg1>(TriggerWithParameters<TArg0, TArg1> trigger, TArg0 arg0, TArg1 arg1)
  37.         {
  38.             Enforce.ArgumentNotNull(trigger, "trigger");
  39.             return InternalFireAsync(trigger.Trigger, arg0, arg1);
  40.         }
  41.  
  42.        
  43.         public Task FireAsync<TArg0, TArg1, TArg2>(TriggerWithParameters<TArg0, TArg1, TArg2> trigger, TArg0 arg0, TArg1 arg1, TArg2 arg2)
  44.         {
  45.             Enforce.ArgumentNotNull(trigger, "trigger");
  46.             return InternalFireAsync(trigger.Trigger, arg0, arg1, arg2);
  47.         }
  48.  
  49.         async Task InternalFireAsync(TTrigger trigger, params object[] args)
  50.         {
  51.             TriggerWithParameters configuration;
  52.             if (_triggerConfiguration.TryGetValue(trigger, out configuration))
  53.                 configuration.ValidateParameters(args);
  54.  
  55.             var source = State;
  56.             var representativeState = GetRepresentation(source);
  57.  
  58.             TriggerBehaviourResult result;
  59.             if (!representativeState.TryFindHandler(trigger, out result))
  60.             {
  61.                 await _unhandledTriggerAction.ExecuteAsync(representativeState.UnderlyingState, trigger, result?.UnmetGuardConditions);
  62.                 return;
  63.             }
  64.  
  65.             TState destination;
  66.             if (result.Handler.ResultsInTransitionFrom(source, args, out destination))
  67.             {
  68.                 var transition = new Transition(source, destination, trigger);
  69.  
  70.                 await representativeState.ExitAsync(transition);
  71.  
  72.                 State = transition.Destination;
  73.                 var newRepresentation = GetRepresentation(transition.Destination);
  74.                 await _onTransitionedEvent.InvokeAsync(transition);
  75.  
  76.                 await newRepresentation.EnterAsync(transition, args);
  77.             }
  78.             else
  79.             {
  80.                 var transition = new Transition(source, destination, trigger);
  81.  
  82.                 await CurrentRepresentation.InternalActionAsync(transition, args);
  83.             }
  84.         }
  85.  
  86.        
  87.         public void OnUnhandledTriggerAsync(Func<TState, TTrigger, Task> unhandledTriggerAction)
  88.         {
  89.             if (unhandledTriggerAction == null) throw new ArgumentNullException("unhandledTriggerAction");
  90.             _unhandledTriggerAction = new UnhandledTriggerAction.Async((s, t, c) => unhandledTriggerAction(s, t));
  91.         }
  92.  
  93.        
  94.         public void OnUnhandledTriggerAsync(Func<TState, TTrigger, ICollection<string>, Task> unhandledTriggerAction)
  95.         {
  96.             if (unhandledTriggerAction == null) throw new ArgumentNullException("unhandledTriggerAction");
  97.             _unhandledTriggerAction = new UnhandledTriggerAction.Async(unhandledTriggerAction);
  98.         }
  99.  
  100.        
  101.         public void OnTransitionedAsync(Func<Transition, Task> onTransitionAction)
  102.         {
  103.             if (onTransitionAction == null) throw new ArgumentNullException("onTransitionAction");
  104.             _onTransitionedEvent.Register(onTransitionAction);
  105.         }
  106.     }
  107. }
Advertisement
Add Comment
Please, Sign In to add comment