示例#1
0
        static FingerTree <Node <Node <T, M>, M>, M> AddDigits2 <T, M>(Measured <Node <T, M>, M> m,
                                                                       FingerTree <Node <Node <T, M>, M>, M> m1,
                                                                       Digit <Node <T, M>, M> x, Node <T, M> n1, Node <T, M> n2,
                                                                       Digit <Node <T, M>, M> y,
                                                                       FingerTree <Node <Node <T, M>, M>, M> m2)
        {
            var mk = new MakeTree <Node <T, M>, M>(m);

            return(x.Match(x1 => y.Match(y1 => Append2(m, m1, mk.Node2(x1.V, n1), mk.Node2(n2, y1.V), m2),
                                         y2 => Append2(m, m1, mk.Node3(x1.V, n1, n2), mk.Node2(y2.V1, y2.V2), m2),
                                         y3 => Append2(m, m1, mk.Node3(x1.V, n1, n2), mk.Node3(y3.V1, y3.V2, y3.V3), m2),
                                         y4 => Append3(m, m1, mk.Node3(x1.V, n1, n2), mk.Node2(y4.V1, y4.V2),
                                                       mk.Node2(y4.V3, y4.V4), m2)),
                           x2 => y.Match(y1 => Append2(m, m1, mk.Node3(x2.V1, x2.V2, n1), mk.Node2(n2, y1.V), m2),
                                         y2 => Append2(m, m1, mk.Node3(x2.V1, x2.V2, n1), mk.Node3(n2, y2.V1, y2.V2), m2),
                                         y3 => Append3(m, m1, mk.Node3(x2.V1, x2.V2, n1), mk.Node2(n2, y3.V1),
                                                       mk.Node2(y3.V2, y3.V3), m2),
                                         y4 => Append3(m, m1, mk.Node3(x2.V1, x2.V2, n1), mk.Node3(n2, y4.V1, y4.V2),
                                                       mk.Node2(y4.V3, y4.V4), m2)),
                           x3 => y.Match(y1 => Append2(m, m1, mk.Node3(x3.V1, x3.V2, x3.V3), mk.Node3(n1, n2, y1.V), m2),
                                         y2 => Append3(m, m1, mk.Node3(x3.V1, x3.V2, x3.V3), mk.Node2(n1, n2),
                                                       mk.Node2(y2.V1, y2.V2), m2),
                                         y3 => Append3(m, m1, mk.Node3(x3.V1, x3.V2, x3.V3), mk.Node3(n1, n2, y3.V1),
                                                       mk.Node2(y3.V2, y3.V3), m2),
                                         y4 => Append3(m, m1, mk.Node3(x3.V1, x3.V2, x3.V3), mk.Node3(n1, n2, y4.V1),
                                                       mk.Node3(y4.V2, y4.V3, y4.V4), m2)),
                           x4 => y.Match(y1 => Append3(m, m1, mk.Node3(x4.V1, x4.V2, x4.V3), mk.Node2(x4.V4, n1),
                                                       mk.Node2(n2, y1.V), m2),
                                         y2 => Append3(m, m1, mk.Node3(x4.V1, x4.V2, x4.V3), mk.Node3(x4.V4, n1, n2),
                                                       mk.Node2(y2.V1, y2.V2), m2),
                                         y3 => Append3(m, m1, mk.Node3(x4.V1, x4.V2, x4.V3), mk.Node3(x4.V4, n1, n2),
                                                       mk.Node3(y3.V1, y3.V2, y3.V3), m2),
                                         y4 => Append4(m, m1, mk.Node3(x4.V1, x4.V2, x4.V3), mk.Node3(x4.V4, n1, n2),
                                                       mk.Node2(y4.V1, y4.V2), mk.Node2(y4.V3, y4.V4), m2))));
        }
