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> 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)); }
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))); }
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)); }
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"); } }
public override FingerTree <T, M> Merge(FingerTree <T, M> f) => f.PushLeft(_t);
public override FingerTree <T, M> Merge(FingerTree <T, M> f) { return(App2(new List <T>(), f)); }
public override FingerTree <T, M> Merge(FingerTree <T, M> f) => f;
public abstract FingerTree <T, M> App2(List <T> ts, FingerTree <T, M> f);
public abstract FingerTree <T, M> Merge(FingerTree <T, M> f);