示例#1
2
        private StateMachine<string, char> CreateMachine()
        {
            var machine = new StateMachine<string, char>(off);

            Action log = () =>
            {
                C.WriteLine(this.color, "switched pre {1}: {0}", machine.Id, machine.State);
                //Thread.Sleep(1000);
                C.WriteLine(this.color, "switched post {1}: {0}", machine.Id, machine.State);
            };

            machine
                .Configure(off)
                .Permit(space, on)
                .OnEntry(log);
            machine
                .Configure(on)
                .Permit(space, off)
                .OnEntry(log);
            return machine;
        }
        private StateMachine<ImportFinancialGuaranteeStatus, Trigger> CreateStateMachine()
        {
            var stateMachine = new StateMachine<ImportFinancialGuaranteeStatus, Trigger>(() => Status, s => Status = s);

            stateMachine.OnTransitioned(OnTransitionAction);

            completeTrigger = stateMachine.SetTriggerParameters<DateTime>(Trigger.Complete);

            stateMachine.Configure(ImportFinancialGuaranteeStatus.ApplicationReceived)
                .Permit(Trigger.Complete, ImportFinancialGuaranteeStatus.ApplicationComplete);

            stateMachine.Configure(ImportFinancialGuaranteeStatus.ApplicationComplete)
                .OnEntryFrom(completeTrigger, OnComplete)
                .Permit(Trigger.Approve, ImportFinancialGuaranteeStatus.Approved)
                .Permit(Trigger.Refuse, ImportFinancialGuaranteeStatus.Refused);

            stateMachine.Configure(ImportFinancialGuaranteeStatus.Approved)
                .Permit(Trigger.Release, ImportFinancialGuaranteeStatus.Released);
                
            return stateMachine;
        }
		public Download ()
		{

			State = Bo.State.Waiting;
			_machine = new StateMachine<State, Transition>(() => State, s => State = s);

			_machine.Configure (Bo.State.Waiting)
				.Permit (Transition.Cancel, Bo.State.Finished)
				.Permit (Transition.Fail, Bo.State.Error)
				.Permit (Transition.Resume, Bo.State.Downloading);

			_machine.Configure (Bo.State.Downloading)
				.Permit (Transition.Pause, Bo.State.Waiting)
				.PermitReentry (Transition.Progress)
				.Permit (Transition.Cancel, Bo.State.Finished)
				.Permit (Transition.Finish, Bo.State.Finished)
				.Permit (Transition.Fail, Bo.State.Error);

			_machine.Configure (Bo.State.Finished);

			_machine.Configure (Bo.State.Error)
				.Permit (Transition.Retry, Bo.State.Waiting)
				.Permit (Transition.Cancel, Bo.State.Finished)
				.Permit (Transition.Fail, Bo.State.Finished);
		}