示例#2
0
        static FingerTree <Node <T, M>, M> AddDigits0 <T, M>(Measured <T, M> m, FingerTree <Node <T, M>, M> m1,
                                                             Digit <T, M> s1, Digit <T, M> p2, FingerTree <Node <T, M>, M> m2)
        {
            var mk = new MakeTree <T, M>(m);

            return(s1.Match(x1 => p2.Match(y1 => Append1(m, m1, mk.Node2(x1.V, y1.V), m2),
                                           y2 => Append1(m, m1, mk.Node3(x1.V, y2.V1, y2.V2), m2),
                                           y3 => Append2(m, m1, mk.Node2(x1.V, y3.V1), mk.Node2(y3.V2, y3.V3), m2),
                                           y4 => Append2(m, m1, mk.Node3(x1.V, y4.V1, y4.V2), mk.Node2(y4.V3, y4.V4), m2)),
                            x2 => p2.Match(y1 => Append1(m, m1, mk.Node3(x2.V1, x2.V2, y1.V), m2),
                                           y2 => Append2(m, m1, mk.Node2(x2.V1, x2.V2), mk.Node2(y2.V1, y2.V2), m2),
                                           y3 => Append2(m, m1, mk.Node3(x2.V1, x2.V2, y3.V1), mk.Node2(y3.V2, y3.V3),
                                                         m2),
                                           y4 => Append2(m, m1, mk.Node3(x2.V1, x2.V2, y4.V1),
                                                         mk.Node3(y4.V2, y4.V3, y4.V4), m2)),
                            x3 => p2.Match(y1 => Append2(m, m1, mk.Node2(x3.V1, x3.V2), mk.Node2(x3.V3, y1.V), m2),
                                           y2 => Append2(m, m1, mk.Node3(x3.V1, x3.V2, x3.V3), mk.Node2(y2.V1, y2.V2), m2),
                                           y3 => Append2(m, m1, mk.Node3(x3.V1, x3.V2, x3.V3),
                                                         mk.Node3(y3.V1, y3.V2, y3.V3), m2),
                                           y4 => Append3(m, m1, mk.Node3(x3.V1, x3.V2, x3.V3), mk.Node2(y4.V1, y4.V2),
                                                         mk.Node2(y4.V3, y4.V4), m2)),
                            x4 => p2.Match(y1 => Append2(m, m1, mk.Node3(x4.V1, x4.V2, x4.V3), mk.Node2(x4.V4, y1.V), m2),
                                           y2 => Append2(m, m1, mk.Node3(x4.V1, x4.V2, x4.V3), mk.Node3(x4.V4, y2.V1, y2.V2), m2),
                                           y3 => Append3(m, m1, mk.Node3(x4.V1, x4.V2, x4.V3), mk.Node2(x4.V4, y3.V1),
                                                         mk.Node2(y3.V2, y3.V3), m2),
                                           y4 => Append3(m, m1, mk.Node3(x4.V1, x4.V2, x4.V3), mk.Node3(x4.V4, y4.V1, y4.V2),
                                                         mk.Node2(y4.V3, y4.V4), m2))));
        }
示例#3
0
        public override FingerTree <T, M> AddRight(T a)
        {
            Measured <T, M> m = Measured;
            M measure         = m.Append(m.Measure(a), Size);

            return(_suffix.Match(x1 => new Deep <T, M>(m, measure, _prefix, _middle, _mk.Two(x1.V, a)),
                                 x2 => new Deep <T, M>(m, measure, _prefix, _middle, _mk.Three(x2.V1, x2.V2, a)),
                                 x3 => new Deep <T, M>(m, measure, _prefix, _middle, _mk.Four(x3.V1, x3.V2, x3.V3, a)),
                                 x4 => new Deep <T, M>(m, measure, _prefix, _middle.AddRight(_mk.Node3(x4.V1, x4.V2, x4.V3)),
                                                       _mk.Two(x4.V4, a))));
        }
示例#4
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)));
        }