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