Hi Michael,
The sourceFile function reads the file in chunks and passes each chunk down the conduit, although the sizes of the chunks are not specified. If that's ok with you, you may be able to do something as simple as this:
sourceFile inFile `fuse` accumulateMD5 `fuseUpstream` sinkFile outFile
where accumulateMD5 does the MD5 calculation.
If you need control over the sizes of the chunks, I'd add something else to the pipeline between sourceFile and accumulateMD5 that sorts that out, rather than using sourceFileRange which will open the file and seek to the right place each time you call it.
Hope that helps,