[Haskell-cafe] Re: Do I need to roll my own?

John Lato jwlato at gmail.com
Wed Mar 31 17:12:07 EDT 2010


Hi Dave,

> From: David Leimbach <leimy2k at gmail.com>
>
> I'm looking at iteratee as a way to replace my erroneous and really
> inefficient lazy-IO-based backend for an expect like Monad DSL I've been
> working for about 6 months or so now on and off.
>
> The problem is I want something like:
>
> expect "some String"
> send "some response"
>
> to block or perhaps timeout, depending on the environment, looking for "some
> String" on an input Handle, and it appears that iteratee works in a very
> fixed block size.  While a fixed block size is ok, if I can put back unused
> bytes into the enumerator somehow (I may need to put a LOT back in some
> cases, but in the common case I will not need to put any back as most
> expect-like scripts typically catch the last few bytes of data sent before
> the peer is blocked waiting for a response...)

I'm quite sure I don't know what you're trying to do.  The only time I
can think of needing this is if you're running an iteratee on a file
handle, keeping the handle open, then running another iteratee on it.
Is this what you're doing?  If so, I would make a new run function:

runResidue :: (Monad m, SC.StreamChunk s el) => IterateeG s el m a -> m (a, s)
runResidue iter = runIter iter (EOF Nothing) >>= \res ->
  case res of
    Done x s -> return (x, s)
    Cont _ e -> error $ "control message: " ++ show e

This function will return the unused portion of the stream, then you
can do this:

enumResidue :: Handle -> s -> EnumeratorGM s el m a
enumResidue h s = enumPure1Chunk s >. enumHandle h

Is this what you need?  If I'm completely wrong about what you're
trying to do (or you're using multiple threads), there are other
options.

You also may want to look at iteratee-HEAD.  The implementation has
been cleaned up a lot, the block sizes are user-specified, and there's
an exception-based, user-extensible mechanism for iteratees to alter
enumerator behavior.

Sincerely,
John


More information about the Haskell-Cafe mailing list