public IWordState Reduce(IEnumerable <IWordState> set, int len)
        {
            if (len == 0)
            {
                return(new Chunk(""));
            }

            if (len == 1)
            {
                return(set.First());
            }
            else
            {
                int pivot = len / 2;

                //var i1 = set.Take(pivot).ToList();
                //var i2 = set.Skip(pivot).ToList();

                //var t1 = new Task<IWordState>(() => Reduce(i1, pivot));
                //var t2 = new Task<IWordState>(() => Reduce(i2, pivot + len % 2));

                var firstHalf  = Reduce(set.Take(pivot), pivot);
                var secondHalf = Reduce(set.Skip(pivot), pivot + len % 2);

                IWordState result = firstHalf.Combine(secondHalf);

                return(result);
            }
        }
            public IWordState Combine(IWordState other)
            {
                if (other is Chunk)
                    return new Chunk(this, other as Chunk);
                else
                {
                    var seg = other as Segment;

                    return new Segment(str + seg.Left, seg.Middle, seg.Right);
                }
            }
            public IWordState Combine(IWordState other)
            {
                if (other is Chunk)
                {
                    return(new Chunk(this, other as Chunk));
                }
                else
                {
                    var seg = other as Segment;

                    return(new Segment(str + seg.Left, seg.Middle, seg.Right));
                }
            }
 public IWordState Combine(IWordState other)
 {
     if (other is Chunk)
     {
         return(new Segment(Left, Middle, Right + (other as Chunk).str));
     }
     else
     {
         var seg = other as Segment;
         return(new Segment(Left,
                            Middle.Union(MaybeWord(Right + seg.Left).Union(seg.Middle)), seg.Right));
     }
 }
Пример #5
0
 public void SetState(IWordState newState)
 {
     myState = newState;
 }
 public IWordState Combine(IWordState other)
 {
     if (other is Chunk)
         return new Segment(Left, Middle, Right + (other as Chunk).str);
     else
     {
         var seg = other as Segment;
         return new Segment(Left,
             Middle.Union(MaybeWord(Right + seg.Left).Union(seg.Middle)), seg.Right);
     }
 }