public static IDataflow <Either <TLeft, IGroupedDataflow <TKey, TRight> > > GroupBySafe <TLeft, TRight, TKey>( this IDataflow <Either <TLeft, TRight> > source, Func <TRight, TKey> keySelector) { return(source .GroupBy(item => item.IsRight) .SelectMany( group => group.Key ? group .Rights() .GroupBy(keySelector) .Select(Right <TLeft, IGroupedDataflow <TKey, TRight> >) : group .Lefts() .Select(Left <TLeft, IGroupedDataflow <TKey, TRight> >))); }