
Was there any kind of consensus emerging on this? Leaving aside what might be done with the Char-based functions (and people seem to think they're fine as is) I'd like to suggest the following: * System.IO: addition of new Word8-based functions hGetOctet :: Handle -> IO Word8 hLookAheadOctet :: Handle -> IO Word8 hPutOctet :: Handle -> Word8 -> IO () hPutArray :: Handle -> [Word8] -> IO () hLazyGetArray :: Handle -> IO [Word8] ...as per hGetChar, hLookAhead, hPutChar, hPutStr and hGetContents. hGetArrayBlock :: Handle -> Int -> IO [Word8] hGetArrayReady :: Handle -> Int -> IO [Word8] hGetArrayBlock would read so many octets from the handle, up to the EOF. hGetArrayReady would read so many octets from the handle, up to the EOF or octets not ready. The semantics would be something like this: hGetArrayBlock h 0 = return []; hGetArrayBlock h n = do { eof <- hIsEOF h; if eof then return [] else do { first <- hGetOctet; rest <- hGetArrayBlock h (n - 1); return (first:rest); }; }; hGetArrayReady h 0 = return []; hGetArrayReady h n = do { ready <- hReady h; if not ready then return [] else do { first <- hGetOctet; rest <- hGetArrayReady h (n - 1); return (first:rest); }; }; ...but I expect they should be implemented natively. hSetFileSize :: Handle -> Integer -> IO () There's currently no way to set the size of a file. hSetFileSize would truncate the file or pad with zero octets. * Network.Socket The send & receive functions don't do any kind of character interpretation do they? I suggest these functions be given new types (and probably new names, as I suppose we'll need the old ones for compatibility): sendTo :: Socket -> [Word8] -> SockAddr -> IO Int recvFrom :: Socket -> Int -> IO ([Word8], Int, SockAddr) send :: Socket -> [Word8] -> IO Int recv :: Socket -> Int -> IO [Word8] -- Ashley Yakeley, Seattle WA