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


_______________________________________________ Haskell-Cafe mailing list [EMAIL PROTECTED] http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to