Ejemplo n.º 1
0
        public override FingerTree <T, M> AddLeft(T a)
        {
            Measured <T, M> m = Measured;
            M size            = m.Append(m.Measure(a), Size);

            return(_prefix.Match(x1 => new Deep <T, M>(m, size, _mk.Two(a, x1.V), _middle, _suffix),
                                 x2 => new Deep <T, M>(m, size, _mk.Three(a, x2.V1, x2.V2), _middle, _suffix),
                                 x3 => new Deep <T, M>(m, size, _mk.Four(a, x3.V1, x3.V2, x3.V3), _middle, _suffix),
                                 x4 => new Deep <T, M>(m, size, _mk.Two(a, x4.V1),
                                                       _middle.AddLeft(_mk.Node3(x4.V2, x4.V3, x4.V4)), _suffix)));
        }
Ejemplo n.º 2
0
        public Split <T, Digit <T, M>, M> Split(MeasurePredicate <M> predicate, M acc)
        {
            return(Match(one => new Split <T, Digit <T, M>, M>(null, one.V, null),
                         two =>
            {
                M value = _m.Append(acc, _m.Measure(two.V1));
                if (predicate(value))
                {
                    return new Split <T, Digit <T, M>, M>(null, two.V1, _mk.One(two.V2));
                }

                return new Split <T, Digit <T, M>, M>(_mk.One(two.V1), two.V2, null);
            },
                         three =>
            {
                M value = _m.Append(acc, _m.Measure(three.V1));
                if (predicate(value))
                {
                    return new Split <T, Digit <T, M>, M>(null, three.V1, _mk.Two(three.V2, three.V3));
                }
                value = _m.Append(value, _m.Measure(three.V2));
                if (predicate(value))
                {
                    return new Split <T, Digit <T, M>, M>(_mk.One(three.V1), three.V2, _mk.One(three.V3));
                }

                throw new InvalidOperationException("Should not have split prefix if not in the middle");
            },
                         four =>
            {
                M value = _m.Append(acc, _m.Measure(four.V1));
                if (predicate(value))
                {
                    return new Split <T, Digit <T, M>, M>(null, four.V1, _mk.Three(four.V2, four.V3, four.V4));
                }
                value = _m.Append(value, _m.Measure(four.V2));
                if (predicate(value))
                {
                    return new Split <T, Digit <T, M>, M>(_mk.One(four.V1), four.V2, _mk.Two(four.V3, four.V4));
                }
                value = _m.Append(value, _m.Measure(four.V3));
                if (predicate(value))
                {
                    return new Split <T, Digit <T, M>, M>(_mk.Two(four.V1, four.V2), four.V3, _mk.One(four.V4));
                }

                throw new InvalidOperationException("Should not have split prefix if not in the middle");
            }));
        }