
Well, It looks like with 'transformer' look onto iteratees it is possible to fold two streams without anything except Iteratee, yet some complications arise. Even real zipping. for example merging two sorted streams with output stream sorted, is expressible. More preciesely, I tried to write a separate module (attached) and with careful use of 'runners' I got stack of Iteratee/Enumeratee transformers, that shall do the job. However, typing of the running function and input streams is a mess: t \i e g -> mkEnumeration $ enumerateTo g $ mkIteration $ enumerateTo e (mkIteration i) \i e g -> mkEnumeration $ enumerateTo g $ mkIteration $ enumerateTo e (mkIteration i) :: Iteratee e2 a s2 (Iteratee e1 a s1 (Enumeratee e r s m)) a -> Enumeration e2 a s2 (Iteratee e1 a s1 (Enumeratee e r s m)) -> Enumeration e1 a s1 (Enumeratee e r s m) -> Enumeration e r s m And lifting of innermost iteratee's 'nextIM' is not sufficient for merge of sorting streams: A separate one must be written.