public Iteratee <D, A> ContraSelect <D>(Func <D, E> f) { return(Fold( (a, i) => Iteratee <D, A> .Done(a, i.IsEof ? Input <D> .Eof() : Input <D> .Empty()) , r => Iteratee <D, A> .Cont(i => r(i.Select(f)).ContraSelect(f)) )); }
public static Iteratee <E, B> SelectMany <E, A, B>(this Iteratee <E, A> k, Func <A, Iteratee <E, B> > f) => k.Fold( (a, i) => i.IsEmpty ? f(a) : f(a).Fold( (b, _) => Iteratee <E, B> .Done(b, i) , s => s(i) ) , r => Iteratee <E, B> .Cont(u => r(u).SelectMany(f)) );