예제 #1
0
        public override FingerTree <T, M> App2(List <T> ts, FingerTree <T, M> f)
        {
            if (f is EmptyFingerTree <T, M> )
            {
                FingerTree <T, M> resultFT = this;

                foreach (var t in ts)
                {
                    resultFT = resultFT.PushRight(t);
                }

                return(resultFT);
            }
            else if (f is SingleFingerTree <T, M> )
            {
                FingerTree <T, M> resultFT = this;

                foreach (var t in ts)
                {
                    resultFT = resultFT.PushRight(t);
                }

                return(resultFT.PushRight(f.LeftView().End));
            }
            else
            {
                var dr = f as DeepFingerTree <T, M>;

                var ll = new List <T>(_rightDigits.Digits);
                ll.AddRange(ts);
                ll.AddRange(dr._leftDigits.Digits);

                return(new DeepFingerTree <T, M>(_m, _leftDigits, _fingerTree.App2(ListOfNodes(_m, ll), dr._fingerTree), dr._rightDigits));
            }
        }
예제 #2
0
        public override FingerTree <T, M> PushRight(T t)
        {
            if (_rightDigits.Digits.Count == 4)
            {
                return(new DeepFingerTree <T, M>(_m, _leftDigits, _fingerTree.PushRight(new Node <T, M>(_m, _rightDigits.Digits.Take(3).ToList())), new Digit <T, M>(_m, _rightDigits.Digits[3], t)));
            }
            else
            {
                var nr = new List <T>(_rightDigits.Digits);
                nr.Add(t);

                return(new DeepFingerTree <T, M>(_m, _leftDigits, _fingerTree, new Digit <T, M>(_m, nr)));
            }
        }