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) )); }
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); } }
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); }
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); }