Пример #1
0
 public State <TS, TD, TE> Copy(TimeSpan?timeout, FSMBase.Reason stopReason = null,
                                List <object> replies = null, ILinearSeq <TE> domainEvents = null, Action <TD> afterTransitionDo = null)
 {
     return(new State <TS, TD, TE>(StateName, StateData, timeout ?? Timeout, stopReason ?? StopReason,
                                   replies ?? Replies,
                                   domainEvents ?? DomainEvents, afterTransitionDo ?? AfterTransitionHandler));
 }
Пример #2
0
 /// <summary>
 ///     Specify domain events to be applied when transitioning to the new state.
 /// </summary>
 /// <param name="events"></param>
 /// <returns></returns>
 public State <TS, TD, TE> Applying(ILinearSeq <TE> events)
 {
     if (DomainEvents == null)
     {
         return(Copy(null, null, null, events));
     }
     return(Copy(null, null, null, new ArrayLinearSeq <TE>(DomainEvents.Concat(events).ToArray())));
 }
Пример #3
0
 public State(TS stateName, TD stateData, TimeSpan?timeout = null, FSMBase.Reason stopReason = null,
              List <object> replies = null, ILinearSeq <TE> domainEvents = null, Action <TD> afterTransitionDo = null)
     : base(stateName, stateData, timeout, stopReason, replies)
 {
     AfterTransitionHandler = afterTransitionDo;
     DomainEvents           = domainEvents;
     Notifies = true;
 }
Пример #4
0
 public State Copy(
     TimeSpan?timeout,
     FSMBase.Reason stopReason        = null,
     List <object> replies            = null,
     ILinearSeq <TEvent> domainEvents = null,
     Action <TData> afterTransitionDo = null)
 {
     return(_state.Copy(timeout, stopReason, replies, domainEvents, afterTransitionDo));
 }
Пример #5
0
 public bool MoveNext()
 {
     if (_seq.IsEmpty)
     {
         return(false);
     }
     _current = _seq.Head;
     _seq     = _seq.Tail();
     return(true);
 }
Пример #6
0
 public State(
     TState stateName,
     TData stateData,
     TimeSpan?timeout                 = null,
     FSMBase.Reason stopReason        = null,
     List <object> replies            = null,
     ILinearSeq <TEvent> domainEvents = null,
     Action <TData> afterTransitionDo = null)
 {
     _state = new State(stateName, stateData, timeout, stopReason, replies, domainEvents, afterTransitionDo);
 }
Пример #7
0
            /// <summary>
            /// TBD
            /// </summary>
            /// <param name="n">TBD</param>
            /// <returns>TBD</returns>
            public override ByteIterator Take(int n)
            {
                var rest    = n;
                var builder = new List <ByteArrayIterator>();

                while (rest > 0 && !_iterators.IsEmpty)
                {
                    Current.Take(rest);
                    if (Current.HasNext)
                    {
                        rest -= Current.Len;
                        builder.Add(Current);
                    }
                    _iterators = _iterators.Tail();
                }
                _iterators = new ArrayLinearSeq <ByteArrayIterator>(builder.ToArray());
                return(Normalize());
            }
Пример #8
0
            private MultiByteIterator Normalize()
            {
                Func <ILinearSeq <ByteArrayIterator>, ILinearSeq <ByteArrayIterator> > norm = null;

                norm = xs =>
                {
                    if (xs.IsEmpty)
                    {
                        return(ClearedList);
                    }
                    if (!xs.Head.HasNext)
                    {
                        return(norm(xs.Tail()));
                    }
                    return(xs);
                };
                _iterators = norm(_iterators);
                return(this);
            }
Пример #9
0
            private MultiByteIterator Normalize()
            {
                Func <IEnumerable <ByteArrayIterator>, IEnumerable <ByteArrayIterator> > norm = null;

                norm = xs =>
                {
                    if (!xs.Any())
                    {
                        return(ClearedList);
                    }
                    if (!xs.First().HasNext)
                    {
                        return(norm(xs.Skip(1)));
                    }
                    return(xs);
                };
                _iterators = new ArrayLinearSeq <ByteArrayIterator>(norm(_iterators).ToArray());
                return(this);
            }
Пример #10
0
            /// <summary>
            /// TBD
            /// </summary>
            /// <param name="p">TBD</param>
            /// <returns>TBD</returns>
            public override ByteIterator TakeWhile(Func <byte, bool> p)
            {
                var stop    = false;
                var builder = new List <ByteArrayIterator>();

                while (!stop && !_iterators.IsEmpty)
                {
                    var lastLen = Current.Len;
                    Current.TakeWhile(p);
                    if (Current.HasNext)
                    {
                        builder.Add(Current);
                    }
                    if (Current.Len < lastLen)
                    {
                        stop = true;
                    }
                    DropCurrent();
                }
                _iterators = new ArrayLinearSeq <ByteArrayIterator>(builder.ToArray());
                return(Normalize());
            }
Пример #11
0
 public Enumerator(ILinearSeq <T> seq)
 {
     _seq  = seq;
     _orig = _seq;
 }
Пример #12
0
 /// <summary>
 /// TBD
 /// </summary>
 protected override void Clear()
 {
     _iterators = new ArrayLinearSeq <ByteArrayIterator>(new ByteArrayIterator[0]);
 }
Пример #13
0
 private void DropCurrent()
 {
     _iterators = _iterators.Tail();
 }
Пример #14
0
 /// <summary>
 /// TBD
 /// </summary>
 /// <param name="iterators">TBD</param>
 public MultiByteIterator(params ByteArrayIterator[] iterators)
 {
     _iterators = new ArrayLinearSeq <ByteArrayIterator>(iterators);
     Normalize();
 }
Пример #15
0
 public bool MoveNext()
 {
     _seq = _seq.Tail();
     return(!_seq.IsEmpty);
 }
Пример #16
0
 public State Applying(ILinearSeq <TEvent> events)
 {
     return(_state.Applying(events));
 }
Пример #17
0
 public void Reset()
 {
     _seq = _orig;
 }
Пример #18
0
 /// <summary>
 /// TBD
 /// </summary>
 /// <param name="iterators">TBD</param>
 public MultiByteIterator(ILinearSeq <ByteArrayIterator> iterators)
 {
     _iterators = iterators;
     Normalize();
 }