Exemple #1
0
        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)));
        }
Exemple #2
0
        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");
            }
        }