Made VOListenersCollection thread safe. Next need to optimize the common case (sending updates) at the expense of the rare (adding / removing objects).
Quick concurrency test before I refactor for performance.
Refactor: Remove multiple stages from pipeline
Part one of renaming & refactoring the pipeline classes
Part two of refactor / rename.
Made `currentValue` an explicit part of the `VOPipelineSource` protocol.
Refactor: Make existing VOPipeline a subclass of VOPipelineStage, and call it VOTransformingPipelineStage
Damnit, forgot a file
+ VOAsyncPipelineStage
Pulled all of the async functionality out of VOTransformingPipelineStage.
Hoist VOInvaliding to VOPipelineStage
More refactor tweaks. Cleaner, but I don’t think I’ve solved the “initial pipeline value” problem.
Added a change-describing dictionary.
This turned out to be a huge refactor. All I wanted to do is add a change describing dictionary and base the notes database on that... but the changes kept spilling and spilling and spilling.
It’s buggy but I think I finally have something kinda sorta like autosaving on a timer, all using value objects for data.
Just a wee bit of project organization / cleanup.
Make tests run 64-bit.