SelectMany <TEnv, TFirst, TSecond, TResult>( this IReader <TEnv, TFirst> reader, Func <TFirst, IReader <TEnv, TSecond> > secondSelector, Func <TFirst, TSecond, TResult> resultSelector) { if (reader == null) { throw new ArgumentNullException(nameof(reader)); } if (secondSelector == null) { throw new ArgumentNullException(nameof(secondSelector)); } if (resultSelector == null) { throw new ArgumentNullException(nameof(resultSelector)); } return(reader.Bind(x => secondSelector(x).Map(y => resultSelector(x, y)))); }