On Apr 27, 2008, at 9:36 AM, Conal Elliott wrote:

First, I think we want readTMVar instead of takeTMVar in newTIVal.

I don't see any reason it would hurt to use takeTMVar, and I suspect the garbage collector might be slightly happier this way since it potentially means once less reference to the data stored in the TMVar.

I think we *do* want unsafeNewEmptyTMVar inlined. Here's a convenient caching wrapper:

    cached :: STM a -> TIVal a
    cached m = TIVal m (unsafePerformIO newEmptyTMVarIO)

The instances are then lovely:

    instance Functor TIVal where
    f `fmap` tiv = cached (f `fmap` force tiv)

    instance Applicative TIVal where
    pure x      = cached (pure x)
    ivf <*> ivx = cached (force ivf <*> force ivx)

    instance Monad TIVal where
    return x  = cached (return x)
    tiv >>= k = cached (force tiv >>= force . k)

Yes, this is essentially what I am working with in Reaction at the moment. It seems to be working great, but I have not specifically tested the caching behavior yet, only that it doesn't screw up what I had working in the first place.

I must admit that I think I don't fully understand the implications of inlining vs. not inlining unsafePerformIO.

- Jake
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to