
I'll take a look at them. I want something like this: refMaybe b dflt ref = if b then readRef ref else return dflt refIgnore ref = return "blablabla" refFst ref = do (v, w) <- readRef ref return v test = do a <- newRef "x" b <- newRef 1 c <- newRef ('z', Just 0) performLocalGC -- if necessary x <- isStillNeeded a y <- isStillNeeded b z <- isStillNeeded c u <- refMaybe y "t" a -- note that it wouldn't actually read "a", -- but it won't be known until runtime. w <- refIgnore b v <- refFst c return (x, y, z) so that "run test" returns (True, False, True). Dan Doel wrote:
On Wednesday 06 January 2010 8:52:10 am Miguel Mitrofanov wrote:
Is there any kind of "ST" monad that allows to know if some STRef is no longer needed?
The problem is, I want to send some data to an external storage over a network and get it back later, but I don't want to send unnecessary data.
I've managed to do something like that with weak pointers, System.Mem.performGC and unsafePerformIO, but it seems to me that invoking GC every time is an overkill.
Oh, and I'm ready to trade the purity of runST for that, if necessary.
You may be able to use something like Oleg's Lightweight Monadic Regions to get this effect. I suppose it depends somewhat on what qualifies a reference as "no longer needed".
http://www.cs.rutgers.edu/~ccshan/capability/region-io.pdf
I'm not aware of anything out-of-the-box that does what you want, though.
-- Dan _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe