[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