示例#4
1
        /* ----------------------------------------
        *           STATEMACHINE DEFINITION
        * ---------------------------------------*/

        private void CreateStateMachine()
        {
            // define strongly typed triggers (events)
            _rfqEventServerSendsQuote = _stateMachine.SetTriggerParameters<IQuote>(RfqEvent.ServerNewQuote);
            _rfqEventServerSendsExecutionReport = _stateMachine.SetTriggerParameters<IExecutionReport>(RfqEvent.ServerSendsExecutionReport);
            _rfqEventServerQuoteError = _stateMachine.SetTriggerParameters<Exception>(RfqEvent.ServerQuoteError);
            _rfqEventServerCancellationError = _stateMachine.SetTriggerParameters<Exception>(RfqEvent.ServerCancellationError);
            _rfqEventServerExecutionError = _stateMachine.SetTriggerParameters<Exception>(RfqEvent.ServerExecutionError);
            _rfqEventUserRequests = _stateMachine.SetTriggerParameters<IQuoteRequest>(RfqEvent.UserRequests);
            _rfqEventUserExecutes = _stateMachine.SetTriggerParameters<IExecutionRequest>(RfqEvent.UserExecutes);
            _rfqEventUserCancels = _stateMachine.SetTriggerParameters<long>(RfqEvent.UserCancels);

            _stateMachine.OnUnhandledTrigger(OnUnhandledTrigger);

            _stateMachine.Configure(RfqState.Input)
                .OnEntry(LogTransition)
                .Permit(RfqEvent.UserRequests, RfqState.Requesting);

            _stateMachine.Configure(RfqState.Requesting)
                .OnEntry(LogTransition)
                .OnEntryFrom(_rfqEventUserRequests, OnEntryRequesting)
                .Permit(RfqEvent.ServerNewQuote, RfqState.Quoted)
                .Permit(RfqEvent.UserCancels, RfqState.Cancelling)
                .Permit(RfqEvent.InternalError, RfqState.Error);

            _stateMachine.Configure(RfqState.Quoted)
                .OnEntry(LogTransition)
                .OnEntryFrom(_rfqEventServerSendsQuote, OnEntryQuoted)
                .PermitReentry(RfqEvent.ServerNewQuote)
                .Permit(RfqEvent.UserCancels, RfqState.Cancelling)
                .Permit(RfqEvent.UserExecutes, RfqState.Executing)
                .OnExit(OnExitQuoted);

            _stateMachine.Configure(RfqState.Executing)
                .OnEntry(LogTransition)
                .OnEntryFrom(_rfqEventUserExecutes, OnEntryExecuting)
                .Permit(RfqEvent.ServerSendsExecutionReport, RfqState.Done);

            _stateMachine.Configure(RfqState.Cancelling)
                .OnEntry(LogTransition)
                .OnEntryFrom(_rfqEventUserCancels, OnEntryCancelling)
                .Permit(RfqEvent.ServerCancelled, RfqState.Cancelled);

            _stateMachine.Configure(RfqState.Cancelled)
                .OnEntry(LogTransition)
                .OnEntry(OnEntryCancelled);

            _stateMachine.Configure(RfqState.Done)
                .OnEntry(LogTransition)
                .OnEntryFrom(_rfqEventServerSendsExecutionReport, OnEntryDone);

            _stateMachine.Configure(RfqState.Error)
                .OnEntry(LogTransition)
                .OnEntryFrom(_rfqEventServerQuoteError, OnEntryError)
                .OnEntryFrom(_rfqEventServerExecutionError, OnEntryError);
        }
