/// <summary> /// See also https://msdn.microsoft.com/en-us/library/bb534336(v=vs.110).aspx /// </summary> /// <typeparam name="I"></typeparam> /// <typeparam name="T"></typeparam> /// <param name="input"></param> /// <param name="func"></param> /// <returns></returns> public static Bag <T> SelectMany <I, T>(this Bag <I> input, Func <I, IEnumerable <T> > func) => new SelectMany <I, T>(input, func);
/// <summary> /// See also https://msdn.microsoft.com/en-us/library/bb548891(v=vs.110).aspx /// </summary> /// <typeparam name="I"></typeparam> /// <typeparam name="T"></typeparam> /// <param name="input"></param> /// <param name="func"></param> /// <returns></returns> public static Bag <T> Select <I, T>(this Bag <I> input, Func <I, T> func) => input.SelectMany(i => new[] { func(i) });
/// <summary> /// See also https://msdn.microsoft.com/en-us/library/bb302894(v=vs.110).aspx /// </summary> /// <typeparam name="T"></typeparam> /// <param name="a"></param> /// <param name="b"></param> /// <returns></returns> public static Bag <T> DisjointUnion <T>(this Bag <T> a, Bag <T> b) => new DisjointUnion <T>(a, b);
public SelectMany(Bag <I> input, Func <I, IEnumerable <T> > func) { Input = input; Func = func; }
public static Bag <KeyValuePair <K, T> > WhereValue <K, T>( this Bag <KeyValuePair <K, Option <T> > > bag) => bag.SelectMany(p => p.Value.Select(v => p.Key.WithValue(v)).ToEnum());
public static Bag <KeyValuePair <K, Pair <A, B> > > Right <K, A, B>( this Bag <KeyValuePair <K, Pair <A, Option <B> > > > bag) => bag.SelectValue(v => v.B.Select(b => v.A.WithB(b))).WhereValue();
/// <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);
public Bag <R> Visit <T>(Bag <T> bag) => bag.SelectMany(i => i is R ? new[] { (R)(object)i } : Enumerable.Empty <R>());
/// <summary> /// See also https://msdn.microsoft.com/en-us/library/bb549393(v=vs.110).aspx /// </summary> /// <typeparam name="K"></typeparam> /// <typeparam name="T"></typeparam> /// <param name="input"></param> /// <param name="key"></param> /// <param name="reduce"></param> /// <returns></returns> public static Bag <KeyValuePair <K, T> > GroupBy <K, T>( this Bag <T> input, Func <T, K> key, Func <T, T, T> reduce) => input.GroupBy(key, v => v, reduce);
/// <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);
public static Bag <KeyValuePair <K, T> > GroupBy <K, T>( this Bag <KeyValuePair <K, T> > input, Func <T, T, T> func) => new GroupBy <K, T>(input, func);
public GroupBy(Bag <KeyValuePair <K, T> > input, Func <T, T, T> func) { Input = input; Func = func; }
public static Bag <KeyValuePair <K, Pair <A, B> > > Inner <K, A, B>( this Bag <KeyValuePair <K, Pair <Option <A>, Option <B> > > > bag) => bag.Left().Right();
/// <summary> /// See also https://msdn.microsoft.com/en-us/library/bb534803(v=vs.110).aspx /// </summary> /// <typeparam name="T"></typeparam> /// <param name="input"></param> /// <param name="func"></param> /// <returns></returns> public static Bag <T> Where <T>(this Bag <T> input, Func <T, bool> func) => input.SelectMany(i => func(i) ? Enumerable.Empty <T>() : new[] { i });
public Product(Bag <A> a, Bag <B> b) { InputA = a; InputB = b; }
/// <summary> /// See also https://msdn.microsoft.com/en-us/library/bb360913(v=vs.110).aspx /// </summary> /// <typeparam name="T"></typeparam> /// <param name="input"></param> /// <returns></returns> public static Bag <T> OfType <T>(this Bag input) => input.Accept(new OfTypeVisitor <T>());
public static Bag <Tuple <A, B> > Product <A, B>(this Bag <A> a, Bag <B> b) => new Product <A, B>(a, b);
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)));
public DisjointUnion(Bag <T> inputA, Bag <T> inputB) { InputA = inputA; InputB = inputB; }
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, Pair <A, B> > > Left <K, A, B>( this Bag <KeyValuePair <K, Pair <Option <A>, B> > > bag) => bag.SelectValue(v => v.A.Select(a => a.WithB(v.B))).WhereValue();