Exemple #1
0
        //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>();
                    }
                };
            }));
        }