I have a plan to implement snapshots. Imagine that you have a storage full of data and you want to do some tests on it by changing it's contents. But since you don't actually want to change the storage, snapshots could be used to keep the state.
The idea is same as implemented in transactions but turned arround. When a snapshot is created, every write to the underlying stream will actually write data to a temporary snapshot instead keeping the underlying stream unchanged. Snapshot will keep track of areas where data has been written. Also, snapshot will contain all the data that has changed. During reading, snapshot will check if data read is contained in the snapshot at current position and read it from snapshot if it is, otherwise read it from underlying stream.
Good thing is that many snapshots can be levelled one onto another or even create a tree. Snapshot can also be merged with the stream or snapshot below it.