Le 22/03/2015 18:57, stepharo a écrit :
may be a first step would be to have findFirst: aBlock startingAt: based
on findFirst:
findFirst: aBlock
"Return the index of my first element for which aBlock evaluates as
true."
| index |
index := 0.
[(index := index + 1) <= self size] whileTrue:
[(aBlock value: (self at: index)) ifTrue: [^index]].
^ 0
Hi
I need a collection that does the following:
col := #('a12' 'b12' 'a13' 'a14' 'c23' 'a16') asMyNewCollection.
col findFirst: [:each | each first = $a]
> a12
col findFirst: [:each | each first = $a]
> a13
Do you know a collection that would work?
So I have the impression that such behavoir could be defined with a
kind of methods wrapper.
Stef
May be this "memory" could be implemented in another object (and/or
Traits?) , allowing several threads to traverse the collection, and add
extensibility to the collection framework.
The general idea, inspired from dotnet+smalltalk
(I don't know if this fit well with smalltalk patterns, may be total
junk and not doable ? -btw it's just a proposition)
Collection>> asQueryable
"=> a Queryable Object that would implement first, next, based on a
predicate."
^Queryable on: self readStream.
Queryable class >> on: aStream
^self new on: aStream
Queryable>> where: aPredicateBlock
self predicate: aPredicateBlock
Queryable>> first
self stream reset .
^self next.
Queryable>>next
[self stream atEnd not
and: [ (self predicate value: (current := self stream next)))]
whileFalse.
^ self stream atEnd ifTrue: [nil]
ifFalse: [self current].
(...)
col := #('a12' 'b12' 'a13' 'a14' 'c23' 'a16') asQueryable where: [:each
| each first = $a].
col first. -> 'a12'
col next. -> 'a13'
Those dotnet linq patterns are cool, on a dynamic langage like smalltalk
with
tools like GTInspector + roassal and Moose, wouldn't it be ultra cool ?
:)
--
Regards,
Alain