static FingerTree <Node <Node <T, M>, M>, M> AddDigits1 <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, 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 => Append1(m, m1, mk.Node3(x1.V, n1, y1.V), m2), y2 => Append2(m, m1, mk.Node2(x1.V, n1), mk.Node2(y2.V1, y2.V2), m2), y3 => Append2(m, m1, mk.Node3(x1.V, n1, y3.V1), mk.Node2(y3.V2, y3.V3), m2), y4 => Append2(m, m1, mk.Node3(x1.V, n1, y4.V1), mk.Node3(y4.V2, y4.V3, y4.V4), m2)), x2 => y.Match(y1 => Append2(m, m1, mk.Node2(x2.V1, x2.V2), mk.Node2(n1, y1.V), m2), y2 => Append2(m, m1, mk.Node3(x2.V1, x2.V2, n1), mk.Node2(y2.V1, y2.V2), m2), y3 => Append2(m, m1, mk.Node3(x2.V1, x2.V2, n1), mk.Node3(y3.V1, y3.V2, y3.V3), m2), y4 => Append3(m, m1, mk.Node3(x2.V1, x2.V2, n1), mk.Node2(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.Node2(n1, y1.V), m2), y2 => Append2(m, m1, mk.Node3(x3.V1, x3.V2, x3.V3), mk.Node3(n1, y2.V1, y2.V2), m2), y3 => Append3(m, m1, mk.Node3(x3.V1, x3.V2, x3.V3), mk.Node2(n1, y3.V1), mk.Node2(y3.V2, y3.V3), m2), y4 => Append3(m, m1, mk.Node3(x3.V1, x3.V2, x3.V3), mk.Node3(n1, y4.V1, y4.V2), mk.Node2(y4.V3, y4.V4), m2)), x4 => y.Match(y1 => Append2(m, m1, mk.Node3(x4.V1, x4.V2, x4.V3), mk.Node3(x4.V4, n1, y1.V), m2), y2 => Append3(m, m1, mk.Node3(x4.V1, x4.V2, x4.V3), mk.Node2(x4.V4, n1), mk.Node2(y2.V1, y2.V2), m2), y3 => Append3(m, m1, mk.Node3(x4.V1, x4.V2, x4.V3), mk.Node3(x4.V4, n1, 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, n1, y4.V1), mk.Node3(y4.V2, y4.V3, y4.V4), m2)))); }
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)))); }