CollectionValueHolder ValueAdded ValueRemoved

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

CollectionValueHolder ValueAdded ValueRemoved

Peter Uhnak
This is something that was discussed some time ago but never resolved.

To summarize:

When working with CollectionValueHolder one can only see whether the collection as a whole changed and not how, e.g.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
col := OrderedCollection new asValueHolder.
col add: 1.
col add: 2.
col add: 3.
col add: 4.
col whenChangedDo: [ :c :changedValue |
1halt.
].
"col = #(1 2 3 4)"

col add: 4. "whenChangedDo: c = col, changedValue = 4"
col remove: 4. "whenChangedDo: c = col, changedValue = 4"
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

In the last two cases the changedValue is the same so I can't tell from the block if the value was added or removed.

My proposition:

* introduce (at least) two more Announcements: ValueAdded and ValueRemoved
* add messages #whenAddedDo:/#whenChangedDo:
* maybe add #when:do: so it can be used as an announcable object (valueHolder when: ValueSomething do: [ :ann | ... ])

The ValueAdded/ValueRemoved would be fired when an item is added, resp. removed.

Thierry also proposed to add an index (I'd make it optional).
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
col whenAddedDo: [ :col :addedValue :optionalIndex | "here we know for sure that value was added" ].

col whenRemovedDo: [ :col :addedValue :optionalIndex | "here we know for sure that value was removed" ]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Finally Thierry mentioned a way to handle situations where values are replaced (either single one or multiple ones). As this is edge use-case and the current behavior is pretty much random I wouldn't address the replacement unless a defined use case emerges.

Any thoughts,
Peter




Reply | Threaded
Open this post in threaded view
|

Re: CollectionValueHolder ValueAdded ValueRemoved

stepharo
Go for it :)
Because indeed if you need to know what changed there is not that much of magic.


Le 3/3/16 12:50, Peter Uhnák a écrit :
This is something that was discussed some time ago but never resolved.

To summarize:

When working with CollectionValueHolder one can only see whether the collection as a whole changed and not how, e.g.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
col := OrderedCollection new asValueHolder.
col add: 1.
col add: 2.
col add: 3.
col add: 4.
col whenChangedDo: [ :c :changedValue |
1halt.
].
"col = #(1 2 3 4)"

col add: 4. "whenChangedDo: c = col, changedValue = 4"
col remove: 4. "whenChangedDo: c = col, changedValue = 4"
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

In the last two cases the changedValue is the same so I can't tell from the block if the value was added or removed.

My proposition:

* introduce (at least) two more Announcements: ValueAdded and ValueRemoved
* add messages #whenAddedDo:/#whenChangedDo:
* maybe add #when:do: so it can be used as an announcable object (valueHolder when: ValueSomething do: [ :ann | ... ])

The ValueAdded/ValueRemoved would be fired when an item is added, resp. removed.

Thierry also proposed to add an index (I'd make it optional).
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
col whenAddedDo: [ :col :addedValue :optionalIndex | "here we know for sure that value was added" ].

col whenRemovedDo: [ :col :addedValue :optionalIndex | "here we know for sure that value was removed" ]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Finally Thierry mentioned a way to handle situations where values are replaced (either single one or multiple ones). As this is edge use-case and the current behavior is pretty much random I wouldn't address the replacement unless a defined use case emerges.

Any thoughts,
Peter