示例#5
0
文件: Program.cs 项目: Horb/stateless
        static void Main(string[] args)
        {
            try
            {
                string on = "On", off = "Off";
                var space = ' ';

                var onOffSwitch = new StateMachine<string, char>(off);

                onOffSwitch.Configure(off).Permit(space, on);
                onOffSwitch.Configure(on).Permit(space, off);

                Console.WriteLine("Press <space> to toggle the switch. Any other key will raise an error.");

                while (true)
                {
                    Console.WriteLine("Switch is in state: " + onOffSwitch.State);
                    var pressed = Console.ReadKey(true).KeyChar;
                    onOffSwitch.Fire(pressed);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("Exception: " + ex.Message);
                Console.WriteLine("Press any key to continue...");
                Console.ReadKey(true);
            }
        }
示例#6
0
        public AudioController()
        {
            App.Startup();

            #region Rpc
            _acRpcServer = new AudioControllerRpcServer(this);
            _achRpcClient = new AudioControllerHandlerRpcClient();
            _audioControllerHandler = _achRpcClient.Service;
            #endregion

            _stateMachine = BuildStateMachine();
            _mediaEnvironment.RegisterDefaultCodecs();
            _playModeManager = IoC.Get<IPlayModeManager>();

            _mediaPlayer = BackgroundMediaPlayer.Current;
            _mediaPlayer.AutoPlay = false;
            _mediaPlayer.MediaOpened += mediaPlayer_MediaOpened;
            _mediaPlayer.MediaFailed += mediaPlayer_MediaFailed;
            _mediaPlayer.MediaEnded += mediaPlayer_MediaEnded;
            _playbackSession = _mediaPlayer.PlaybackSession;
            _playbackSession.PlaybackStateChanged += playbackSession_PlaybackStateChanged;
            _playbackSession.NaturalDurationChanged += playbackSession_NaturalDurationChanged;
            _playbackSession.SeekCompleted += playbackSession_SeekCompleted;

            _mtService = new MediaTransportService(_mediaPlayer.SystemMediaTransportControls);
            _mtService.IsEnabled = _mtService.IsPauseEnabled = _mtService.IsPlayEnabled = true;
            _mtService.ButtonPressed += _mtService_ButtonPressed;

            NotifyReady();
        }
示例#7
0
        private static StateMachine<ProductStatus, ProductStatus> InitializeStateMachine(ProductStatus initialState)
        {
            StateMachine<ProductStatus, ProductStatus> productStateMachine =
                new StateMachine<ProductStatus, ProductStatus>(initialState);

            productStateMachine.Configure(ProductStatus.Draft)
                .Permit(ProductStatus.WaitingForApproval, ProductStatus.WaitingForApproval);

            productStateMachine.Configure(ProductStatus.WaitingForApproval)
                .Permit(ProductStatus.Approved, ProductStatus.Approved)
                .Permit(ProductStatus.Cancelled, ProductStatus.Cancelled);

            productStateMachine.Configure(ProductStatus.Approved)
                .Permit(ProductStatus.Active, ProductStatus.Active)
                .Permit(ProductStatus.Passive, ProductStatus.Passive)
                .Permit(ProductStatus.Cancelled, ProductStatus.Cancelled);

            productStateMachine.Configure(ProductStatus.Active)
                .Permit(ProductStatus.Passive, ProductStatus.Passive)
                .Permit(ProductStatus.Cancelled, ProductStatus.Cancelled);

            productStateMachine.Configure(ProductStatus.Passive)
                .Permit(ProductStatus.Active, ProductStatus.Active)
                .Permit(ProductStatus.Cancelled, ProductStatus.Cancelled);

            // Allow none of the options for AccommodationPropertyStatus.Cancelled;

            return productStateMachine;
        }
 public ImportNotificationAssessment(Guid notificationId)
 {
     NotificationApplicationId = notificationId;
     Dates = new ImportNotificationDates();
     Status = ImportNotificationStatus.New;
     stateMachine = CreateStateMachine();
 }
        internal static StateMachine<State, Trigger> GetStateMachine()
        {
            var machine = new StateMachine<State, Trigger>(State.WaitingForStart);

            machine.Configure(State.WaitingForStart)
                .Permit(Trigger.DataLinkEscapeRead, State.Started);

            machine.Configure(State.Started)
                .Permit(Trigger.StartOfTextRead, State.ReadingMessageType)
                .Permit(Trigger.UnexpectedCharacter, State.WaitingForStart);

            machine.Configure(State.ReadingMessageType)
                .Permit(Trigger.MessageTypeRead, State.ReadingMessageLength)
                .Permit(Trigger.UnexpectedCharacter, State.WaitingForStart);

            machine.Configure(State.ReadingMessageLength)
                .Permit(Trigger.MessageLengthRead, State.BuildingMessage);

            machine.Configure(State.BuildingMessage)
                .Permit(Trigger.MessageTextRead, State.ReadingCheckSum);

            machine.Configure(State.ReadingCheckSum)
                .Permit(Trigger.CheckSumPassed, State.CheckSumRead)
                .Permit(Trigger.CheckSumFailed, State.WaitingForStart);

            machine.Configure(State.CheckSumRead)
                .Permit(Trigger.DataLinkEscapeRead, State.MessageDone)
                .Permit(Trigger.UnexpectedCharacter, State.WaitingForStart);

            machine.Configure(State.MessageDone)
                .Permit(Trigger.MessageFinished, State.WaitingForStart)
                .Permit(Trigger.UnexpectedCharacter, State.WaitingForStart);

            return machine;
        }
示例#10
0
文件: Bug.cs 项目: fraschfn/stateless
        public Bug(string title)
        {
            _title = title;

            var _machine = StateMachine<State, Trigger>.Create(() => _state, s => _state = s);

            _assignTrigger = _machine.SetTriggerParameters<string>(Trigger.Assign);

            _machine.Configure(State.Open)
                .Permit(Trigger.Assign, State.Assigned);

            _machine.Configure(State.Assigned)
                .SubstateOf(State.Open)
                .OnEntryFrom(_assignTrigger, assignee => OnAssigned(assignee))
                .PermitReentry(Trigger.Assign)
                .Permit(Trigger.Close, State.Closed)
                .Permit(Trigger.Defer, State.Deferred)
                .OnExit(() => OnDeassigned());

            _machine.Configure(State.Deferred)
                .OnEntry(() => _assignee = null)
                .Permit(Trigger.Assign, State.Assigned);

            this._machine = _machine.FinishConfiguration();
        }
示例#11
0
        public MainLogicProcessor()
        {
            VisionData = new VisionData();
            SensorData = new SensorData();

            stateMachine = new StateMachine<State, Trigger>(State.LookingForBall);

            stateMachine.Configure(State.LookingForBall)
                .Permit(Trigger.CameraLockedOnBall, State.ClosingInOnBall)
                .Permit(Trigger.BallCaught, State.FindingGoal)
                .OnEntry(StopTimer);

            stateMachine.Configure(State.ClosingInOnBall)
                .Permit(Trigger.CameraLostBall, State.LookingForBall)
                .Permit(Trigger.BallCaught, State.FindingGoal)
                .Permit(Trigger.Timeout, State.LookingForBall)
                .OnEntry(() => StartTimer(10000, Trigger.Timeout))
                .OnExit(StopTimer);

            stateMachine.Configure(State.FindingGoal)
                .Permit(Trigger.CoilgunLaunched, State.LookingForBall)
                .Permit(Trigger.BallLost, State.LookingForBall)
                .Permit(Trigger.Timeout, State.LookingForBall)
                .OnEntry(() => StartTimer(5000, Trigger.Timeout))
                .OnExit(StopTimer);
        }
示例#12
0
        /// <summary>
        /// Set up the StateMachine for this workflow by adding States and Triggers
        /// specified in StateConfigs
        /// </summary>
        /// <returns>WorkflowProcessor for fluent interface</returns>
        public WorkflowProcessor ConfigureStateMachine()
        {
            Enforce.That(string.IsNullOrEmpty(this.step.State) == false,
                            "WorkflowProcessor.Confgiure - step.State can not be empty");

            this.stateMachine = new StateMachine<string, string>(this.step.State);

            //  Get a distinct list of states with a trigger from state configuration
            //  "State => Trigger => TargetState
            var states = this.workflow.StateConfigs.AsQueryable()
                                    .Select(x => x.State)
                                    .Distinct()
                                    .Select(x => x)
                                    .ToList();

            //  Assing triggers to states
            states.ForEach(state =>
            {
                var triggers = this.workflow.StateConfigs.AsQueryable()
                                   .Where(config => config.State == state)
                                   .Select(config => new { Trigger = config.Trigger, TargeState = config.TargetState })
                                   .ToList();

                triggers.ForEach(trig =>
                {
                    this.stateMachine.Configure(state).Permit(trig.Trigger, trig.TargeState);
                });
            });

            return this;
        }
 /// <summary>
 /// Constructor
 /// </summary>
 /// <param name="transition">The transition object that was created for the state change</param>
 public ReplicationStateTransition(StateMachine<ReplicationState, ReplicationTrigger>.Transition transition)
 {
     if (transition != null) {
         Source = transition.Source;
         Destination = transition.Destination;
         Trigger = transition.Trigger;
     }
 }
 internal FinancialGuarantee(DateTime receivedDate)
 {
     CreatedDate = new DateTimeOffset(SystemTime.UtcNow, TimeSpan.Zero);
     ReceivedDate = receivedDate;
     StatusChangeCollection = new List<FinancialGuaranteeStatusChange>();
     stateMachine = CreateStateMachine();
     Status = FinancialGuaranteeStatus.ApplicationReceived;
     Decision = FinancialGuaranteeDecision.None;
 }
        public void verify_context_passthrough()
        {
            var transition = new StateMachine<StateType, TriggerType>.Transition(StateType.New, StateType.UnderReview,
                                                                                 TriggerType.Ignore);

            var stateStepInfo = new EntryStateTaskInfo<StateType, TriggerType, TriggerContext>(new TriggerContext { DocumentId = 5 }, transition);

            Assert.That(stateStepInfo.Context.DocumentId, Is.EqualTo(5));
        }
示例#16
0
 public ApplicationState(IDepartmentService departmentService, ISettingService settingService,
     ICacheService cacheService)
 {
     _screenState = new StateMachine<AppScreens, AppScreens>(() => ActiveAppScreen, state => ActiveAppScreen = state);
     _screenState.OnUnhandledTrigger(HandleTrigger);
     _departmentService = departmentService;
     _settingService = settingService;
     _cacheService = cacheService;
     CurrentTicketType = TicketType.Default;
 }
示例#17
0
        public Rfq(IRfqService rfqService, IConcurrencyService concurrencyService)
        {
            _rfqService = rfqService;
            _concurrencyService = concurrencyService;
            _stateMachine = new StateMachine<RfqState, RfqEvent>(RfqState.Input);
            _rfqUpdateSubject = new BehaviorSubject<RfqUpdate>(new RfqUpdate(RfqState.Input, null, null));
            _disposables = new CompositeDisposable(_cancellationSubscription, _executionSubscription, _requestSubscription);

            CreateStateMachine();
        }
示例#18
0
        internal Movement(int movementNumber, Guid notificationId, DateTime date, Guid createdBy)
        {
            Number = movementNumber;
            NotificationId = notificationId;
            Date = date;
            CreatedBy = createdBy.ToString();

            Status = MovementStatus.New;
            StatusChangeCollection = new List<MovementStatusChange>();
            stateMachine = CreateStateMachine();
        }
示例#19
0
        /// <summary>
        /// ctor that configures the state machine according to document type.
        /// in this scenario, multiple document types exist where a different flow through the state machine for each. the configuration
        /// of the flow is handled through metadata.
        /// 
        /// injection of the enumerated state steps is done here. and while useful for demonstration purposes, it may also be useful
        /// to inject this list from another source.  this is especially useful when ambient properties (i.e. user roles) play a role
        /// in determining the steps.
        /// </summary>
        /// <param name="documentType">document type to use for the state machine</param>
        /// <param name="stateConfiguration">document type state configuration filtering component</param>
        public StateEngine(DocumentType documentType, Func<DocumentType, StateEngineConfiguration> stateConfiguration)
        {
            var stateMachine = new StateMachine<WorkflowStep, WorkflowTrigger>(WorkflowStep.New);

            // here, we'll get the state steps particular to our document type and configure the workflow

            var stepCount =
                stateConfiguration(documentType).StateSteps.Select(p => ConfigureStateMachine(stateMachine, p)).Count();

            Console.WriteLine("Creating the workflow at {0} with {1} steps", DateTime.Now.ToLongTimeString(), stepCount);

            _stateMachine = stateMachine;
        }
示例#20
0
        static void Main(string[] args)
        {
            var phoneCall = new StateMachine<State, Trigger>(State.OffHook);
            setVolumeTrigger = phoneCall.SetTriggerParameters<int>(Trigger.SetVolume);

            phoneCall.Configure(State.OffHook)
                .Permit(Trigger.CallDialed, State.Ringing);

            phoneCall.Configure(State.Ringing)
                .Permit(Trigger.HungUp, State.OffHook)
                .Permit(Trigger.CallConnected, State.Connected);

            phoneCall.Configure(State.Connected)
                .OnEntry(t => StartCallTimer())
                .OnExit(t => StopCallTimer())
                .InternalTransition(Trigger.MuteMicrophone, t => OnMute())
                .InternalTransition(Trigger.UnmuteMicrophone, t => OnUnmute())
                .InternalTransition<int>(setVolumeTrigger, (volume, t) => OnSetVolume(volume))
                .Permit(Trigger.LeftMessage, State.OffHook)
                .Permit(Trigger.HungUp, State.OffHook)
                .Permit(Trigger.PlacedOnHold, State.OnHold);

            phoneCall.Configure(State.OnHold)
                .SubstateOf(State.Connected)
                .Permit(Trigger.TakenOffHold, State.Connected)
                .Permit(Trigger.HungUp, State.OffHook)
                .Permit(Trigger.PhoneHurledAgainstWall, State.PhoneDestroyed);

            Print(phoneCall);
            Fire(phoneCall, Trigger.CallDialed);
            Print(phoneCall);
            Fire(phoneCall, Trigger.CallConnected);
            Print(phoneCall);
            SetVolume(phoneCall, 2);
            Print(phoneCall);
            Fire(phoneCall, Trigger.PlacedOnHold);
            Print(phoneCall);
            Fire(phoneCall, Trigger.MuteMicrophone);
            Print(phoneCall);
            Fire(phoneCall, Trigger.UnmuteMicrophone);
            Print(phoneCall);
            Fire(phoneCall, Trigger.TakenOffHold);
            Print(phoneCall);
            SetVolume(phoneCall, 11);
            Print(phoneCall);
            Fire(phoneCall, Trigger.HungUp);
            Print(phoneCall);

            Console.WriteLine("Press any key...");
            Console.ReadKey(true);
        }
示例#21
0
 public ApplicationState(IDepartmentService departmentService, ISettingService settingService,
     ICacheService cacheService, IExpressionService expressionService, INotificationService notificationService)
 {
     _screenState = new StateMachine<AppScreens, AppScreens>(() => ActiveAppScreen, state => ActiveAppScreen = state);
     _screenState.OnUnhandledTrigger(HandleTrigger);
     _departmentService = departmentService;
     _settingService = settingService;
     _cacheService = cacheService;
     _expressionService = expressionService;
     _notificationService = notificationService;
     SetCurrentDepartment(Department.Default);
     CurrentTicketType = TicketType.Default;
     _isLandscape = true;
 }
示例#22
0
        private static Lazy<IStateStepConfiguration, IStateStepConfigurationMetadata> ConfigureStateMachine(StateMachine<WorkflowStep, WorkflowTrigger> stateMachine, 
            Lazy<IStateStepConfiguration, IStateStepConfigurationMetadata> stepConfiguration)
        {
            var stateConfig = stateMachine.Configure(stepConfiguration.Metadata.WorkflowStep);

            foreach (var permission in stepConfiguration.Value.Permissions)
                stateConfig.Permit(permission.Key, permission.Value);

            stateConfig.OnEntry(
                () => Console.WriteLine("Entering {0} Step at {1}", stepConfiguration.Metadata.WorkflowStep,
                                        DateTime.Now.ToLongTimeString()));

            return stepConfiguration;
        }
示例#23
0
 public SMWorkflowMachine()
 {
     stateMachine = new StateMachine<State, Trigger>(State.Idle);
       stateMachine.Configure(State.Idle)
     .OnEntry(() => { if (OnIdleEntry != null) OnIdleEntry(); })
     .OnExit(() => { if (OnIdleExit != null) OnIdleExit(); })
     .PermitIf(Trigger.Select, State.SelectDrink , () => { if (GuardClauseFromIdleToSelectDrinkUsingTriggerSelect != null) return GuardClauseFromIdleToSelectDrinkUsingTriggerSelect(); return true; } )
     .PermitIf(Trigger.Insert, State.CoinBox , () => { if (GuardClauseFromIdleToCoinBoxUsingTriggerInsert != null) return GuardClauseFromIdleToCoinBoxUsingTriggerInsert(); return true; } )
       ;
       stateMachine.Configure(State.SelectDrink)
     .OnEntry(() => { if (OnSelectDrinkEntry != null) OnSelectDrinkEntry(); })
     .OnExit(() => { if (OnSelectDrinkExit != null) OnSelectDrinkExit(); })
     .PermitIf(Trigger.SelectedDrink, State.SelectedDrink , () => { if (GuardClauseFromSelectDrinkToSelectedDrinkUsingTriggerSelectedDrink != null) return GuardClauseFromSelectDrinkToSelectedDrinkUsingTriggerSelectedDrink(); return true; } )
       ;
       stateMachine.Configure(State.CoinBox)
     .OnEntry(() => { if (OnCoinBoxEntry != null) OnCoinBoxEntry(); })
     .OnExit(() => { if (OnCoinBoxExit != null) OnCoinBoxExit(); })
     .PermitIf(Trigger.RefundMoney, State.MoneyRefunded , () => { if (GuardClauseFromCoinBoxToMoneyRefundedUsingTriggerRefundMoney != null) return GuardClauseFromCoinBoxToMoneyRefundedUsingTriggerRefundMoney(); return true; } )
     .PermitIf(Trigger.CheckMoney, State.ControlMoney , () => { if (GuardClauseFromCoinBoxToControlMoneyUsingTriggerCheckMoney != null) return GuardClauseFromCoinBoxToControlMoneyUsingTriggerCheckMoney(); return true; } )
       ;
       stateMachine.Configure(State.ControlMoney)
     .OnEntry(() => { if (OnControlMoneyEntry != null) OnControlMoneyEntry(); })
     .OnExit(() => { if (OnControlMoneyExit != null) OnControlMoneyExit(); })
     .PermitIf(Trigger.Rejected, State.CoinBox , () => { if (GuardClauseFromControlMoneyToCoinBoxUsingTriggerRejected != null) return GuardClauseFromControlMoneyToCoinBoxUsingTriggerRejected(); return true; } )
     .PermitIf(Trigger.EnoughMoney, State.ServingDrink , () => { if (GuardClauseFromControlMoneyToServingDrinkUsingTriggerEnoughMoney != null) return GuardClauseFromControlMoneyToServingDrinkUsingTriggerEnoughMoney(); return true; } )
       ;
       stateMachine.Configure(State.SelectedDrink)
     .OnEntry(() => { if (OnSelectedDrinkEntry != null) OnSelectedDrinkEntry(); })
     .OnExit(() => { if (OnSelectedDrinkExit != null) OnSelectedDrinkExit(); })
     .PermitIf(Trigger.DeSelectDrink, State.SelectDrink , () => { if (GuardClauseFromSelectedDrinkToSelectDrinkUsingTriggerDeSelectDrink != null) return GuardClauseFromSelectedDrinkToSelectDrinkUsingTriggerDeSelectDrink(); return true; } )
     .PermitIf(Trigger.FoundDrink, State.ServingDrink , () => { if (GuardClauseFromSelectedDrinkToServingDrinkUsingTriggerFoundDrink != null) return GuardClauseFromSelectedDrinkToServingDrinkUsingTriggerFoundDrink(); return true; } )
       ;
       stateMachine.Configure(State.ServingDrink)
     .OnEntry(() => { if (OnServingDrinkEntry != null) OnServingDrinkEntry(); })
     .OnExit(() => { if (OnServingDrinkExit != null) OnServingDrinkExit(); })
     .PermitIf(Trigger.TakeDrink, State.DrinkReady , () => { if (GuardClauseFromServingDrinkToDrinkReadyUsingTriggerTakeDrink != null) return GuardClauseFromServingDrinkToDrinkReadyUsingTriggerTakeDrink(); return true; } )
       ;
       stateMachine.Configure(State.DrinkReady)
     .OnEntry(() => { if (OnDrinkReadyEntry != null) OnDrinkReadyEntry(); })
     .OnExit(() => { if (OnDrinkReadyExit != null) OnDrinkReadyExit(); })
     .PermitIf(Trigger.TakeChange, State.MoneyRefunded , () => { if (GuardClauseFromDrinkReadyToMoneyRefundedUsingTriggerTakeChange != null) return GuardClauseFromDrinkReadyToMoneyRefundedUsingTriggerTakeChange(); return true; } )
       ;
       stateMachine.Configure(State.MoneyRefunded)
     .OnEntry(() => { if (OnMoneyRefundedEntry != null) OnMoneyRefundedEntry(); })
     .OnExit(() => { if (OnMoneyRefundedExit != null) OnMoneyRefundedExit(); })
     .PermitIf(Trigger.RefundMoney, State.Idle , () => { if (GuardClauseFromMoneyRefundedToIdleUsingTriggerRefundMoney != null) return GuardClauseFromMoneyRefundedToIdleUsingTriggerRefundMoney(); return true; } )
       ;
       stateMachine.OnUnhandledTrigger((state, trigger) => { if (OnUnhandledTrigger != null) OnUnhandledTrigger(state, trigger); });
 }
示例#24
0
 private void OnTransition(StateMachine<StoryUpdateFunction, string>.Transition transition)
 {
     const string tag = "StoryState";
     var entity = World.TagManager.GetEntity(tag);
     if (entity != null)
     {
         entity.Tag = null;
         entity.Delete();
     }
     var component = new CoroutineComponent(transition.Destination(this, World), () => entity.Delete());
     entity = World.CreateEntity();
     entity.AddComponent(component);
     entity.Refresh();
     entity.Tag = tag;
 }
示例#25
0
        public Story(EntityWorld world)
        {
            Acts = new List<IStoryAct>(new[] { new ActOne() });
            State = new StateMachine<StoryUpdateFunction, string>(Acts[0].Master);
            State.OnTransitioned(OnTransition);

            for (int i = 0; i < Acts.Count; i++)
            {
                var act = Acts[i];
                act.ConfigureStates(State);

                State.Configure(act.Master)
                    .Permit(Triggers.NextAct, i < Acts.Count - 1 ? (StoryUpdateFunction)Acts[i + 1].Master : EndOfStory);
            }
            World = world;
            State.Fire(ActOne.Triggers.Start);
        }
示例#26
0
        public void ConfigureStates(StateMachine<StoryUpdateFunction, string> state)
        {
            state.Configure(Master)
                .Permit(Triggers.Start, Intro);

            state.Configure(Intro)
                .SubstateOf(Master)
                .Permit(Story.Triggers.NextScene, Tutorial);

            state.Configure(Tutorial)
                .SubstateOf(Master)
                .Permit(Story.Triggers.NextScene, AlienInvasionIntro);

            state.Configure(AlienInvasionIntro)
                .SubstateOf(Master)
                .Permit(Story.Triggers.NextScene, AlienInvasionGameplay);
        }
示例#27
0
        static void Main(string[] args)
        {
            //var wf1 = new Workflow1();
            //wf1.InputValue = 0;
            //wf1.

            var phoneCall = new StateMachine<State, Trigger>(State.OffHook);

            phoneCall.Configure(State.OffHook)
                .Permit(Trigger.CallDialed, State.Ringing);

            phoneCall.Configure(State.Ringing)
                .Permit(Trigger.HungUp, State.OffHook)
                .Permit(Trigger.CallConnected, State.Connected);

            phoneCall.Configure(State.Connected)
                .OnEntry(t => StartCallTimer())
                .OnExit(t => StopCallTimer())
                .Permit(Trigger.LeftMessage, State.OffHook)
                .Permit(Trigger.HungUp, State.OffHook)
                .Permit(Trigger.PlacedOnHold, State.OnHold);

            phoneCall.Configure(State.OnHold)
                .SubstateOf(State.Connected)
                .Permit(Trigger.TakenOffHold, State.Connected)
                .Permit(Trigger.HungUp, State.OffHook)
                .Permit(Trigger.PhoneHurledAgainstWall, State.PhoneDestroyed);

            Print(phoneCall);
            Fire(phoneCall, Trigger.CallDialed);
            Print(phoneCall);
            Fire(phoneCall, Trigger.CallConnected);
            Print(phoneCall);
            Fire(phoneCall, Trigger.PlacedOnHold);
            Print(phoneCall);
            Fire(phoneCall, Trigger.TakenOffHold);
            Print(phoneCall);
            Fire(phoneCall, Trigger.HungUp);
            Print(phoneCall);

            Console.WriteLine("Press any key...");
            Console.ReadKey(true);
        }
        public static StateMachine<RequestState, RequestAction> ForRequest(int requestId)
        {
            //use request id to get the current state of the request and initialize
            var persistedState = GetRequestState(requestId);

            var workflow = new StateMachine<RequestState, RequestAction>(persistedState);

            //configure requested status
            workflow.Configure(RequestState.Created)
                .Permit(RequestAction.Suspend, RequestState.Suspended)
                .Permit(RequestAction.Cancel, RequestState.Cancelled)
                .Permit(RequestAction.Process, RequestState.Assigned);

            workflow.Configure(RequestState.Assigned)
                    .OnEntry(OnBeginHandleAssigned)
                    .OnExit(OnExitHandleAssigned);

            return workflow;
        }
示例#29
0
        public ConnectionContext()
        {
            State = new StateMachine<HostState, HostCommand>(HostState.Disconnected);

            State.Configure(HostState.Disconnected)
                .Permit(HostCommand.ConnectionRequested, HostState.Connecting);

            State.Configure(HostState.Connecting)
                .Permit(HostCommand.ConnectionEstablished, HostState.Connected)
                .Permit(HostCommand.ConnectionFailed, HostState.Disconnected);

            State.Configure(HostState.Connected)
                .Permit(HostCommand.MessageReceived, HostState.Processing);

            State.Configure(HostState.Processing)
                .Permit(HostCommand.ResponseSent, HostState.Connected);

            LastActivity = DateTime.Now;
        }
示例#30
0
        protected Bug()
        {
            Machine = new StateMachine<States, Triggers>(() => State, s => State = s);
            AssignTrigger = Machine.SetTriggerParameters<string>(Triggers.Assign);

            Machine.Configure(States.Open)
               .Permit(Triggers.Assign, States.Assigned);

            Machine.Configure(States.Assigned)
                .SubstateOf(States.Open)
                .OnEntryFrom(AssignTrigger, OnAssigned)
                .PermitReentry(Triggers.Assign)
                .Permit(Triggers.Close, States.Closed)
                .Permit(Triggers.Defer, States.Deferred)
                .OnExit(OnDeassigned);

            Machine.Configure(States.Deferred)
                .OnEntry(() => Assignee = null)
                .Permit(Triggers.Assign, States.Assigned);
        }
示例#31
0
 internal StateConfiguration(StateMachine <TState, TTrigger> machine, StateRepresentation representation, Func <TState, StateRepresentation> lookup)
 {
     _machine        = Enforce.ArgumentNotNull(machine, nameof(machine));
     _representation = Enforce.ArgumentNotNull(representation, nameof(representation));
     _lookup         = Enforce.ArgumentNotNull(lookup, nameof(lookup));
 }