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

Re: [Sc-devel] RFC: Pbind redesign?



Hi Julian,

That does not work - there is no guarantee that every stream that has cleanup needs will be doing something to 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 the list of cleanup needs itself.


I see no reason why the stream that needs termination shouldn't add the termination function to every event it sends downstream. This does not add any complexity and does not afford others to care for their potential presence.All the terminator has to do is to keep a previous event in cache, just in case the next step needs termination.


RJK



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]);
		^outevent
	}

}


--





.
_______________________________________________
Sc-devel mailing list
Sc-devel@xxxxxxxxxxxxxxx
http://www.create.ucsb.edu/mailman/listinfo/sc-devel


_______________________________________________
Sc-devel mailing list
Sc-devel@xxxxxxxxxxxxxxx
http://www.create.ucsb.edu/mailman/listinfo/sc-devel


--





.