[Haskell-cafe] save/restore of STRef state

Job Vranish job.vranish at gmail.com
Sat Feb 27 11:17:34 EST 2010

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",
  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:

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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.haskell.org/pipermail/haskell-cafe/attachments/20100227/820b7abb/attachment.html

More information about the Haskell-Cafe mailing list