[Haskell-cafe] hopefully, a very quick question about ByteString lib

Don Stewart dons at galois.com
Tue Oct 27 16:19:35 EDT 2009


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


More information about the Haskell-Cafe mailing list