Example #1
0
 /// <summary>
 /// The product of two monoids.
 /// </summary>
 public static Monoid <Tuple <T1, T2> > Product <T1, T2>(this Monoid <T1> monoid1,
                                                         Monoid <T2> monoid2)
 {
     return(new Monoid <Tuple <T1, T2> >(Pair.New(monoid1.Zero, monoid2.Zero),
                                         (p1, p2) =>
                                         Pair.New(monoid1.Plus(p1.Item1, p2.Item1),
                                                  monoid2.Plus(p1.Item2, p2.Item2))));
 }
 internal static V SumMeasures <V, T>(Monoid <V> monoid, V init, IEnumerable <T> sequence)
     where T : IMeasured <V>
 {
     return(monoid.Sum(init, sequence.Select(t => t.Measure)));
 }
 /// <summary>
 /// Creates the tree with the single element <paramref name="item"/> and the specified measure monoid.
 /// </summary>
 /// <typeparam name="T">The type of the elements of the tree.</typeparam>
 /// <typeparam name="V">The type of the measure values.</typeparam>
 /// <param name="item">The item.</param>
 /// <param name="measureMonoid">The measure monoid.</param>
 public static FingerTree <T, V> Single <T, V>(T item, Monoid <V> measureMonoid)
     where T : IMeasured <V>
 {
     return(new FingerTree <T, V> .Single(item, measureMonoid));
 }
 /// <summary>
 /// Creates the tree from the specified sequence.
 /// </summary>
 /// <typeparam name="T">The type of the elements of the tree.</typeparam>
 /// <typeparam name="V">The type of the measure values.</typeparam>
 /// <param name="sequence">The sequence.</param>
 /// <param name="measureMonoid">The measure monoid.</param>
 public static FingerTree <T, V> FromEnumerable <T, V>(IEnumerable <T> sequence, Monoid <V> measureMonoid)
     where T : IMeasured <V>
 {
     return(Empty <T, V>(measureMonoid).AppendRange(sequence));
 }
 /// <summary>
 /// Creates the empty tree with the specified measure monoid.
 /// </summary>
 /// <typeparam name="T">The type of the elements of the tree.</typeparam>
 /// <typeparam name="V">The type of the measure values.</typeparam>
 /// <param name="measureMonoid">The measure monoid.</param>
 public static FingerTree <T, V> Empty <T, V>(Monoid <V> measureMonoid)
     where T : IMeasured <V>
 {
     return(FingerTree <T, V> .GetEmptyFromCache <T>(measureMonoid));
 }