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
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to