コード例 #1
0
 public StateFluentBuilder(IBuilderFactory factory, TOuterBuilder outerBuilder, Action <IState> builtAction)
 {
     _factory      = factory ?? throw new ArgumentNullException(nameof(factory));
     _builder      = factory.CreateStateBuilder(null);
     _outerBuilder = outerBuilder;
     _builtAction  = builtAction;
 }
コード例 #2
0
		public StateBuilder(IStateBuilder parent, object stateId, IStateBuilderContext context)
		{
			Parent = parent;
			Id = stateId;
			Context = context;

			substates = new List<IBaseStateBuilder>();
			secondPassActions = new List<Action<State>>();
		}
コード例 #3
0
        /// <inheritdoc/>
        public virtual StateDefinition AddState(Func <IStateBuilderFactory, IStateBuilder> stateSetup)
        {
            if (stateSetup == null)
            {
                throw new ArgumentNullException(nameof(stateSetup));
            }
            IStateBuilder builder = stateSetup(new StateBuilderFactory(this));

            return(this.AddState(builder.Build()));
        }
コード例 #4
0
		public TransitionBuilder(IStateBuilder stateBuilder, object eventId)
		{
			this.eventId = eventId;
			this.stateBuilder = stateBuilder;

			stateBuilder.AddSecondPassAction(s =>
			                                 	{
			                                 		s.AddTransition(CreateTransition());
			                                 	});
		}
コード例 #5
0
		private static void AddTimeout(IStateBuilder builder, int timeoutInMilliseconds)
		{
			if (!builder.Context.HasPlugIn<TimerPlugin>())
				builder.Context.AddPlugIn(new TimerPlugin());
			if (!builder.Context.HasPlugIn<TimeoutPlugin>())
				builder.Context.AddPlugIn(new TimeoutPlugin());

			builder.AddSecondPassAction(s =>
			                            	{
			                            		var timerPlugin = builder.Context.GetPlugIn<TimerPlugin>();
			                            		var timeoutPlugin = builder.Context.GetPlugIn<TimeoutPlugin>();
												var timeout = new TimeoutEvent(timeoutInMilliseconds, s, timeoutPlugin.PostTimeout);

												timerPlugin.AddTimer(timeout);
											});
		}
コード例 #6
0
		public virtual IStateBuilder CreateStateBuilder(object stateId, IStateBuilder parent)
		{
			return new StateBuilder(parent, stateId, Context);
		}
コード例 #7
0
 public void Configure(IStateBuilder <TesTSubject> builder)
 {
     builder
     .On <Test1Action>().Handle <Test1ActionHandler>()
     .On <Test2Action>().Handle <Test2ActionHandler>();
 }
コード例 #8
0
		public TransitionBuilder(IStateBuilder stateBuilder, object eventId, object targetStateId)
			: this(stateBuilder, eventId)
		{
			this.targetStateId = targetStateId;
		}
コード例 #9
0
        /// <summary>
        /// Adds a valid next state to this state.
        /// </summary>
        /// <param name="message">The transition message.</param>
        /// <param name="nextState">The valid next state.</param>
        /// <returns>The transition builder.</returns>
        public IStateTransitionBuilder <TState, TTransition, TPayload> AddValidTransition(TTransition message, IStateBuilder <TState, TTransition, TPayload> nextState)
        {
            if (this.nextStates.ContainsKey(message))
            {
                throw new ArgumentException($"Cannot add duplicate transition from {this.State} -> {((StateBuilder<TState, TTransition, TPayload>)nextState).State}. with transition {message}.");
            }

            var transition = new StateTransitionBuilder <TState, TTransition, TPayload>(message, this.stateMachine, this, (StateBuilder <TState, TTransition, TPayload>)nextState);

            this.nextStates.Add(message, transition);
            return(transition);
        }
コード例 #10
0
		public static IBaseStateBuilder CreateDeepHistoryBuilder(IStateBuilder parent)
		{
			return new HistoryStateBuilder(parent, HistoryState.GetDeepState);
		}
コード例 #11
0
		public static IBaseStateBuilder CreateShallowHistoryBuilder(IStateBuilder parent)
		{
			return new HistoryStateBuilder(parent, HistoryState.GetShallowState);
		}
コード例 #12
0
		protected HistoryStateBuilder(IStateBuilder parent, HistoryState.HistoryFetchStrategy historyStrategy)
		{
			this.id = new HistoryStateId(parent.Id);
			this.historyStrategy = historyStrategy;
		}
コード例 #13
0
ファイル: ActionBuilder.cs プロジェクト: emprax/St8-ment
 internal ActionBuilder(ConcurrentDictionary <string, Func <IServiceProvider, object> > actions, IStateBuilder <TSubject> builder)
 {
     this.actions = actions;
     this.builder = builder;
 }
コード例 #14
0
 /// <summary>
 /// Adds a valid next state to this state.
 /// </summary>
 /// <param name="message">The message.</param>
 /// <param name="nextState">The valid next state.</param>
 /// <returns>This.</returns>
 public IStateTransitionBuilder <TState, TTransition, TPayload> AddValidTransition(TTransition message, IStateBuilder <TState, TTransition, TPayload> nextState)
 {
     return(this.StartState.AddValidTransition(message, nextState));
 }
コード例 #15
0
        public static IStateBuilder <T, TParent> Concrete <T, TParent>(this IStateBuilder <T, TParent> builder, object concreteState)
            where T : AbstractState, new()
        {
            if (concreteState == null)
            {
                return(builder);
            }

            var  info      = ConcreteStateDeclarations.ResolveStateInfo(concreteState.GetType());
            bool isEntered = false;

            return(builder
                   ///
                   /// Awake State
                   .Awake(state =>
            {
                if (info.Awake != null && concreteState != null)
                {
                    info.Awake.Invoke(concreteState, null);
                }
            })
                   ///
                   /// Destroy State
                   .Destroy(state =>
            {
                if (info.OnDestroy != null && concreteState != null)
                {
                    info.OnDestroy.Invoke(concreteState, null);
                }
            })
                   ///
                   /// Enter State
                   .Enter(state =>
            {
                isEntered = true;
                if (info.OnEnter != null && concreteState != null)
                {
                    info.OnEnter.Invoke(concreteState, null);
                }
            })
                   ///
                   /// Exit State
                   .Exit(state =>
            {
                if (isEntered)
                {
                    isEntered = false;
                    if (info.OnExit != null && concreteState != null)
                    {
                        info.OnExit.Invoke(concreteState, null);
                    }
                }
            })
                   ///
                   /// Update State
                   .Update((state, deltaTime) =>
            {
                if (info.Update != null && concreteState != null)
                {
                    info.Update.Invoke(concreteState, null);
                }
            }));
        }