/// <summary> /// See also https://msdn.microsoft.com/en-us/library/bb548651(v=vs.110).aspx /// </summary> /// <typeparam name="T"></typeparam> /// <param name="input"></param> /// <param name="func"></param> /// <returns></returns> public static Bag <Option <T> > Aggregate <T>(this Bag <T> input, Func <T, T, T> func) => input .Select(OptionX.Option) .Aggregate(new Option <T>(), func.OptionBinaryFunc());
/// <summary> /// See also https://msdn.microsoft.com/en-us/library/bb534972(v=vs.110).aspx /// </summary> /// <typeparam name="T"></typeparam> /// <param name="input"></param> /// <param name="f"></param> /// <returns></returns> public static Bag <bool> Any <T>(this Bag <T> input, Func <T, bool> f) => input.Select(f).AnyTrue();
public static Bag <Option <T> > Average <P, T>(this P policy, Bag <T> input) where P : struct, INumericPolicy <T> => input .Select(v => Tuple.Create(v, 1L)) .Aggregate((a, b) => Tuple.Create(policy.Plus(a.Item1, b.Item1), a.Item2 + b.Item2)) .Select(x => x.Select(v => policy.Div(v.Item1, policy.FromLong(v.Item2))));
/// <summary> /// See also https://msdn.microsoft.com/en-us/library/bb338038(v=vs.110).aspx /// </summary> /// <typeparam name="T"></typeparam> /// <param name="input"></param> /// <returns></returns> public static Bag <long> Count <T>(this Bag <T> input) => input.Select(_ => 1L).Sum();
public static Bag <KeyValuePair <K, T> > SelectWithKey <K, T>(this Bag <T> bag, Func <T, K> f) => bag.Select(v => f(v).WithValue(v));
public static Bag <KeyValuePair <K, T> > SelectValue <K, I, T>( this Bag <KeyValuePair <K, I> > bag, Func <I, T> f) => bag.Select(v => v.Key.WithValue(f(v.Value)));
/// <summary> /// See also https://msdn.microsoft.com/en-us/library/bb348436(v=vs.110).aspx /// </summary> /// <typeparam name="T"></typeparam> /// <param name="input"></param> /// <returns></returns> public static Bag <T> Distinct <T>(this Bag <T> input) => input .Select(v => v.WithValue(new Void())) .GroupBy((a, _) => a) .Select(v => v.Key);
/// <summary> /// See also https://msdn.microsoft.com/en-us/library/bb534493(v=vs.110).aspx /// </summary> /// <typeparam name="K"></typeparam> /// <typeparam name="V"></typeparam> /// <typeparam name="T"></typeparam> /// <param name="input"></param> /// <param name="key"></param> /// <param name="value"></param> /// <param name="reduce"></param> /// <returns></returns> public static Bag <KeyValuePair <K, V> > GroupBy <K, V, T>( this Bag <T> input, Func <T, K> key, Func <T, V> value, Func <V, V, V> reduce) => input.Select(v => key(v).WithValue(value(v))).GroupBy(reduce);
private static Bag <KeyValuePair <T, Counters> > ToMultiSet <T>( this Bag <T> input, long a, long b) => input.Select(v => v.WithValue(new Counters(a, b)));