
Peter Simons wrote:
type Buffer = (Ptr Word8, Int)
data StreamProc ctx a = SP { start :: IO ctx , feed :: ctx -> Buffer -> IO ctx , commit :: ctx -> IO a }
Must contexts be used in a single-threaded manner? If so, I would expect this interface: start :: IO ctx feed :: ctx -> Buffer -> IO () commit :: ctx -> IO a If not, I would expect this interface: start :: ctx feed :: ctx -> Buffer -> IO ctx commit :: ctx -> a Additionally, I don't think (Ptr Word8, Int) is general enough for all reasonable uses of this interface. For example, there's nothing inherently unsafe about calculating the MD5 hash of the contents of an STUArray or UArray: feedBuffer :: ctx -> Buffer -> IO ctx feedSTUArray :: ctx -> STUArray s Int Word8 -> ST s ctx feedUArray :: ctx -> UArray Int Word8 -> ctx And what about a subrange of an STUArray or UArray? These are the problems I ran into when trying to produce a useful MD5 library for Haskell. I feel the same way as you -- that there should be a standard way of doing this -- but I don't think the three functions you propose are nearly enough. -- Ben