Has anyone done any research into fusing operations that involve thawing some data, mutating it, and then freezing it again?

Data.Vector does something similar; it turns vectors into streams, operates on the streams, and then turns them back into vectors. It can fuse these operations by removing intermediate  However, I've done a bit of preliminary work on a fusion system that works on operations of the form 

    runST $ do 
        x' <- thaw x
        foo x'
        freeze x'

and yields promising results in some cases. This could be useful for data structures that aren't stream-able, but suffer from lots of unnecessary freezing and unfreezing. 

This seems like the sort of thing that someone would have already done, so I wanted to check if anyone knew of any previous work on this.

Cheers,
Will