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))); }
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"); })); }