Ejemplo n.º 1
0
        public override FTree <T> App2(List <T> ts, FTree <T> rightFT)
        {
            if (!(rightFT is DeepFTree <T>))
            {
                FTree <T> resultFT = this;

                foreach (T t in ts)
                {
                    resultFT = resultFT.Push_Back(t);
                }

                return((rightFT is EmptyFTree <T>)
                          ? resultFT
                          : resultFT.Push_Back(rightFT.LeftView().head));
            }
            else // the right tree is also a deep tree
            {
                DeepFTree <T> deepRight = rightFT as DeepFTree <T>;

                List <T> cmbList = new List <T>(backDig.digNodes);

                cmbList.AddRange(ts);

                cmbList.AddRange(deepRight.frontDig.digNodes);

                FTree <T> resultFT =
                    new DeepFTree <T>
                        (frontDig,
                        innerFT.App2(FTree <T> .ListOfNodes(cmbList), deepRight.innerFT),
                        deepRight.backDig
                        );

                return(resultFT);
            }
        }
Ejemplo n.º 2
0
        public static FTree <T> CreateR(Digit <T> frontDig,
                                        FTree <Node <T> > innerFT,
                                        List <T> backList //may be empty!
                                        )
        {
            if (backList.Count > 0)
            {
                return(new DeepFTree <T>(frontDig,
                                         innerFT,
                                         new Digit <T>(backList)
                                         ));
            }
            //else

            if (innerFT is EmptyFTree <Node <T> > )
            {
                return(FromSequence(frontDig.digNodes));
            }

            //else we must create a new intermediate tree
            var innerRight = innerFT.RightView();

            List <T> newlstBack = innerRight.last.theNodes;

            DeepFTree <T> theNewDeepTree =
                new DeepFTree <T>(frontDig,
                                  innerRight.ftInit,
                                  new Digit <T>(newlstBack)
                                  );

            return(theNewDeepTree);
        }
Ejemplo n.º 3
0
        public static FTree <T> Create(List <T> frontList,  //may be empty!
                                       FTree <Node <T> > innerFT,
                                       Digit <T> backDig
                                       )
        {
            if (frontList.Count > 0)
            {
                return(new DeepFTree <T>(new Digit <T>(frontList),
                                         innerFT,
                                         backDig
                                         ));
            }
            //else

            if (innerFT is EmptyFTree <Node <T> > )
            {
                return(FromSequence(backDig.digNodes));
            }

            //else we must create a new intermediate tree
            var innerLeft = innerFT.LeftView();

            List <T> newlstFront = innerLeft.head.theNodes;

            DeepFTree <T> theNewDeepTree =
                new DeepFTree <T>(new Digit <T>(newlstFront),
                                  innerLeft.ftTail,
                                  backDig
                                  );

            return(theNewDeepTree);
        }