public override Split <FingerTree <T, M>, T, M> Split(Func <M, bool> p, M a) { var fdm = _m.BinaryOperator(a, _leftDigits.Measure()); if (p(fdm)) { var lsplit = _leftDigits.Split(p, a); return(new Split <FingerTree <T, M>, T, M>(FromSequence(lsplit.Left.Digits, _m), lsplit.SplitItem, Create(lsplit.Right.Digits, _fingerTree, _rightDigits))); } var ftm = _m.BinaryOperator(fdm, _fingerTree.Measure()); if (p(ftm)) { var ms = _fingerTree.Split(p, fdm); var ml = ms.Left; var mi = ms.SplitItem; var sml = (new Digit <T, M>(_m, mi.Nodes)).Split(p, _m.BinaryOperator(fdm, ml.Measure())); var fi = sml.SplitItem; var flt = CreateR(_leftDigits, ml, sml.Left.Digits); var frt = Create(sml.Right.Digits, ms.Right, _rightDigits); return(new Split <FingerTree <T, M>, T, M>(flt, fi, frt)); } var rsplit = _rightDigits.Split(p, ftm); return(new Split <FingerTree <T, M>, T, M>(CreateR(_leftDigits, _fingerTree, rsplit.Left.Digits), rsplit.SplitItem, FromSequence(rsplit.Right.Digits, _m))); }
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"); } }