Exemple #1
0
 public Node3(Measured <T, M> m, Node3 <T, M> other)
     : base(m, m.Append(m.Measure(other.V1), m.Append(m.Measure(other.V2), m.Measure(other.V3))))
 {
     _v1 = other.V1;
     _v2 = other.V2;
     _v3 = other.V3;
 }
Exemple #2
0
 public Three(Measured <T, M> m, T v1, T v2, T v3)
     : base(m, m.Append(m.Measure(v1), m.Append(m.Measure(v2), m.Measure(v3))))
 {
     _v1 = v1;
     _v2 = v2;
     _v3 = v3;
 }
Exemple #3
0
 public Four(Measured <T, M> m, T v1, T v2, T v3, T v4)
     : base(m, m.Append(m.Measure(v1), m.Append(m.Measure(v2), m.Append(m.Measure(v3), m.Measure(v4)))))
 {
     _v1 = v1;
     _v4 = v4;
     _v2 = v2;
     _v3 = v3;
 }
Exemple #4
0
 static FingerTree <Node <T, M>, M> Append1 <T, M>(Measured <T, M> m, FingerTree <Node <T, M>, M> t1, Node <T, M> n1,
                                                   FingerTree <Node <T, M>, M> t2)
 {
     return(t1.Match(e => t2.AddLeft(n1),
                     s => t2.AddLeft(n1).AddLeft(s.Item),
                     d => t2.Match(e2 => t1.AddRight(n1),
                                   s2 => t1.AddRight(n1).AddRight(s2.Item),
                                   d2 =>
                                   new Deep <Node <T, M>, M>(m.Node, m.Append(m.Append(d.Size, m.Node.Measure(n1)), d2.Size),
                                                             d._prefix,
                                                             AddDigits1(m.Node, d._middle, d._suffix, n1, d2._prefix,
                                                                        d2._middle),
                                                             d2._suffix))));
 }
Exemple #5
0
        public override FingerTree <T, M> Concat(FingerTree <T, M> t)
        {
            Measured <T, M> m = Measured;

            return(t.Match(e => this,
                           s => AddRight(s.Item),
                           d => new Deep <T, M>(m, m.Append(Size, d.Size), _prefix,
                                                AddDigits0(m, _middle, _suffix, d._prefix, d._middle), d._suffix)));
        }
Exemple #6
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))));
        }
Exemple #7
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)));
        }
Exemple #8
0
 static FingerTree <Node <T, M>, M> Append4 <T, M>(Measured <T, M> m, FingerTree <Node <T, M>, M> t1, Node <T, M> n1,
                                                   Node <T, M> n2,
                                                   Node <T, M> n3, Node <T, M> n4, FingerTree <Node <T, M>, M> t2)
 {
     return(t1.Match(e => t2.AddLeft(n4).AddLeft(n3).AddLeft(n2).AddLeft(n1),
                     s => t2.AddLeft(n4).AddLeft(n3).AddLeft(n2).AddLeft(n1).AddLeft(s.Item),
                     d => t2.Match(e2 => t2.AddRight(n1).AddRight(n2).AddRight(n3).AddRight(n4),
                                   s2 => t2.AddRight(n1).AddRight(n2).AddRight(n3).AddRight(n4).AddRight(s2.Item),
                                   d2 =>
                                   new Deep <Node <T, M>, M>(m.Node,
                                                             m.Append(
                                                                 m.Append(
                                                                     m.Append(
                                                                         m.Append(
                                                                             m.Append(d.Size, n1.Measure),
                                                                             n2.Measure), n3.Measure),
                                                                     n4.Measure),
                                                                 d2.Size), d._prefix,
                                                             AddDigits4(m.Node, d._middle, d._suffix, n1, n2, n3, n4,
                                                                        d2._prefix,
                                                                        d2._middle),
                                                             d2._suffix))));
 }
Exemple #9
0
 public Node2(Measured <T, M> m, Node2 <T, M> other)
     : base(m, m.Append(m.Measure(other.V1), m.Measure(other.V2)))
 {
     _v1 = other.V1;
     _v2 = other.V2;
 }
Exemple #10
0
 public Node2(Measured <T, M> m, T v1, T v2)
     : base(m, m.Append(m.Measure(v1), m.Measure(v2)))
 {
     _v1 = v1;
     _v2 = v2;
 }
