Converting things to and from binary

Hal Daume III hdaume@ISI.EDU
Wed, 21 May 2003 09:15:45 -0700 (PDT)

Hi George,

> > I don't understand your example of the bit consumer and IORefs
> > though...could you explain it a bit more (no pun)?
> See the message I just posted the libraries list for a better example.

Why not use a state transformer on top of IO or something like that?

> Another one would be where you want to read some data from
> an untrusted client, limiting the number of bytes you can be bothered
> to read.  This could be done using my framework by extending the monad
> with a count, it can't be done in Malcolm's framework, at least not
> without introducing an extra first step to do the IO.

Hrm, this is interesting :).  It seems like you should be able to use
lazyGet to achieve this.  Opening a BinIO doesn't actually cause it to be
read until you actually do some of the reading.  Using lazyGet should
enable you to just read the amount you need to read under certain
circumstances.  I envision something like:

newtype UntrustedString = UntrustedString String

instance Binary UntrustedString where
  put_ bh (UntrustedString s) = put_ bh s  -- put_ is trusted
  get  bh = do
    s <- lazyGet bh
    let s' = deepSeq $ take 20 s
    s' `seq` closeHandle bh
    return (UntrustedString s')

or something like that (untested, of course).