
George Russell wrote:
Sorry, I know there was an ongoing discussion on this topic somewhere, but I can't find it, so I'll have to hope this list is the most appropriate.
The general problem to solve is "How to we convert things to and from a binary format, so they can be efficiently written to and from disk". I have solved this (incompletely) twice myself, I expect Glasgow Haskell has solved it too, there really ought to be a standard solution.
From the deficiencies of my incomplete solutions I conclude: (1) you don't want to force everything to go via single Haskell characters. This is horrendously inefficient when what you want is to blast in and out large quantities of binary data, and of course that's precisely where you probably want efficiency. (2) you don't want a binary converter only to be able to write to Handles. I've found myself that it's useful to be able to convert to (for example) vectors of bytes.
Possibly the best way to handle this would be to extend the Storable
class, e.g.
class Storable a where
...
hPutObj :: Handle -> a -> IO ()
hGetObj :: Handle -> IO a
toByteList :: a -> [Word8]
fromByteList :: [Word8] -> a
toByteArray :: a -> Array Int Word8
fromByteArray :: Array Int Word8 -> a
At a minimum, it would be useful to at least have standard low-level
read/write functions, e.g.
hWrite :: Handle -> Ptr a -> IO ()
hRead :: Handle -> Ptr a -> IO ()
The rest could then be constructed using the existing Storable
methods.
That still leaves the effort of [un]marshalling boxed values, but that
may be unavoidable.
--
Glynn Clements