Beispiel #1
0
        public override FTreeM <T, M> Reverse()
        {
            Digit <T, M> newFrontDig = ReverseDigit(backDig);
            Digit <T, M> newBackDig  = ReverseDigit(frontDig);

            if (innerFT is EmptyFTreeM <Node <T, M>, M> )
            {
                return(new
                       DeepFTreeM <T, M>(theMonoid, newFrontDig, innerFT, newBackDig));
            }
            //else
            if (innerFT is SingleFTreeM <Node <T, M>, M> )
            {
                return(new DeepFTreeM <T, M>
                           (theMonoid,
                           newFrontDig,
                           new SingleFTreeM <Node <T, M>, M>
                               (theMonoid,
                               ReverseNode(innerFT.LeftView().head)
                               ),
                           newBackDig
                           ));
            }
            //else innerFT is a Deep tree
            DeepFTreeM <Node <T, M>, M> revDeepInner =
                (DeepFTreeM <Node <T, M>, M>)
                (
                    ((DeepFTreeM <Node <T, M>, M>)innerFT).Reverse()
                );

            List <Node <T, M> > newFrontNodes = new List <Node <T, M> >();
            List <Node <T, M> > newBackNodes  = new List <Node <T, M> >();

            foreach (Node <T, M> node in revDeepInner.frontDig.digNodes)
            {
                newFrontNodes.Add(ReverseNode(node));
            }

            foreach (Node <T, M> node in revDeepInner.backDig.digNodes)
            {
                newBackNodes.Add(ReverseNode(node));
            }

            DeepFTreeM <Node <T, M>, M> reversedInner =
                new DeepFTreeM <Node <T, M>, M>
                    (theMonoid,
                    new DeepFTreeM <Node <T, M>, M> .Digit <Node <T, M>, M>
                        (theMonoid, newFrontNodes),
                    revDeepInner.innerFT,
                    new DeepFTreeM <Node <T, M>, M> .Digit <Node <T, M>, M>
                        (theMonoid, newBackNodes)
                    );

            return(new DeepFTreeM <T, M>
                       (theMonoid,
                       ReverseDigit(backDig),
                       reversedInner,
                       ReverseDigit(frontDig)
                       ));
        }
Beispiel #2
0
        public override FTreeM <T, M> App2(List <T> ts, FTreeM <T, M> rightFT)
        {
            if (rightFT is EmptyFTreeM <T, M> )
            {
                FTreeM <T, M> resultFT = this;

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

                return(resultFT);
            }

            else if (rightFT is SingleFTreeM <T, M> )
            {
                FTreeM <T, M> resultFT = this;

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

                return(resultFT.PushBack(rightFT.LeftView().head));
            }

            else // the right tree is also a deep tree
            {
                DeepFTreeM <T, M> deepRight = rightFT as DeepFTreeM <T, M>;

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

                cmbList.AddRange(ts);

                cmbList.AddRange(deepRight.frontDig.digNodes);

                FTreeM <T, M> resultFT =
                    new DeepFTreeM <T, M>
                        (theMonoid,
                        frontDig,
                        innerFT.App2(FTreeM <T, M> .ListOfNodes
                                         (theMonoid, cmbList),
                                     deepRight.innerFT
                                     ),
                        deepRight.backDig
                        );

                return(resultFT);
            }
        }
Beispiel #3
0
        public static FTreeM <T, M> Create(List <T> frontList,        //may be empty!
                                           FTreeM <Node <T, M>, M> innerFT,
                                           Digit <T, M> backDig
                                           )
        {
            Monoid <M> theMonoid = backDig.theMonoid;

            if (frontList.Count > 0)
            {
                return(new DeepFTreeM <T, M>
                           (theMonoid,
                           new Digit <T, M>(theMonoid,
                                            frontList),
                           innerFT,
                           backDig
                           ));
            }
            //else

            if (innerFT is EmptyFTreeM <Node <T, M>, M> )
            {
                return(FromSequence(backDig.digNodes, theMonoid));
            }

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

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

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

            return(theNewDeepTree);
        }
Beispiel #4
0
        public static FTreeM <T, M> CreateR(Digit <T, M> frontDig,
                                            FTreeM <Node <T, M>, M> innerFT,
                                            List <T> backList        //may be empty!
                                            )
        {
            Monoid <M> theMonoid = frontDig.theMonoid;

            if (backList.Count > 0)
            {
                return(new DeepFTreeM <T, M>
                           (theMonoid,
                           frontDig,
                           innerFT,
                           new Digit <T, M>(theMonoid, backList)
                           ));
            }
            //else

            if (innerFT is EmptyFTreeM <Node <T, M>, M> )
            {
                return(FromSequence(frontDig.digNodes, theMonoid));
            }

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

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

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

            return(theNewDeepTree);
        }