duncan.coutts: > On Tue, 2009-10-27 at 17:00 +0100, Daniel Fischer wrote: > > > Look at the sources: > > > > hGetLine :: Handle -> IO ByteString > > hGetLine h = wantReadableHandle "Data.ByteString.hGetLine" h $ \ handle_ -> > > do > > case haBufferMode handle_ of > > NoBuffering -> error "no buffering" > > _other -> hGetLineBuffered handle_ > > > > where > > ... > > > > So, in ghci, stdin isn't buffered and ByteString can't cope with that. > > Why exactly, I don't know. > > By comparison if we look at System.IO.hGetLine we see: > > hGetLine :: Handle -> IO String > hGetLine h = do > m <- wantReadableHandle "hGetLine" h $ \ handle_ -> do > case haBufferMode handle_ of > NoBuffering -> return Nothing > LineBuffering -> do > l <- hGetLineBuffered handle_ > return (Just l) > BlockBuffering _ -> do > l <- hGetLineBuffered handle_ > return (Just l) > case m of > Nothing -> hGetLineUnBuffered h > Just l -> return l > > So there is something special about an unbuffered hGetLine. I can't > remember exactly but when we implemented hGetLine for ByteString I guess > we didn't understand / couldn't be bothered with the weird unbuffered > case. > > The System.IO code in ghc-6.10 also notes: > > -- ToDo: the unbuffered case is wrong: it doesn't lock the handle for > -- the duration. > > In ghc-6.12 I think the unbuffered mode for input was simply abolished > so there is no longer a hGetLineUnBuffered case. >
Pretty sure that stuff has been added since we wrote the bytestring code. -- Don _______________________________________________ Haskell-Cafe mailing list [email protected] http://www.haskell.org/mailman/listinfo/haskell-cafe
