[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Sc-devel] early termination woes

Hi Julian,

That does not work - there is no guarantee that every stream that has cleanup needs will affect every event. The stream is guaranteed to have the event when it starts and when it ends but not on all intervening events, so the terminator
has to maintain that list itself.


On Dec 12, 2007, at 3:34 PM, Julian Rohrhuber wrote:
Hi Ron,

thinking a bit while implementing a simplification to cleanup (attached) I wondered whether it is such a good idea to move all the responsibility for cleaning up to an inner state of a consumer stream. This seems like calling for trouble later, as most people would not bother to implement it if they have a stream they want to end somehow. Also we don't want to create responsibility in places that don't relate directly to the cleanup.

we seem to have the trade off:

# Problem 1: calling more values from upstream than actually played

# Problem 2: having to check every single event for whether it contains things to be done. Difficult implementation.

What about this: any stream that needs to be released adds some hook to itself (or a cleanup event) to every _downstream_ event. Then all we have to call is some finish function in this event, and remove the hook. I think this would solve both problems.

// may not be needed:

EventCleanup {
	var functions;

	*new {
		^super.newCopyArgs(IdentitySet.new) // btw far more efficient!

	add { arg event;
		event[\addToCleanup].do { | f | functions.add(f) };
		event[\removeFromCleanup].do { | f | functions.remove(f) };

	cleanup { arg inevent, outevent;
		functions.do { | f | f.value(inevent) };
outevent[\removeFromCleanup] = functions.union(outevent [\removeFromCleanup]);



Sc-devel mailing list