public static IOutputStream <TDst> Transform <TSrc, TDst>(this IOutputStream <TSrc> stream, ITransformation <TSrc, TDst> transformation, int readBufSize = 1024) { //Encoding.UTF8.GetBytes(str, strPos, charsToBuffer, intBuf, 0); return(CreateOutput <TDst>(() => { var inBuf = new TSrc[readBufSize]; var inBufPos = 0; var inBufCnt = 0; IStreamReader <TSrc> reader = null; if (stream != null) { reader = stream.CreateReader(); } return new AnonymousStreamReader <TDst>((buf, ofs, cnt) => { var totalBytesCopied = 0; while (cnt > 0) { var bytesCopied = transformation.Copy(buf, ofs, cnt); if (bytesCopied > 0) { ofs += bytesCopied; cnt -= bytesCopied; totalBytesCopied += bytesCopied; } else { Action process = () => { var itemsProcessed = transformation.Process(inBuf, inBufPos, inBufCnt); inBufCnt -= itemsProcessed; inBufPos += itemsProcessed; }; if (inBufCnt > 0) { process(); } else { if (reader == null) { return totalBytesCopied; } inBufPos = 0; //try { inBufCnt = reader.Read(inBuf, 0, inBuf.Length); //} catch (Exception err) { //inBufCnt = 0; //try { // reader.Dispose(); //} finally { // reader = null; //} //} if (inBufCnt > 0) { process(); } else { try { reader.Dispose(); } finally { reader = null; } return totalBytesCopied; } } } } return totalBytesCopied; }); })); }