Exemple #11
0
 public M Measure()
 {
     return(FoldLeft(x => t => _m.Append(x, _m.Measure(t)), _m.Identity));
 }
Exemple #12
0
        public override Split <T, FingerTree <T, M>, M> Split(MeasurePredicate <M> predicate, M acc)
        {
            var mk = new MakeTree <Node <T, M>, M>(Measured.Node);

            M prefixSize = Measured.Append(acc, _prefix.Size);

            if (predicate(prefixSize))
            {
                Split <T, Digit <T, M>, M> split = _prefix.Split(predicate, acc);

                FingerTree <T, M> leftTree = split.Left == null?_mk.Empty() : split.Left.ToTree();

                FingerTree <T, M> rightTree;
                if (split.Right != null)
                {
                    rightTree = _mk.Deep(split.Right, _middle, _suffix);
                }
                else
                {
                    rightTree = _middle.Match(e => _suffix.ToTree(),
                                              s => _mk.Deep(s.Item.Match <Digit <T, M> >(x2 => _mk.Two(x2.V1, x2.V2),
                                                                                         x3 => _mk.Three(x3.V1, x3.V2, x3.V3)),
                                                            mk.Empty(), _suffix),
                                              d =>
                    {
                        var leftView = _middle.Left;
                        return(_mk.Deep(leftView.Head.Match <Digit <T, M> >(x2 => _mk.Two(x2.V1, x2.V2),
                                                                            x3 => _mk.Three(x3.V1, x3.V2, x3.V3)),
                                        leftView.Tail, _suffix));
                    });
                }

                return(new Split <T, FingerTree <T, M>, M>(leftTree, split.Item, rightTree));
            }

            M middleSize = Measured.Append(prefixSize, _middle.Size);

            if (predicate(middleSize))
            {
                Split <Node <T, M>, FingerTree <Node <T, M>, M>, M> split = _middle.Split(predicate, prefixSize);

                Split <T, Digit <T, M>, M> splitMidLeft = split.Item
                                                          .Match <Digit <T, M> >(x2 => _mk.Two(x2.V1, x2.V2), x3 => _mk.Three(x3.V1, x3.V2, x3.V3))
                                                          .Split(predicate, Measured.Append(prefixSize, split.Left.Size));

                FingerTree <T, M> leftTree  = _mk.Deep(_prefix, split.Left, splitMidLeft.Left);
                FingerTree <T, M> rightTree = _mk.Deep(splitMidLeft.Right, split.Right, _suffix);

                return(new Split <T, FingerTree <T, M>, M>(leftTree, splitMidLeft.Item, rightTree));
            }

            Split <T, Digit <T, M>, M> splitSuffix = _suffix.Split(predicate, middleSize);
            FingerTree <T, M>          right       = splitSuffix.Right == null?_mk.Empty() : splitSuffix.Right.ToTree();

            FingerTree <T, M> left;

            if (splitSuffix.Left != null)
            {
                left = _mk.Deep(_prefix, _middle, splitSuffix.Left);
            }
            else
            {
                left = _middle.Match(e => _prefix.ToTree(),
                                     s => _mk.Deep(_prefix, mk.Empty(), s.Item.Match <Digit <T, M> >(x2 => _mk.Two(x2.V1, x2.V2),
                                                                                                     x3 => _mk.Three(x3.V1, x3.V2, x3.V3))),
                                     d =>
                {
                    var rightView = _middle.Right;
                    return(_mk.Deep(_prefix, rightView.Tail, rightView.Head.Match <Digit <T, M> >(x2 => _mk.Two(x2.V1, x2.V2),
                                                                                                  x3 => _mk.Three(x3.V1, x3.V2, x3.V3))));
                });
            }

            return(new Split <T, FingerTree <T, M>, M>(left, splitSuffix.Item, right));
        }
Exemple #13
0
 public FingerTree <T, M> Deep(Digit <T, M> prefix, FingerTree <Node <T, M>, M> middle, Digit <T, M> suffix)
 {
     return(Deep(_m.Append(prefix.Measure(), _m.Append(middle.Size, suffix.Measure())), prefix, middle, suffix));
 }