<html>
  <head>

    <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
  </head>
  <body text="#000000" bgcolor="#FFFFFF">
    Hi, <br>
    I'm working through Simon Marlows Parallel and Concurrent
    Programming in Haskell. <br>
    In Chapter 4, p. 69, or
    <meta http-equiv="content-type" content="text/html;
      charset=ISO-8859-1">
    <a
href="http://chimera.labs.oreilly.com/books/1230000000929/ch04.html#_rate_limiting_the_producer">http://chimera.labs.oreilly.com/books/1230000000929/ch04.html#_rate_limiting_the_producer</a>
    there is the task to extend a stream processing module based on
    Control.Monad.Par in such a way that the producer is rate-limited,
    i.e. the producer should not produce more than the consumer can
    consume.<br>
    <br>
    The book suggests the following type: <br>
    data IList a <br>
        = Nil<br>
        | Cons a (IVar (IList a))<br>
        | Fork (Par ()) (IList a)<br>
    <br>
    I struggle to construct the functions for this type, as I don't know
    what to do with the IList in the Fork case. It seems more natural to
    me, to have an IVar (IList a) instead, whose value is provided by
    the computation in Par () in the following way:<br>
    <br>
    Fork (Par ()) (IVar (IList a))<br>
    <br>
    <meta http-equiv="content-type" content="text/html;
      charset=ISO-8859-1">
    streamFromListLimited :: NFData a => Int -> Int -> [a]
    -> Par (Stream a)<br>
    streamFromListLimited f d xs = do<br>
        var <- new<br>
        fork $ loop f xs var<br>
        return var<br>
      where<br>
        loop :: NFData a => Int -> [a] -> Stream a -> Par ()<br>
        loop _ []     var = put var Nil<br>
        loop 0 (x:xs) var = do<br>
            tail <- new<br>
            put var (Fork (loop d xs tail) tail) <br>
        loop n (x:xs) var = do <br>
            tail <- new<br>
            put var (Cons x tail)<br>
            loop (n-1) xs tail<br>
    <br>
    Can someone give me a hint? <br>
    Thanks, <br>
    Kilian<br>
  </body>
</html>