Ejemplo n.º 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));
            }
        }
Ejemplo n.º 2
0
        public override FingerTree <T, M> App2(List <T> ts, FingerTree <T, M> f)
        {
            for (int i = ts.Count - 1; i >= 0; i--)
            {
                f = f.PushLeft(ts[i]);
            }

            return(f.PushLeft(_t));
        }
Ejemplo n.º 3
0
        public static FingerTree <T, M> CreateR(Digit <T, M> left, FingerTree <Node <T, M>, M> f, List <T> right)
        {
            var m = left.M;

            if (right.Count > 0)
            {
                return(new DeepFingerTree <T, M>(m, left, f, new Digit <T, M>(m, right)));
            }

            if (f is EmptyFingerTree <Node <T, M>, M> )
            {
                return(FromSequence(left.Digits, m));
            }

            var ir = f.RightView();
            var n  = ir.End.Nodes;

            return(new DeepFingerTree <T, M>(m, left, ir.Rest, new Digit <T, M>(m, n)));
        }
Ejemplo n.º 4
0
        public static FingerTree <T, M> Create(List <T> left, FingerTree <Node <T, M>, M> f, Digit <T, M> right)
        {
            var m = right.M;

            if (left.Count > 0)
            {
                return(new DeepFingerTree <T, M>(m, new Digit <T, M>(m, left), f, right));
            }

            if (f is EmptyFingerTree <Node <T, M>, M> )
            {
                return(FromSequence(right.Digits, m));
            }

            var il = f.LeftView();
            var n  = il.End.Nodes;

            return(new DeepFingerTree <T, M>(m, new Digit <T, M>(m, n), il.Rest, right));
        }
Ejemplo n.º 5
0
        public DeepFingerTree(Monoid <M> m, Digit <T, M> f, FingerTree <Node <T, M>, M> ft, Digit <T, M> b)
        {
            if (f.Digits.Count > 0)
            {
                _m = m;

                _leftDigits  = f;
                _fingerTree  = ft;
                _rightDigits = b;

                PreCalcMeasure = _m.Zero;
                PreCalcMeasure = _m.BinaryOperator(PreCalcMeasure, f.Measure());
                PreCalcMeasure = _m.BinaryOperator(PreCalcMeasure, ft.Measure());
                PreCalcMeasure = _m.BinaryOperator(PreCalcMeasure, b.Measure());
            }
            else
            {
                throw new Exception("oops");
            }
        }
Ejemplo n.º 6
0
 public override FingerTree <T, M> Merge(FingerTree <T, M> f) => f.PushLeft(_t);
Ejemplo n.º 7
0
 public override FingerTree <T, M> Merge(FingerTree <T, M> f)
 {
     return(App2(new List <T>(), f));
 }
Ejemplo n.º 8
0
 public override FingerTree <T, M> Merge(FingerTree <T, M> f) => f;
Ejemplo n.º 9
0
 public abstract FingerTree <T, M> App2(List <T> ts, FingerTree <T, M> f);
Ejemplo n.º 10
0
 public abstract FingerTree <T, M> Merge(FingerTree <T, M> f);