//public static ISequence<Option<TResult>> SelectMany<TSource, TCollection, TResult> // (this ISequence<Option<TSource>> source, // Func<TSource, ISequence<TCollection>> collectionSelector, // Func<TSource, TCollection, TResult> resultSelector) //{ // return // source.SelectMany(option => option.HasValue ? collectionSelector(option.Value).Select(t => new Option<TCollection>(t)) : Nothing<TCollection>(), // (option, cItem) => // option.HasValue && cItem.HasValue // ? new Option<TResult>(resultSelector(option.Value, cItem.Value)) // : new Option<TResult>()); //} public static ISequence <IOption <TResult> > SelectMany <TSource, TCollection, TResult> (this ISequence <IOption <TSource> > source, Func <TSource, ISequence <IOption <TCollection> > > collectionSelector, Func <TSource, TCollection, TResult> resultSelector) { return(new FunctionalSequence <IOption <TResult> >(() => { long g = 0; return () => { var pair = NtoN2Mapping.GetPair(g++); var t = source.At(pair.I); if (t.HasValue) { var cs = collectionSelector(t.Value); var c = cs.At(pair.J); return c.HasValue ? FromValue(resultSelector(t.Value, c.Value)) : Empty <TResult>(); } else { return Empty <TResult>(); } }; })); }