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