
I was using STRefs the other day and I ran across a case where I really wanted the ability to save the state of all my references, execute some action, and then restore the state later if needed. I didn't find anything that does this on hackage so I implemented a small wrapper around STRefs which does what I want. Before I put it on hackage I thought I'd run it by haskell-cafe. It works as follows: test :: (String, Bool) test = runContext $ do a <- newRef "foo" b <- newRef False restore <- save writeRef a "bar" writeRef b True when someCondition restore x <- readRef a y <- readRef b return (x, y) If someCondition, the existing state is restored and test returns ("foo", False) otherwise nothing special happens and test returns ("bar", True) Also each reference has a unique key that can make it much easier to convert structures that use STRefs to pure stuctures. Reads, writes and creating refs are still constant time operations (with only a very very small overhead) and garbage collecting behavior should be the same as with regular STRefs. My implementation is here: http://gist.github.com/316738 What do you think? Any suggestions? Does anything like this already exist in hackage? Does this seem useful to other people besides me? :) Any glaring purity issues that I overlooked? Thanks for your input, - Job