SeqColl.st
author claus
Wed, 15 Feb 1995 11:25:20 +0100
changeset 252 cf6eef7703ad
parent 244 9faa2da0650a
child 260 cefb485445a7
permissions -rw-r--r--
(none)
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
     1
"
5
67342904af11 *** empty log message ***
claus
parents: 3
diff changeset
     2
 COPYRIGHT (c) 1989 by Claus Gittinger
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
     3
	      All Rights Reserved
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
     4
a27a279701f8 Initial revision
claus
parents:
diff changeset
     5
 This software is furnished under a license and may be used
a27a279701f8 Initial revision
claus
parents:
diff changeset
     6
 only in accordance with the terms of that license and with the
a27a279701f8 Initial revision
claus
parents:
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
a27a279701f8 Initial revision
claus
parents:
diff changeset
     8
 be provided or otherwise made available to, or used by, any
a27a279701f8 Initial revision
claus
parents:
diff changeset
     9
 other person.  No title to or ownership of the software is
a27a279701f8 Initial revision
claus
parents:
diff changeset
    10
 hereby transferred.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    11
"
a27a279701f8 Initial revision
claus
parents:
diff changeset
    12
a27a279701f8 Initial revision
claus
parents:
diff changeset
    13
Collection subclass:#SequenceableCollection
a27a279701f8 Initial revision
claus
parents:
diff changeset
    14
       instanceVariableNames:''
a27a279701f8 Initial revision
claus
parents:
diff changeset
    15
       classVariableNames:''
a27a279701f8 Initial revision
claus
parents:
diff changeset
    16
       poolDictionaries:''
a27a279701f8 Initial revision
claus
parents:
diff changeset
    17
       category:'Collections-Abstract'
a27a279701f8 Initial revision
claus
parents:
diff changeset
    18
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    19
a27a279701f8 Initial revision
claus
parents:
diff changeset
    20
SequenceableCollection comment:'
88
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    21
COPYRIGHT (c) 1989 by Claus Gittinger
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
    22
	      All Rights Reserved
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
    23
252
    24
$Header: /cvs/stx/stx/libbasic/Attic/SeqColl.st,v 1.20 1995-02-15 10:24:52 claus Exp $
88
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    25
'!
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    26
88
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    27
!SequenceableCollection class methodsFor:'documentation'!
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    28
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    29
copyright
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    30
"
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    31
 COPYRIGHT (c) 1989 by Claus Gittinger
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
    32
	      All Rights Reserved
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    33
88
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    34
 This software is furnished under a license and may be used
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    35
 only in accordance with the terms of that license and with the
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    36
 inclusion of the above copyright notice.   This software may not
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    37
 be provided or otherwise made available to, or used by, any
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    38
 other person.  No title to or ownership of the software is
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    39
 hereby transferred.
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    40
"
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    41
!
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    42
88
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    43
version
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    44
"
252
    45
$Header: /cvs/stx/stx/libbasic/Attic/SeqColl.st,v 1.20 1995-02-15 10:24:52 claus Exp $
88
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    46
"
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    47
!
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    48
88
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    49
documentation
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    50
"
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    51
    SequenceableCollections have ordered elements which can be accessed via
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    52
    a numeric index. 
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    53
    SequenceableCollection is an abstract class - there are no instances of 
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    54
    it in the system. See concrete subclasses (such as OrderedCollection).
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    55
"
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    56
! !
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    57
a27a279701f8 Initial revision
claus
parents:
diff changeset
    58
!SequenceableCollection class methodsFor:'instance creation'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    59
a27a279701f8 Initial revision
claus
parents:
diff changeset
    60
new:size withAll:element
a27a279701f8 Initial revision
claus
parents:
diff changeset
    61
    "return a new Collection of size, where all elements are
a27a279701f8 Initial revision
claus
parents:
diff changeset
    62
     initialized to element"
a27a279701f8 Initial revision
claus
parents:
diff changeset
    63
a27a279701f8 Initial revision
claus
parents:
diff changeset
    64
    |newCollection|
a27a279701f8 Initial revision
claus
parents:
diff changeset
    65
a27a279701f8 Initial revision
claus
parents:
diff changeset
    66
    newCollection := self new:size.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    67
    newCollection atAllPut:element.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    68
    ^ newCollection
a27a279701f8 Initial revision
claus
parents:
diff changeset
    69
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
    70
a27a279701f8 Initial revision
claus
parents:
diff changeset
    71
!SequenceableCollection methodsFor:'accessing'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    72
a27a279701f8 Initial revision
claus
parents:
diff changeset
    73
first
a27a279701f8 Initial revision
claus
parents:
diff changeset
    74
    "return the first element"
a27a279701f8 Initial revision
claus
parents:
diff changeset
    75
a27a279701f8 Initial revision
claus
parents:
diff changeset
    76
    ^ self at:1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    77
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    78
a27a279701f8 Initial revision
claus
parents:
diff changeset
    79
last
a27a279701f8 Initial revision
claus
parents:
diff changeset
    80
    "return the last element"
a27a279701f8 Initial revision
claus
parents:
diff changeset
    81
a27a279701f8 Initial revision
claus
parents:
diff changeset
    82
    ^ self at:(self size)
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
    83
!
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
    84
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
    85
at:index ifAbsent:exceptionBlock
61
claus
parents: 44
diff changeset
    86
    "return the element at index if valid. 
claus
parents: 44
diff changeset
    87
     If the index is invalid, return the result of evaluating 
claus
parents: 44
diff changeset
    88
     the exceptionblock."
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
    89
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
    90
    ((index < 1) or:[index > self size]) ifTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
    91
	^ exceptionBlock value
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
    92
    ].
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
    93
    ^ self at:index
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
    94
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
    95
    "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
    96
     #(1 2 3) at:4 ifAbsent:['no such index']
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
    97
     (Dictionary with:(#foo -> #bar)
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
    98
		 with:(#frob -> #baz)) 
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
    99
	 at:#foobar ifAbsent:['no such index']
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   100
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   101
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   102
13
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
   103
!SequenceableCollection methodsFor:'queries'!
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
   104
202
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   105
isSequenceable
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   106
    "return true, if the receiver is some kind of sequenceableCollection"
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   107
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   108
    ^ true
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   109
!
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   110
69
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
   111
isSequenceableCollection
202
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   112
    "OBSOLETE: use isSequenceable for ST-80 compatibility.
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   113
     This method is a historic leftover and will be removed."
69
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
   114
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
   115
    ^ true
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
   116
!
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
   117
13
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
   118
firstIndex
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
   119
    "return the first elements index"
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
   120
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
   121
    ^ 1
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
   122
!
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
   123
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
   124
lastIndex
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
   125
    "return the last elements index"
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
   126
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
   127
    ^ self size
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
   128
!
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
   129
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
   130
size
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
   131
    "return the number of elements in the collection.
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
   132
     concrete implementations must define this"
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
   133
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
   134
    ^ self subclassResponsibility
77
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
   135
!
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
   136
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
   137
keys
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
   138
    "return a collection with all keys in the Smalltalk dictionary"
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
   139
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
   140
    |sz|
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
   141
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
   142
    sz := self size.
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
   143
    sz == 0 ifTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   144
	^ #()
77
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
   145
    ].
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
   146
    ^ 1 to:sz
13
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
   147
! !
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
   148
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   149
!SequenceableCollection methodsFor:'comparing'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   150
a27a279701f8 Initial revision
claus
parents:
diff changeset
   151
= aCollection
a27a279701f8 Initial revision
claus
parents:
diff changeset
   152
    "return true if the receiver and aCollection represent collections
a27a279701f8 Initial revision
claus
parents:
diff changeset
   153
     with equal contents."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   154
a27a279701f8 Initial revision
claus
parents:
diff changeset
   155
    |index "{ Class: SmallInteger }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   156
     stop  "{ Class: SmallInteger }" |
a27a279701f8 Initial revision
claus
parents:
diff changeset
   157
a27a279701f8 Initial revision
claus
parents:
diff changeset
   158
    (aCollection == self) ifTrue:[^true].
69
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
   159
    (aCollection isSequenceableCollection) ifFalse:[^false].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   160
a27a279701f8 Initial revision
claus
parents:
diff changeset
   161
    stop := self size.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   162
    stop == (aCollection size) ifFalse:[^false].
61
claus
parents: 44
diff changeset
   163
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   164
    index := 1.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   165
    [index <= stop] whileTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   166
	(self at:index) = (aCollection at:index) ifFalse:[^false].
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   167
	index := index + 1
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   168
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   169
    ^ true
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   170
69
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
   171
    "
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
   172
     #(1 2 3 4 5) = #(1 2 3 4 5)                        
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
   173
     #($1 $2 $3 $4 $5) = #(1 2 3 4 5)                   
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
   174
     #($1 $2 $3 $4 $5) = '12345'                       
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
   175
     #($1 $2 $3 $4 $5) = '54321' asSortedCollection   
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
   176
    "
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
   177
!
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
   178
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
   179
hash
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
   180
    "return a hash key for the receiver"
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
   181
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
   182
    "this hash is stupid - but for larger collections, the hashing
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
   183
     time can become much bigger than the time lost in added probing.
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
   184
     Time will show ..."
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
   185
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
   186
    ^ (self at:1 ifAbsent:[0]) hash * self size
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
   187
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
   188
    "
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
   189
     #(1 2 3 4 5) hash
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
   190
     #(1 2 3 4 5.0) asOrderedCollection hash
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
   191
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   192
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   193
a27a279701f8 Initial revision
claus
parents:
diff changeset
   194
startsWith:aCollection
a27a279701f8 Initial revision
claus
parents:
diff changeset
   195
    "return true, if the receivers first elements match those
a27a279701f8 Initial revision
claus
parents:
diff changeset
   196
     of aCollection"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   197
a27a279701f8 Initial revision
claus
parents:
diff changeset
   198
    |index "{ Class: SmallInteger }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   199
     stop  "{ Class: SmallInteger }" |
a27a279701f8 Initial revision
claus
parents:
diff changeset
   200
a27a279701f8 Initial revision
claus
parents:
diff changeset
   201
    (aCollection == self) ifTrue:[^true].
69
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
   202
    (aCollection isSequenceableCollection) ifFalse:[^false].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   203
a27a279701f8 Initial revision
claus
parents:
diff changeset
   204
    stop := aCollection size.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   205
    stop > self size ifTrue:[^false].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   206
a27a279701f8 Initial revision
claus
parents:
diff changeset
   207
    index := 1.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   208
    [index <= stop] whileTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   209
	(self at:index) = (aCollection at:index) ifFalse:[^false].
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   210
	index := index + 1
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   211
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   212
    ^ true
a27a279701f8 Initial revision
claus
parents:
diff changeset
   213
69
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
   214
    "
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
   215
     'abcde' startsWith:#($a $b $c)
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
   216
     #[1 2 3 4] startsWith:#(1 2 3)
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
   217
     #(1 2 3 4) asOrderedCollection startsWith:#(1 2 3)
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
   218
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   219
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   220
a27a279701f8 Initial revision
claus
parents:
diff changeset
   221
endsWith:aCollection
a27a279701f8 Initial revision
claus
parents:
diff changeset
   222
    "return true, if the receivers last elements match those
a27a279701f8 Initial revision
claus
parents:
diff changeset
   223
     of aCollection"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   224
a27a279701f8 Initial revision
claus
parents:
diff changeset
   225
    |index1 "{ Class: SmallInteger }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   226
     index2 "{ Class: SmallInteger }" 
61
claus
parents: 44
diff changeset
   227
     stop   "{ Class: SmallInteger }" 
claus
parents: 44
diff changeset
   228
     sz     "{ Class: SmallInteger }"|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   229
61
claus
parents: 44
diff changeset
   230
    (aCollection == self) ifTrue:[^ true].
69
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
   231
    (aCollection isSequenceableCollection) ifFalse:[^ false].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   232
a27a279701f8 Initial revision
claus
parents:
diff changeset
   233
    stop := aCollection size.
61
claus
parents: 44
diff changeset
   234
    sz := self size.
claus
parents: 44
diff changeset
   235
    stop > sz ifTrue:[^false].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   236
61
claus
parents: 44
diff changeset
   237
    index1 := sz.
13
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
   238
    index2 := stop.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   239
    [index2 > 0] whileTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   240
	(self at:index1) = (aCollection at:index2) ifFalse:[^ false].
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   241
	index1 := index1 - 1.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   242
	index2 := index2 - 1
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   243
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   244
    ^ true
a27a279701f8 Initial revision
claus
parents:
diff changeset
   245
69
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
   246
    "
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
   247
     'abcde' endsWith:#($d $e)
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
   248
     #[1 2 3 4] endsWith:#(3 4)    
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
   249
     #(1 2 3 4) asOrderedCollection endsWith:#(3 4)
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
   250
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   251
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   252
a27a279701f8 Initial revision
claus
parents:
diff changeset
   253
!SequenceableCollection methodsFor:'copying'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   254
a27a279701f8 Initial revision
claus
parents:
diff changeset
   255
, aCollection
a27a279701f8 Initial revision
claus
parents:
diff changeset
   256
    "return a new collection formed from concatenating the receiver with
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   257
     the argument. The class of the new collection is determined by the
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   258
     receivers class, so mixing classes is possible, if the second collections
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   259
     elements can be stored into instances of the receivers class."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   260
a27a279701f8 Initial revision
claus
parents:
diff changeset
   261
    |newCollection 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   262
     mySize    "{ Class: SmallInteger }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   263
     newSize   "{ Class: SmallInteger }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   264
     otherSize "{ Class: SmallInteger }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   265
     dstIndex  "{ Class: SmallInteger }"|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   266
a27a279701f8 Initial revision
claus
parents:
diff changeset
   267
    mySize := self size.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   268
    otherSize := aCollection size.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   269
    newSize := mySize + otherSize.
202
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   270
252
   271
    newCollection := self copyEmptyAndGrow:newSize.   "must grow, otherwise replace fails"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   272
a27a279701f8 Initial revision
claus
parents:
diff changeset
   273
    newCollection replaceFrom:1 to:mySize with:self startingAt:1.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   274
    dstIndex := mySize + 1.
202
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   275
    aCollection isSequenceable ifTrue:[
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   276
	"
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   277
	 yes, aCollection has indexed elements
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   278
	"
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   279
	newCollection replaceFrom:dstIndex to:newSize
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   280
			     with:aCollection startingAt:1.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   281
	^ newCollection
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   282
    ] ifFalse:[
202
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   283
	"
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   284
	 no, enumerate aCollection
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   285
	"
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   286
	aCollection do:[:element |
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   287
	    newCollection at:dstIndex put:element.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   288
	    dstIndex := dstIndex + 1
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   289
	]
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   290
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   291
    ^ newCollection
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   292
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   293
    "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   294
     #($a $b $c) , #(1 2 3)
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   295
     #($a $b $c) , '123'
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   296
     'abc' , '123'
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   297
     'abc' , #($q $w $e $r $t $y) asSortedCollection
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   298
     'abc' , #(1 2 3 4 5)"  "-- will fail, since strings cannot store integers
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   299
     'abc' asArray , #(1 2 3 4 5)
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   300
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   301
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   302
a27a279701f8 Initial revision
claus
parents:
diff changeset
   303
copyWith:newElement
233
98f588af201a comments
claus
parents: 202
diff changeset
   304
    "return a new collection containing the receivers elements
98f588af201a comments
claus
parents: 202
diff changeset
   305
     and the single new element, newElement. 
98f588af201a comments
claus
parents: 202
diff changeset
   306
     This is different from concatentation, which expects another collection
98f588af201a comments
claus
parents: 202
diff changeset
   307
     as argument, but equivalent to copy-and-addLast."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   308
a27a279701f8 Initial revision
claus
parents:
diff changeset
   309
    |newCollection mySize newSize|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   310
a27a279701f8 Initial revision
claus
parents:
diff changeset
   311
    mySize := self size.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   312
    newSize := mySize + 1.
252
   313
    newCollection := self copyEmptyAndGrow:newSize.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   314
    newCollection replaceFrom:1 to:mySize with:self startingAt:1.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   315
    newCollection at:newSize put:newElement.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   316
    ^newCollection
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   317
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   318
    "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   319
     #(1 2 3 4 5) copyWith:$a
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   320
     'abcdefg' copyWith:$h
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   321
     'abcdefg' copyWith:'123'   -- will fail: string cannot be stored into string
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   322
     'abcdefg' copyWith:1       -- will fail: integer cannot be stored into string
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   323
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   324
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   325
61
claus
parents: 44
diff changeset
   326
copyWithoutFirst:elementToSkip
claus
parents: 44
diff changeset
   327
    "return a new collection consisting of a copy of the receivers elements
claus
parents: 44
diff changeset
   328
     without the first elementToSkip, if it was present. 
claus
parents: 44
diff changeset
   329
     No error is reported, if elementToSkip is not in the collection."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   330
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   331
    |copy skipIndex sz|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   332
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   333
    skipIndex := self indexOf:elementToSkip startingAt:1.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   334
    (skipIndex == 0) ifTrue:[^ self copy].
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   335
202
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   336
    sz := self size - 1.
252
   337
    copy := self copyEmptyAndGrow:sz.
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   338
    copy replaceFrom:1 to:(skipIndex - 1) with:self startingAt:1.
202
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   339
    copy replaceFrom:skipIndex to:sz with:self startingAt:(skipIndex + 1).
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   340
    ^ copy
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   341
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   342
    "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   343
     #($a $b $c $d $e $f $g) copyWithoutFirst:$d
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   344
     #($a $b $c $d $e $f $g) copyWithoutFirst:$x
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   345
     #(90 80 70 60 50) copyWithoutFirst:70
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   346
     #(90 80 70 80 60 45 80 50) copyWithoutFirst:80
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   347
    "
61
claus
parents: 44
diff changeset
   348
!
claus
parents: 44
diff changeset
   349
claus
parents: 44
diff changeset
   350
copyWithout:elementToSkip
claus
parents: 44
diff changeset
   351
    "return a new collection consisting of a copy of the receiver, with
claus
parents: 44
diff changeset
   352
     ALL elements equal to elementToSkip are left out.
claus
parents: 44
diff changeset
   353
     No error is reported, if elementToSkip is not in the collection."
claus
parents: 44
diff changeset
   354
claus
parents: 44
diff changeset
   355
    |n copy srcIndex dstIndex skipIndex sz l|
claus
parents: 44
diff changeset
   356
claus
parents: 44
diff changeset
   357
    "the code below may look like overkill, 
claus
parents: 44
diff changeset
   358
     however, for big collections its better to move data
claus
parents: 44
diff changeset
   359
     around in big chunks"
claus
parents: 44
diff changeset
   360
claus
parents: 44
diff changeset
   361
    n := self occurrencesOf:elementToSkip.
claus
parents: 44
diff changeset
   362
    n == 0 ifTrue:[^ self copy].
claus
parents: 44
diff changeset
   363
claus
parents: 44
diff changeset
   364
    sz := self size.
252
   365
    copy := self copyEmptyAndGrow:(sz - n).
61
claus
parents: 44
diff changeset
   366
claus
parents: 44
diff changeset
   367
    srcIndex := 1.
claus
parents: 44
diff changeset
   368
    dstIndex := 1.
claus
parents: 44
diff changeset
   369
claus
parents: 44
diff changeset
   370
    n timesRepeat:[
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   371
	skipIndex := self indexOf:elementToSkip startingAt:srcIndex.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   372
	l := skipIndex - srcIndex.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   373
	l ~~ 0 ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   374
	    copy replaceFrom:dstIndex to:(dstIndex + l - 1) 
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   375
			with:self startingAt:srcIndex.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   376
	    dstIndex := dstIndex + l
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   377
	].
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   378
	srcIndex := skipIndex + 1
61
claus
parents: 44
diff changeset
   379
    ].
claus
parents: 44
diff changeset
   380
    l := sz - srcIndex.
claus
parents: 44
diff changeset
   381
    copy replaceFrom:dstIndex to:(dstIndex + l)
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   382
		with:self startingAt:srcIndex.
61
claus
parents: 44
diff changeset
   383
    ^ copy
claus
parents: 44
diff changeset
   384
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   385
    "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   386
     #($a $b $c $d $e $f $g) copyWithout:$d
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   387
     #($a $b $c $d $e $f $g) copyWithout:$a
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   388
     #($a $b $c $d $e $f $g) copyWithout:$g
202
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   389
     'abcdefghi' copyWithout:$h    
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   390
     'abcdefg' copyWithout:$h       
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   391
     #($a $b $c $a $a $d $e $a $f $g) copyWithout:$a
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   392
     #($a $b $c $d $e $f $g) copyWithout:$x
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   393
     #(90 80 70 60 50) copyWithout:70
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   394
     #(90 80 70 80 60 45 80 50) copyWithout:80
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   395
    "
61
claus
parents: 44
diff changeset
   396
!
claus
parents: 44
diff changeset
   397
claus
parents: 44
diff changeset
   398
copyWithoutIndex:omitIndex
claus
parents: 44
diff changeset
   399
    "return a new collection consisting of receivers elements
claus
parents: 44
diff changeset
   400
     without the argument stored at omitIndex"
claus
parents: 44
diff changeset
   401
claus
parents: 44
diff changeset
   402
    |copy sz|
claus
parents: 44
diff changeset
   403
202
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   404
    sz := self size - 1.
252
   405
    copy := self copyEmptyAndGrow:sz.
61
claus
parents: 44
diff changeset
   406
    copy replaceFrom:1 
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   407
		  to:(omitIndex - 1) 
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   408
		with:self 
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   409
	  startingAt:1.
61
claus
parents: 44
diff changeset
   410
    copy replaceFrom:omitIndex 
202
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   411
		  to:sz 
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   412
		with:self 
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   413
	  startingAt:(omitIndex + 1).
61
claus
parents: 44
diff changeset
   414
    ^ copy
claus
parents: 44
diff changeset
   415
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   416
    "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   417
     #(1 2 3 4 5 6 7 8 9 0) copyWithoutIndex:3
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   418
     'abcdefghijkl' copyWithoutIndex:5
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   419
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   420
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   421
a27a279701f8 Initial revision
claus
parents:
diff changeset
   422
copyFrom:start to:stop
a27a279701f8 Initial revision
claus
parents:
diff changeset
   423
    "return a new collection consisting of receivers elements
a27a279701f8 Initial revision
claus
parents:
diff changeset
   424
     between start and stop"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   425
a27a279701f8 Initial revision
claus
parents:
diff changeset
   426
    |newCollection newSize|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   427
a27a279701f8 Initial revision
claus
parents:
diff changeset
   428
    newSize := stop - start + 1.
252
   429
    newCollection := self copyEmptyAndGrow:newSize.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   430
    newCollection replaceFrom:1 to:newSize with:self startingAt:start.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   431
    ^ newCollection
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   432
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   433
    "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   434
     #($a $b $c $d $e $f $g) copyFrom:2 to:5
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   435
     '1234567890' copyFrom:2 to:5
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   436
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   437
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   438
a27a279701f8 Initial revision
claus
parents:
diff changeset
   439
copyFrom:start
a27a279701f8 Initial revision
claus
parents:
diff changeset
   440
    "return a new collection consisting of receivers elements
a27a279701f8 Initial revision
claus
parents:
diff changeset
   441
     from start to the end of the collection"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   442
a27a279701f8 Initial revision
claus
parents:
diff changeset
   443
    ^ self copyFrom:start to:(self size)
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   444
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   445
    "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   446
     #($a $b $c $d $e $f $g) copyFrom:2
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   447
     '1234567890' copyFrom:2
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   448
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   449
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   450
a27a279701f8 Initial revision
claus
parents:
diff changeset
   451
copyTo:stop
a27a279701f8 Initial revision
claus
parents:
diff changeset
   452
    "return a new collection consisting of receivers elements
61
claus
parents: 44
diff changeset
   453
     from 1 up to (including) index stop"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   454
a27a279701f8 Initial revision
claus
parents:
diff changeset
   455
    ^ self copyFrom:1 to:stop
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   456
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   457
    "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   458
     #($a $b $c $d $e $f $g) copyTo:5
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   459
     '1234567890' copyTo:4
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   460
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   461
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   462
61
claus
parents: 44
diff changeset
   463
copyFirst:count
claus
parents: 44
diff changeset
   464
    "return a new collection consisting of the receivers first count
claus
parents: 44
diff changeset
   465
     elements - this is just a rename of copyTo: - for compatibility."
claus
parents: 44
diff changeset
   466
claus
parents: 44
diff changeset
   467
    ^ self copyFrom:1 to:count
claus
parents: 44
diff changeset
   468
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   469
    "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   470
     #($a $b $c $d $e $f $g) copyFirst:5
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   471
     '1234567890' copyFirst:4
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   472
    "
61
claus
parents: 44
diff changeset
   473
!
claus
parents: 44
diff changeset
   474
claus
parents: 44
diff changeset
   475
copyLast:count
claus
parents: 44
diff changeset
   476
    "return a new collection consisting of the receivers last count
claus
parents: 44
diff changeset
   477
     elements."
claus
parents: 44
diff changeset
   478
claus
parents: 44
diff changeset
   479
    |sz|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   480
61
claus
parents: 44
diff changeset
   481
    sz := self size.
claus
parents: 44
diff changeset
   482
    ^ self copyFrom:(sz - count + 1) to:sz
claus
parents: 44
diff changeset
   483
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   484
    "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   485
     #($a $b $c $d $e $f $g) copyLast:5
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   486
     '1234567890' copyLast:4
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   487
    "
61
claus
parents: 44
diff changeset
   488
!
claus
parents: 44
diff changeset
   489
202
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   490
copyWithoutLast:count
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   491
    "return a new collection consisting of the receivers elements
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   492
     except the last count elements."
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   493
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   494
    |sz|
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   495
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   496
    sz := self size.
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   497
    ^ self copyTo:(sz - count)
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   498
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   499
    "
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   500
     #($a $b $c $d $e $f $g) copyWithoutLast:5 
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   501
     '1234567890' copyWithoutLast:4 
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   502
    "
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   503
!
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   504
61
claus
parents: 44
diff changeset
   505
copyUpTo:element
claus
parents: 44
diff changeset
   506
    "return a new collection consisting of the receiver elements
claus
parents: 44
diff changeset
   507
     up-to (but excluding) the first occurence of element."
claus
parents: 44
diff changeset
   508
claus
parents: 44
diff changeset
   509
    |idx|
claus
parents: 44
diff changeset
   510
claus
parents: 44
diff changeset
   511
    idx := self indexOf:element.
claus
parents: 44
diff changeset
   512
    idx == 0 ifTrue:[^ nil].    "question: is this ok?"
202
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   513
    idx == 1 ifTrue:[^ self copyEmpty].
61
claus
parents: 44
diff changeset
   514
    ^ self copyFrom:1 to:(idx-1)
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   515
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   516
    "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   517
     #($a $b $c $d $e $f $g) copyUpTo:$d
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   518
     '1234567890' copyUpTo:$5
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   519
     '1234567890' copyUpTo:$a
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   520
     '1234567890' copyUpTo:$1
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   521
    "
61
claus
parents: 44
diff changeset
   522
!
claus
parents: 44
diff changeset
   523
claus
parents: 44
diff changeset
   524
copyThrough:element
claus
parents: 44
diff changeset
   525
    "return a new collection consisting of the receiver elements
claus
parents: 44
diff changeset
   526
     up-to (AND including) the first occurence of element."
claus
parents: 44
diff changeset
   527
claus
parents: 44
diff changeset
   528
    |idx|
claus
parents: 44
diff changeset
   529
claus
parents: 44
diff changeset
   530
    idx := self indexOf:element.
claus
parents: 44
diff changeset
   531
    idx == 0 ifTrue:[^ nil].    "question: is this ok?"
claus
parents: 44
diff changeset
   532
    ^ self copyFrom:1 to:idx
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   533
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   534
    "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   535
     #($a $b $c $d $e $f $g) copyThrough:$d
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   536
     '1234567890' copyThrough:$5
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   537
     '1234567890' copyThrough:$a
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   538
     '1234567890' copyThrough:$1
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   539
    "
61
claus
parents: 44
diff changeset
   540
!
claus
parents: 44
diff changeset
   541
claus
parents: 44
diff changeset
   542
copyReplaceFrom:startIndex to:endIndex with:aCollection
claus
parents: 44
diff changeset
   543
    "return a copy of the receiver, where the elements from startIndex to
claus
parents: 44
diff changeset
   544
     endIndex have been replaced by the elements of aCollection"
claus
parents: 44
diff changeset
   545
202
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   546
    |newColl sz replSize|
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   547
61
claus
parents: 44
diff changeset
   548
    replSize := aCollection size.
202
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   549
    sz := self size - (endIndex - startIndex + 1) + replSize.
252
   550
    newColl := self copyEmptyAndGrow:sz.
61
claus
parents: 44
diff changeset
   551
    newColl replaceFrom:1 to:(startIndex - 1) with:self.
claus
parents: 44
diff changeset
   552
    newColl replaceFrom:startIndex with:aCollection.
claus
parents: 44
diff changeset
   553
    newColl replaceFrom:(startIndex + replSize) with:self startingAt:(endIndex + 1).
claus
parents: 44
diff changeset
   554
    ^ newColl
claus
parents: 44
diff changeset
   555
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   556
    "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   557
     #(1 2 3 4 5 6 7 8 9 0) copyReplaceFrom:3 to:6 with:#(a b c d e f g h i j k)
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   558
     'hello world' copyReplaceFrom:6 to:6 with:' there, '  
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   559
    "
186
a4c3032fc825 *** empty log message ***
claus
parents: 159
diff changeset
   560
!
a4c3032fc825 *** empty log message ***
claus
parents: 159
diff changeset
   561
a4c3032fc825 *** empty log message ***
claus
parents: 159
diff changeset
   562
copyReplaceFrom:startIndex with:aCollection
a4c3032fc825 *** empty log message ***
claus
parents: 159
diff changeset
   563
    "return a copy of the receiver, where the elements from startIndex to
a4c3032fc825 *** empty log message ***
claus
parents: 159
diff changeset
   564
     the end have been replaced by the elements of aCollection"
a4c3032fc825 *** empty log message ***
claus
parents: 159
diff changeset
   565
a4c3032fc825 *** empty log message ***
claus
parents: 159
diff changeset
   566
    ^ self copyReplaceFrom:startIndex to:(self size) with:aCollection
a4c3032fc825 *** empty log message ***
claus
parents: 159
diff changeset
   567
a4c3032fc825 *** empty log message ***
claus
parents: 159
diff changeset
   568
    "
a4c3032fc825 *** empty log message ***
claus
parents: 159
diff changeset
   569
     #(1 2 3 4 5 6 7 8 9 0) copyReplaceFrom:3 with:#(a b c)  
a4c3032fc825 *** empty log message ***
claus
parents: 159
diff changeset
   570
     'hello world' copyReplaceFrom:7 with:'smalltalk fan'  
a4c3032fc825 *** empty log message ***
claus
parents: 159
diff changeset
   571
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   572
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   573
a27a279701f8 Initial revision
claus
parents:
diff changeset
   574
!SequenceableCollection methodsFor:'filling and replacing'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   575
a27a279701f8 Initial revision
claus
parents:
diff changeset
   576
from:index1 to:index2 put:anObject
a27a279701f8 Initial revision
claus
parents:
diff changeset
   577
    "replace the elements from index1 to index2 of the collection
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   578
     by the argument, anObject.
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   579
     Notice: This operation modifies the receiver, NOT a copy;
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   580
     therefore the change may affect all others referencing the receiver."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   581
a27a279701f8 Initial revision
claus
parents:
diff changeset
   582
    |index "{ Class: SmallInteger }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   583
     end   "{ Class: SmallInteger }"|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   584
a27a279701f8 Initial revision
claus
parents:
diff changeset
   585
    index := index1.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   586
    end := index2.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   587
    [index <= end] whileTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   588
	self at:index put:anObject.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   589
	index := index + 1
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   590
    ]
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   591
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   592
    "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   593
     #(1 2 3 4 5 6 7 8 9 0) from:3 to:6 put:$X
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   594
     'abcdefghijkl' from:3 to:6 put:$X
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   595
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   596
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   597
a27a279701f8 Initial revision
claus
parents:
diff changeset
   598
atAllPut:anObject
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   599
    "replace all elements of the collection by the argument, anObject.
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   600
     Notice: This operation modifies the receiver, NOT a copy;
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   601
     therefore the change may affect all others referencing the receiver."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   602
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
   603
    self from:1 to:(self size) put:anObject
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   604
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   605
    "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   606
     (Array new:10) atAllPut:1
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   607
     (String new:10) atAllPut:$a
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   608
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   609
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   610
a27a279701f8 Initial revision
claus
parents:
diff changeset
   611
atAll:indexCollection put:anObject
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   612
    "put anObject into all indexes from indexCollection in the receiver.
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   613
     Notice: This operation modifies the receiver, NOT a copy;
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   614
     therefore the change may affect all others referencing the receiver."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   615
a27a279701f8 Initial revision
claus
parents:
diff changeset
   616
    indexCollection do:[:index | self at:index put:anObject]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   617
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   618
    "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   619
     (Array new:10) atAll:(1 to:5) put:0
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   620
     (Array new:10) atAll:#(1 5 6 9) put:0
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   621
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   622
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   623
a27a279701f8 Initial revision
claus
parents:
diff changeset
   624
replaceAll:oldObject by:newObject
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   625
    "replace all oldObjects by newObject in the receiver.
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   626
     Notice: This operation modifies the receiver, NOT a copy;
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   627
     therefore the change may affect all others referencing the receiver."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   628
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
   629
    1 to:self size do:[:index |
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   630
	(self at:index) = oldObject ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   631
	    self at:index put:newObject
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   632
	]
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   633
    ]
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   634
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   635
    "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   636
     '123123abc123' replaceAll:$1 by:$*
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   637
     #($a $b $a $c $a $d $a $e) replaceAll:$a by:$A
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   638
    "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   639
!
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   640
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   641
replaceAny:aCollection by:newObject
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   642
    "replace all elements, which are in aCollection by newObject in the receiver.
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   643
     Notice: This operation modifies the receiver, NOT a copy;
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   644
     therefore the change may affect all others referencing the receiver."
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   645
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   646
    1 to:self size do:[:index |
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   647
	(aCollection includes:(self at:index)) ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   648
	    self at:index put:newObject
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   649
	]
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   650
    ]
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   651
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   652
    "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   653
     '123123abc123' replaceAny:#($1 $2) by:$*      
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   654
     #('foo' 'bar' 'foo' 'baz' foo 1 2 3) replaceAny:#(foo 1) by:'*'  
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   655
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   656
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   657
a27a279701f8 Initial revision
claus
parents:
diff changeset
   658
replaceFrom:start with:replacementCollection
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   659
    "replace elements in the receiver starting at start,
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   660
     with elements taken from replacementCollection starting at 1
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   661
     to the end of replacementCollection.
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   662
     Notice: This operation modifies the receiver, NOT a copy;
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   663
     therefore the change may affect all others referencing the receiver."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   664
a27a279701f8 Initial revision
claus
parents:
diff changeset
   665
    ^ self replaceFrom:start 
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   666
		    to:(start + replacementCollection size - 1)
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   667
		  with:replacementCollection
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   668
	    startingAt:1
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   669
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   670
    "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   671
     '1234567890' replaceFrom:5 with:'abc'
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   672
     #($a $b $c $d $e) replaceFrom:2 with:'123'
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   673
    "
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   674
!
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   675
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   676
replaceFrom:start with:replacementCollection startingAt:offset
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   677
    "replace elements in the receiver starting at start,
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   678
     with elements taken from replacementCollection starting at offset
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   679
     to the end of replacementCollection.
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   680
     Notice: This operation modifies the receiver, NOT a copy;
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   681
     therefore the change may affect all others referencing the receiver."
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   682
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   683
    ^ self replaceFrom:start 
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   684
		    to:(start + replacementCollection size - offset)
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   685
		  with:replacementCollection
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   686
	    startingAt:offset
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   687
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   688
    "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   689
     '1234567890' replaceFrom:5 with:'abcdef' startingAt:3
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   690
     #($a $b $c $d $e) replaceFrom:2 with:'12345' startingAt:4
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   691
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   692
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   693
a27a279701f8 Initial revision
claus
parents:
diff changeset
   694
replaceFrom:start to:stop with:replacementCollection
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   695
    "replace elements in the receiver between index start and stop,
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   696
     with elements taken from replacementCollection starting at 1.
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   697
     Notice: This operation modifies the receiver, NOT a copy;
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   698
     therefore the change may affect all others referencing the receiver."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   699
a27a279701f8 Initial revision
claus
parents:
diff changeset
   700
    ^ self replaceFrom:start
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   701
		    to:stop
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   702
		  with:replacementCollection
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   703
	    startingAt:1
61
claus
parents: 44
diff changeset
   704
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   705
    "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   706
     '1234567890' replaceFrom:5 to:7 with:'abcdef'
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   707
     #($a $b $c $d $e) replaceFrom:2 to:3 with:'12345'
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   708
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   709
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   710
a27a279701f8 Initial revision
claus
parents:
diff changeset
   711
replaceFrom:start to:stop with:replacementCollection startingAt:repStart
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   712
    "replace elements in the receiver between index start and stop,
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   713
     with elements  taken from replacementCollection starting at repStart.
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   714
     Notice: This operation modifies the receiver, NOT a copy;
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   715
     therefore the change may affect all others referencing the receiver."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   716
a27a279701f8 Initial revision
claus
parents:
diff changeset
   717
    |srcIndex "{ Class: SmallInteger }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   718
     dstIndex "{ Class: SmallInteger }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   719
     end      "{ Class: SmallInteger }" |
a27a279701f8 Initial revision
claus
parents:
diff changeset
   720
a27a279701f8 Initial revision
claus
parents:
diff changeset
   721
    (replacementCollection == self) ifTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   722
	(repStart < start) ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   723
	    " must do reverse copy "
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   724
	    srcIndex := repStart + (stop - start).
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   725
	    dstIndex := stop.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   726
	    end := start.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   727
	    [dstIndex >= end] whileTrue:[
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   728
		self at:dstIndex put:(replacementCollection at:srcIndex).
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   729
		srcIndex := srcIndex - 1.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   730
		dstIndex := dstIndex - 1
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   731
	    ].
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   732
	    ^ self
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   733
	]
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   734
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   735
a27a279701f8 Initial revision
claus
parents:
diff changeset
   736
    srcIndex := repStart.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   737
    dstIndex := start.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   738
    end := stop.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   739
    [dstIndex <= end] whileTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   740
	self at:dstIndex put:(replacementCollection at:srcIndex).
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   741
	srcIndex := srcIndex + 1.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   742
	dstIndex := dstIndex + 1
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   743
    ]
61
claus
parents: 44
diff changeset
   744
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   745
    "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   746
     '1234567890' replaceFrom:5 to:7 with:'abcdef' startingAt:3
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   747
     #($a $b $c $d $e) replaceFrom:2 to:3 with:'12345' startingAt:4
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   748
    "
61
claus
parents: 44
diff changeset
   749
!
claus
parents: 44
diff changeset
   750
claus
parents: 44
diff changeset
   751
startingAt:sourceStart replaceElementsIn:destColl from:destStartIndex to:destEndIndex
claus
parents: 44
diff changeset
   752
    "replace elements in destColl with elements from the receiver.
claus
parents: 44
diff changeset
   753
     Notice: This operation modifies the destination collection, NOT a copy;
claus
parents: 44
diff changeset
   754
     therefore the change may affect all others referencing this object."
claus
parents: 44
diff changeset
   755
claus
parents: 44
diff changeset
   756
    destColl replaceFrom:destStartIndex to:destEndIndex with:self startingAt:sourceStart
claus
parents: 44
diff changeset
   757
claus
parents: 44
diff changeset
   758
    "
claus
parents: 44
diff changeset
   759
     |s|
claus
parents: 44
diff changeset
   760
     s := 'abcdefghijklmnop'.
claus
parents: 44
diff changeset
   761
     '1234567890' startingAt:1 replaceElementsIn:s from:1 to:3.
claus
parents: 44
diff changeset
   762
     s'123defghijklmnop'
claus
parents: 44
diff changeset
   763
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   764
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   765
a27a279701f8 Initial revision
claus
parents:
diff changeset
   766
!SequenceableCollection methodsFor:'adding & removing'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   767
61
claus
parents: 44
diff changeset
   768
addFirst:anObject
claus
parents: 44
diff changeset
   769
    "prepend the argument, anObject to the collection.
claus
parents: 44
diff changeset
   770
     Return the argument, anObject.
claus
parents: 44
diff changeset
   771
claus
parents: 44
diff changeset
   772
     Notice, that this is modifies the receiver NOT a copy.
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   773
     Also note, that it may be a slow operation for some collections,
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   774
     due to the grow:-message, which is inefficient for fixed size 
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   775
     collections (i.e. for Strings and Arrays it is not recommened)."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   776
a27a279701f8 Initial revision
claus
parents:
diff changeset
   777
    |newSize|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   778
a27a279701f8 Initial revision
claus
parents:
diff changeset
   779
    newSize := self size + 1.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   780
    self grow:newSize.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   781
    self replaceFrom:2 to:newSize with:self startingAt:1.
61
claus
parents: 44
diff changeset
   782
    self at:1 put:anObject.
claus
parents: 44
diff changeset
   783
    ^ anObject
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   784
61
claus
parents: 44
diff changeset
   785
    "
claus
parents: 44
diff changeset
   786
     |a| 
claus
parents: 44
diff changeset
   787
     a:= #(1 2 3 4 5 6 7 8). 
claus
parents: 44
diff changeset
   788
     a addFirst:'hello'. 
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   789
     a 
61
claus
parents: 44
diff changeset
   790
    "
claus
parents: 44
diff changeset
   791
    "
claus
parents: 44
diff changeset
   792
     |c|
claus
parents: 44
diff changeset
   793
     c := #(1 2 3 4 5 6 7 8) asOrderedCollection.
claus
parents: 44
diff changeset
   794
     c addFirst:'hello'.
claus
parents: 44
diff changeset
   795
     c
claus
parents: 44
diff changeset
   796
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   797
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   798
61
claus
parents: 44
diff changeset
   799
add:anObject
claus
parents: 44
diff changeset
   800
    "append the argument, anObject to the collection.
claus
parents: 44
diff changeset
   801
     Return the argument, anObject.
claus
parents: 44
diff changeset
   802
claus
parents: 44
diff changeset
   803
     Notice, that this is modifies the receiver NOT a copy.
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   804
     Also note, that it may be a slow operation for some collections,
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   805
     due to the grow:-message, which is inefficient for fixed size 
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   806
     collections (i.e. for Strings and Arrays it is not recommened)."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   807
a27a279701f8 Initial revision
claus
parents:
diff changeset
   808
    |newSize|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   809
a27a279701f8 Initial revision
claus
parents:
diff changeset
   810
    newSize := self size + 1.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   811
    self grow:newSize.
61
claus
parents: 44
diff changeset
   812
    self at:newSize put:anObject.
claus
parents: 44
diff changeset
   813
    ^ anObject
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   814
61
claus
parents: 44
diff changeset
   815
    "
claus
parents: 44
diff changeset
   816
     |a|
claus
parents: 44
diff changeset
   817
     a := #(1 2 3 4 5 6 7 8).
claus
parents: 44
diff changeset
   818
     a add:'hello'.
claus
parents: 44
diff changeset
   819
     a
claus
parents: 44
diff changeset
   820
    "
claus
parents: 44
diff changeset
   821
    "
claus
parents: 44
diff changeset
   822
     |c|
claus
parents: 44
diff changeset
   823
     c := #(1 2 3 4 5 6 7 8) asOrderedCollection.
claus
parents: 44
diff changeset
   824
     c add:'hello'.
claus
parents: 44
diff changeset
   825
     c
claus
parents: 44
diff changeset
   826
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   827
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   828
a27a279701f8 Initial revision
claus
parents:
diff changeset
   829
add:anElement beforeIndex:index
61
claus
parents: 44
diff changeset
   830
    "insert the first argument, anObject into the collection before slot index.
claus
parents: 44
diff changeset
   831
     Return the receiver (sigh - ST-80 compatibility).
claus
parents: 44
diff changeset
   832
claus
parents: 44
diff changeset
   833
     Notice, that this is modifies the receiver NOT a copy.
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   834
     Also note, that it may be a slow operation for some collections,
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   835
     due to the grow:-message, which is inefficient for fixed size 
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   836
     collections (i.e. for Strings and Arrays it is not recommened)."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   837
a27a279701f8 Initial revision
claus
parents:
diff changeset
   838
    |newSize|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   839
a27a279701f8 Initial revision
claus
parents:
diff changeset
   840
    newSize := self size + 1.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   841
    self grow:newSize.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   842
    self replaceFrom:index + 1 to:newSize with:self startingAt:index.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   843
    self at:index put:anElement
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   844
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   845
    "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   846
     #(1 2 3 4 5 6 7 8) add:'hello' beforeIndex:5
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   847
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   848
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   849
a27a279701f8 Initial revision
claus
parents:
diff changeset
   850
remove:anElement ifAbsent:aBlock
61
claus
parents: 44
diff changeset
   851
    "search for anElement and, if present remove and return it.
claus
parents: 44
diff changeset
   852
     If not present, return the value of evaluating aBlock.
claus
parents: 44
diff changeset
   853
claus
parents: 44
diff changeset
   854
     Notice, that this is modifies the receiver NOT a copy.
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   855
     Also note, that it may be a slow operation for some collections,
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   856
     due to the grow:-message, which is inefficient for fixed size 
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   857
     collections (i.e. for Strings and Arrays it is not recommened)."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   858
a27a279701f8 Initial revision
claus
parents:
diff changeset
   859
    |any 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   860
     dstIndex "{ Class: SmallInteger }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   861
     sz       "{ Class: SmallInteger }"|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   862
a27a279701f8 Initial revision
claus
parents:
diff changeset
   863
    dstIndex := 1.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   864
    any := false.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   865
    sz := self size.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   866
    1 to:sz do:[:srcIndex |
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   867
	(anElement = (self at:srcIndex)) ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   868
	    any := true
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   869
	] ifFalse:[
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   870
	    (dstIndex ~~ srcIndex) ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   871
		self at:dstIndex put:(self at:srcIndex)
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   872
	    ].
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   873
	    dstIndex := dstIndex + 1
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   874
	]
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   875
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   876
    any ifTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   877
	self grow:dstIndex - 1.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   878
	^ anElement
61
claus
parents: 44
diff changeset
   879
    ].
claus
parents: 44
diff changeset
   880
    ^ aBlock value
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   881
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   882
    "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   883
     #(1 2 3 4 5 6 7 8 9 0) remove:3 ifAbsent:[Transcript showCr:'no']
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   884
     #(1 2 3 4 5 6 7 8 9 0) remove:99 ifAbsent:[#oops]
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   885
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   886
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   887
a27a279701f8 Initial revision
claus
parents:
diff changeset
   888
removeFromIndex:startIndex toIndex:endIndex
61
claus
parents: 44
diff changeset
   889
    "remove the elements stored at indexes between startIndex and endIndex.
claus
parents: 44
diff changeset
   890
118
a0460951adf7 fixed grow:0
claus
parents: 95
diff changeset
   891
     Notice, that this is modifies the receiver - NOT a copy; 
a0460951adf7 fixed grow:0
claus
parents: 95
diff changeset
   892
     therefore any other users of the receiver will also see this change.
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   893
     Also note, that it may be a slow operation for some collections,
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   894
     due to the grow:-message, which is inefficient for fixed size 
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   895
     collections (i.e. for Strings and Arrays it is not recommened)."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   896
a27a279701f8 Initial revision
claus
parents:
diff changeset
   897
    |newSize|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   898
a27a279701f8 Initial revision
claus
parents:
diff changeset
   899
    newSize := self size - endIndex + startIndex - 1.
118
a0460951adf7 fixed grow:0
claus
parents: 95
diff changeset
   900
    newSize <= 0 ifTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   901
	self grow:0
118
a0460951adf7 fixed grow:0
claus
parents: 95
diff changeset
   902
    ] ifFalse:[
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   903
	self replaceFrom:startIndex to:newSize with:self startingAt:(endIndex + 1).
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   904
	self grow:newSize
118
a0460951adf7 fixed grow:0
claus
parents: 95
diff changeset
   905
    ]
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   906
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   907
    "
118
a0460951adf7 fixed grow:0
claus
parents: 95
diff changeset
   908
     #(1 2 3 4 5 6 7 8 9 0) asOrderedCollection removeFromIndex:3 toIndex:5 
a0460951adf7 fixed grow:0
claus
parents: 95
diff changeset
   909
     #(1 2 3 4 5 6 7 8 9 0) removeFromIndex:3 toIndex:5 
a0460951adf7 fixed grow:0
claus
parents: 95
diff changeset
   910
     #(1 2 3 4 5 6 7 8 9 0) asOrderedCollection removeFromIndex:1 toIndex:10 
a0460951adf7 fixed grow:0
claus
parents: 95
diff changeset
   911
     #(1 2 3 4 5 6 7 8 9 0) removeFromIndex:1 toIndex:10 
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   912
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   913
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   914
61
claus
parents: 44
diff changeset
   915
removeAtIndex:index
claus
parents: 44
diff changeset
   916
    "remove the argument stored at index and return it.
claus
parents: 44
diff changeset
   917
claus
parents: 44
diff changeset
   918
     Notice, that this is modifies the receiver NOT a copy.
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   919
     Also note, that it may be a slow operation for some collections,
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   920
     due to the grow:-message, which is inefficient for fixed size 
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   921
     collections (i.e. for Strings and Arrays it is not recommened)."
61
claus
parents: 44
diff changeset
   922
claus
parents: 44
diff changeset
   923
    |element|
claus
parents: 44
diff changeset
   924
claus
parents: 44
diff changeset
   925
    element := self at:index.
claus
parents: 44
diff changeset
   926
    self removeIndex:index.
claus
parents: 44
diff changeset
   927
    ^ element
claus
parents: 44
diff changeset
   928
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   929
    "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   930
     #($a $b $c $d $e $f $g) removeAtIndex:3
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   931
    "
61
claus
parents: 44
diff changeset
   932
!
claus
parents: 44
diff changeset
   933
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   934
removeIndex:index
61
claus
parents: 44
diff changeset
   935
    "remove the argument stored at index. Return the receiver.
claus
parents: 44
diff changeset
   936
claus
parents: 44
diff changeset
   937
     Notice, that this is modifies the receiver NOT a copy.
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   938
     Also note, that it may be a slow operation for some collections,
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   939
     due to the grow:-message, which is inefficient for fixed size 
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   940
     collections (i.e. for Strings and Arrays it is not recommened)."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   941
a27a279701f8 Initial revision
claus
parents:
diff changeset
   942
    self removeFromIndex:index toIndex:index
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   943
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   944
    "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   945
     #($a $b $c $d $e $f $g) removeIndex:3
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   946
    "
61
claus
parents: 44
diff changeset
   947
!
claus
parents: 44
diff changeset
   948
claus
parents: 44
diff changeset
   949
removeFirst
claus
parents: 44
diff changeset
   950
    "remove the first element of the receiver and return it.
claus
parents: 44
diff changeset
   951
claus
parents: 44
diff changeset
   952
     Notice, that this is modifies the receiver NOT a copy.
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   953
     Also note, that it may be a slow operation for some collections,
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   954
     due to the grow:-message, which is inefficient for fixed size 
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   955
     collections (i.e. for Strings and Arrays it is not recommened)."
61
claus
parents: 44
diff changeset
   956
claus
parents: 44
diff changeset
   957
    ^ self removeAtIndex:1
claus
parents: 44
diff changeset
   958
claus
parents: 44
diff changeset
   959
    "
claus
parents: 44
diff changeset
   960
    |a|
claus
parents: 44
diff changeset
   961
     a := #(1 2 3 4 5 6).
claus
parents: 44
diff changeset
   962
     a removeFirst.
claus
parents: 44
diff changeset
   963
     a
claus
parents: 44
diff changeset
   964
    "
claus
parents: 44
diff changeset
   965
!
claus
parents: 44
diff changeset
   966
claus
parents: 44
diff changeset
   967
removeLast
claus
parents: 44
diff changeset
   968
    "remove the last element of the receiver and return it.
claus
parents: 44
diff changeset
   969
claus
parents: 44
diff changeset
   970
     Notice, that this is modifies the receiver NOT a copy.
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   971
     Also note, that it may be a slow operation for some collections,
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   972
     due to the grow:-message, which is inefficient for fixed size
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   973
     collections (i.e. for Strings and Arrays it is not recommened)."
61
claus
parents: 44
diff changeset
   974
claus
parents: 44
diff changeset
   975
    ^ self removeAtIndex:(self size) 
claus
parents: 44
diff changeset
   976
claus
parents: 44
diff changeset
   977
    "
claus
parents: 44
diff changeset
   978
    |a|
claus
parents: 44
diff changeset
   979
     a := #(1 2 3 4 5 6).
claus
parents: 44
diff changeset
   980
     a removeLast.
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   981
     a   
61
claus
parents: 44
diff changeset
   982
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   983
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   984
a27a279701f8 Initial revision
claus
parents:
diff changeset
   985
!SequenceableCollection methodsFor:'searching'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   986
a27a279701f8 Initial revision
claus
parents:
diff changeset
   987
detect:aBlock ifNone:exceptionBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
   988
    "find the first element, for which evaluation of the argument, aBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
   989
     return true; if none does so, return the evaluation of exceptionBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
   990
a27a279701f8 Initial revision
claus
parents:
diff changeset
   991
    reimplemented here for speed"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   992
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
   993
    |stop  "{ Class: SmallInteger }"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   994
     element|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   995
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
   996
    stop := self size.
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
   997
    1 to:stop do:[:index |
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   998
	element := self at:index.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   999
	(aBlock value:element) ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1000
	    ^ element
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1001
	].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1002
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1003
    ^ exceptionBlock value
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1004
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1005
    "
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1006
     #(11 12 13 14) detect:[:n | n odd] ifNone:['sorry']    
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1007
     #(12 14 16 18) detect:[:n | n odd] ifNone:['sorry']     
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1008
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1009
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1010
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1011
indexOf:anElement
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1012
    "search the collection for anElement;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1013
     if found, return the index otherwise return 0.
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
  1014
     The comparison is done using = 
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
  1015
     (i.e. equality test - not identity test)."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1016
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1017
    ^ self indexOf:anElement startingAt:1
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
  1018
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1019
    "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1020
     #(10 20 30 40 50 60 70) indexOf:40
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1021
     #(10 20 30 40 50 60 70) indexOf:40.0
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1022
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1023
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1024
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1025
indexOf:anElement ifAbsent:exceptionBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1026
    "search the collection for anElement;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1027
     if found, return the index otherwise return the value of the
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1028
     exceptionBlock.
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
  1029
     The comparison is done using = 
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
  1030
     (i.e. equality test - not identity test)."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1031
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1032
    |index|
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1033
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1034
    index := self indexOf:anElement startingAt:1.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1035
    (index == 0) ifTrue:[^ exceptionBlock value].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1036
    ^ index
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1037
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1038
    "
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1039
     #(10 20 30 40 10 20 30 40) indexOf:40   ifAbsent:['none'] 
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1040
     #(10 20 30 40 10 20 30 40) indexOf:40.0 ifAbsent:['none'] 
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1041
     #(10 20 30 40 10 20 30 40) indexOf:35   ifAbsent:['none'] 
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1042
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1043
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1044
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1045
indexOf:anElement startingAt:start
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1046
    "search the collection for anElement, starting the search at index start;
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1047
     if found, return the index otherwise return 0.
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
  1048
     The comparison is done using = 
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
  1049
     (i.e. equality test - not identity test)."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1050
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1051
    |startIndex "{ Class: SmallInteger }"
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1052
     stop       "{ Class: SmallInteger }" |
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1053
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1054
    startIndex := start.
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1055
    stop := self size.
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1056
    startIndex to:stop do:[:index |
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1057
	anElement = (self at:index) ifTrue:[^ index].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1058
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1059
    ^ 0
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1060
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1061
    "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1062
     #(10 20 30 40 10 20 30 40) indexOf:40   startingAt:5  
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1063
     #(10 20 30 40 10 20 30 40) indexOf:40.0 startingAt:5  
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1064
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1065
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1066
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1067
indexOf:anElement startingAt:start ifAbsent:exceptionBlock
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1068
    "search the collection for anElement starting the search at index start;
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1069
     if found, return the index otherwise return the value of the
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1070
     exceptionBlock.
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
  1071
     The comparison is done using = 
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
  1072
     (i.e. equality test - not identity test)."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1073
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1074
    |index|
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1075
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1076
    index := self indexOf:anElement startingAt:start.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1077
    (index == 0) ifTrue:[^ exceptionBlock value].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1078
    ^ index
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1079
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1080
    "
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1081
     #(10 20 30 40 10 20 30 40) indexOf:40   startingAt:5 ifAbsent:['none'] 
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1082
     #(10 20 30 40 10 20 30 40) indexOf:40.0 startingAt:5 ifAbsent:['none'] 
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1083
     #(10 20 30 40 10 20 30 40) indexOf:35   startingAt:5 ifAbsent:['none'] 
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1084
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1085
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1086
252
  1087
indexOf:elementToFind replaceWith:replacement startingAt:start stoppingAt:stop
  1088
    "search for the first occurence of elementToFind starting at start,
  1089
     stopping the search at stop. If found, replace the element by replacement
  1090
     and return the index.
  1091
     If not found, return 0."
  1092
  1093
    |idx|
  1094
  1095
    idx := self indexOf:elementToFind startingAt:start.
  1096
    ((idx > 0) and:[idx <= stop]) ifTrue:[
  1097
	self at:idx put:replacement.
  1098
	^ idx
  1099
    ].
  1100
    ^ 0
  1101
  1102
    "
  1103
     |a|
  1104
  1105
     a := #(10 20 30 40 50 60 70).
  1106
     (a indexOf:30 replaceWith:nil startingAt:1 stoppingAt:7) printNL.
  1107
     a printNL.
  1108
    "
  1109
!
  1110
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1111
identityIndexOf:anElement
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1112
    "search the collection for anElement using identity compare (i.e. ==);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1113
     if found, return the index otherwise return 0."
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1114
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1115
    ^ self identityIndexOf:anElement startingAt:1
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
  1116
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1117
    "
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1118
     #(10 20 30 40 50 60 70) identityIndexOf:40
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1119
     #(10 20 30 40 50 60 70) identityIndexOf:40.0
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1120
     #(10 20 30 40 50 60 70) indexOf:40.0
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1121
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1122
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1123
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1124
identityIndexOf:anElement ifAbsent:exceptionBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1125
    "search the collection for anElement using identity compare (i.e. ==);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1126
     if found, return the index otherwise return the value of the
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1127
     exceptionBlock."
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1128
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1129
    |index|
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1130
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1131
    index := self identityIndexOf:anElement startingAt:1.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1132
    (index == 0) ifTrue:[^ exceptionBlock value].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1133
    ^ index
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1134
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1135
    "
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1136
     #(10 20 30 40 50 60 70) identityIndexOf:40  ifAbsent:['none']  
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1137
     #(10 20 30 40 50 60 70) identityIndexOf:35  ifAbsent:['none']  
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1138
     #(10 20 30 40 50 60 70) identityIndexOf:40.0 ifAbsent:['none'] 
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1139
     #(10 20 30 40 50 60 70) indexOf:40.0         ifAbsent:['none'] 
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1140
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1141
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1142
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1143
identityIndexOf:anElement startingAt:start
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1144
    "search the collection for anElement, starting search at index start
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1145
     using identity compare  (i.e. ==);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1146
     if found, return the index otherwise return 0."
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1147
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1148
    |startIndex "{ Class: SmallInteger }"
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1149
     stop       "{ Class: SmallInteger }" |
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1150
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1151
    startIndex := start.
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1152
    stop := self size.
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1153
    startIndex to:stop do:[:index |
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1154
	anElement == (self at:index) ifTrue:[^ index].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1155
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1156
    ^ 0
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
  1157
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1158
    "
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1159
     #(10 20 30 40 10 20 30 40) identityIndexOf:40   startingAt:5
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1160
     #(10 20 30 40 10 20 30 40) identityIndexOf:40.0 startingAt:5
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1161
     #(10 20 30 40 10 20 30 40) indexOf:40.0         startingAt:5 
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1162
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1163
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1164
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1165
identityIndexOf:anElement startingAt:start ifAbsent:exceptionBlock
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1166
    "search the collection for anElement, starting search at index start;
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1167
     if found, return the index otherwise return the value of the
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1168
     exceptionBlock.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1169
     This one searches for identical objects (i.e. ==)."
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1170
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1171
    |index|
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1172
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1173
    index := self identityIndexOf:anElement startingAt:start.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1174
    (index == 0) ifTrue:[^ exceptionBlock value].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1175
    ^ index
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1176
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1177
    "
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1178
     #(10 20 30 40 10) identityIndexOf:10 startingAt:3 ifAbsent:['none'] 
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1179
     #(10 20 30 40 10) identityIndexOf:35 startingAt:3 ifAbsent:['none'] 
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1180
    "
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1181
!
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1182
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1183
indexOfAny:aCollection
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1184
    "search the collection for an element in aCollection.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1185
     if found, return the index otherwise return 0.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1186
     The comparison is done using = 
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1187
     (i.e. equality test - not identity test).
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1188
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1189
     Notice, that for big collections, the runtime of this search
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1190
     grows proportional to size(receiver) * size(aCollection).
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1191
     You may think about using other mechanisms (Sets, Dictionaries etc)."
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1192
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1193
    ^ self indexOfAny:aCollection startingAt:1
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1194
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1195
    "
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1196
     #(10 20 30 40 50 60 70) indexOfAny:#(40 30 50)
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1197
     #(10 20 30 40 50 60 70) indexOfAny:#(40.0 30.0 50)
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1198
    "
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1199
!
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1200
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1201
indexOfAny:aCollection startingAt:start
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1202
    "search the collection for an element in aCollection,
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1203
     starting the search at index start;
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1204
     if found, return the index otherwise return 0.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1205
     The comparison is done using = 
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1206
     (i.e. equality test - not identity test).
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1207
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1208
     Notice, that for big collections, the runtime of this search
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1209
     grows proportional to size(receiver) * size(aCollection).
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1210
     You may think about using other mechanisms (Sets, Dictionaries etc)."
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1211
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1212
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1213
    |startIndex "{ Class: SmallInteger }"
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1214
     stop       "{ Class: SmallInteger }" |
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1215
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1216
    startIndex := start.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1217
    stop := self size.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1218
    startIndex to:stop do:[:index |
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1219
	(aCollection includes:(self at:index)) ifTrue:[^ index].
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1220
    ].
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1221
    ^ 0
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1222
    "
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1223
     #(10 20 30 40 10 20 30 40) indexOfAny:#(40 50 30) startingAt:5  
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1224
     #(10 20 30 40 10 20 30 40) indexOfAny:#(40.0 50 30.0) startingAt:5  
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1225
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1226
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1227
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1228
findFirst:aBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1229
    "find the first element, for which evaluation of the argument, aBlock
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1230
     returns true; return its index or 0 if none detected."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1231
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1232
    |stop  "{ Class: SmallInteger }" |
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1233
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1234
    stop := self size.
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1235
    1 to:stop do:[:index |
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1236
	(aBlock value:(self at:index)) ifTrue:[^ index].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1237
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1238
    ^ 0
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1239
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1240
    "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1241
     #(1 2 3 4 5 6) findFirst:[:x | (x >= 3)]
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1242
     #(1 2 3 4 5 6) findFirst:[:x | (x >= 3) and:[x even]]
244
9faa2da0650a Text <-> StringCollection
claus
parents: 233
diff changeset
  1243
     #(1 2 3 4 5 6) findFirst:[:x | (x >= 8)]           
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1244
     'one.two.three' findFirst:[:c | (c == $.)]
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1245
    "
13
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
  1246
!
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
  1247
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
  1248
findLast:aBlock
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
  1249
    "find the last element, for which evaluation of the argument, aBlock
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1250
     returns true; return its index or 0 if none detected."
13
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
  1251
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1252
    |start "{ Class: SmallInteger }"|
13
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
  1253
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1254
    start := self size.
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1255
    start to:1 by:-1 do:[:index |
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1256
	(aBlock value:(self at:index)) ifTrue:[^ index].
13
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
  1257
    ].
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
  1258
    ^ 0
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
  1259
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1260
    "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1261
     #(1 99 3 99 5 6) findLast:[:x | (x == 99)]
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1262
     'one.two.three' findLast:[:c | (c == $.)]
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1263
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1264
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1265
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1266
includes:anElement
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1267
    "return true if the collection contains anElement; false otherwise.
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1268
     Comparison is done using equality compare (i.e. =).
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1269
     Q: Should there also be some identityIncludes ?"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1270
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1271
    ((self indexOf:anElement startingAt:1) == 0) ifTrue:[^ false].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1272
    ^ true
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1273
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1274
    "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1275
     #(10 20 30 40 50 60 70) includes:99      
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1276
     #(10 20 30 40 50 60 70) includes:40     
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1277
     #(10 20 30 40 50 60 70) includes:40.0    
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1278
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1279
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1280
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1281
!SequenceableCollection methodsFor:'sorting & reordering'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1282
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1283
reverse
2
claus
parents: 1
diff changeset
  1284
    "reverse the order of the elements inplace"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1285
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1286
    |lowIndex "{ Class: SmallInteger }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1287
     hiIndex  "{ Class: SmallInteger }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1288
     t|
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1289
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1290
    hiIndex := self size.
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1291
    lowIndex := 1.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1292
    [lowIndex < hiIndex] whileTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1293
	t := self at:lowIndex.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1294
	self at:lowIndex put:(self at:hiIndex). 
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1295
	self at:hiIndex put:t.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1296
	lowIndex := lowIndex + 1.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1297
	hiIndex := hiIndex - 1
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1298
    ]
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1299
    "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1300
     #(4 5 6 7 7) reverse
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1301
     #(1 4 7 10 2 5) asOrderedCollection reverse
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1302
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1303
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1304
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1305
quickSortFrom:begin to:end
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1306
    "actual quicksort worker for sort-message"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1307
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1308
    |b "{ Class: SmallInteger }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1309
     e "{ Class: SmallInteger }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1310
     middleElement temp |
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1311
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1312
    b := begin.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1313
    e := end.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1314
    middleElement := self at:((b + e) // 2).
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1315
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1316
    [b < e] whileTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1317
	[b < end and:[(self at:b) < middleElement]] whileTrue:[b := b + 1].
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1318
	[e > begin and:[middleElement < (self at:e)]] whileTrue:[e := e - 1].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1319
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1320
	(b <= e) ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1321
	    (b == e) ifFalse:[
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1322
		temp := self at:b.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1323
		self at:b put:(self at:e).
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1324
		self at:e put:temp
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1325
	    ].
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1326
	    b := b + 1.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1327
	    e := e - 1
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1328
	]
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1329
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1330
    (begin < e) ifTrue:[self quickSortFrom:begin to:e].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1331
    (b < end) ifTrue:[self quickSortFrom:b to:end]
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1332
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1333
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1334
quickSortFrom:begin to:end with:aCollection
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1335
    "actual quicksort worker for sortWith-message"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1336
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1337
    |b "{ Class: SmallInteger }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1338
     e "{ Class: SmallInteger }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1339
     middleElement temp |
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1340
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1341
    b := begin.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1342
    e := end.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1343
    middleElement := self at:((b + e) // 2).
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1344
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1345
    [b < e] whileTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1346
	[b < end and:[(self at:b) < middleElement]] whileTrue:[b := b + 1].
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1347
	[e > begin and:[middleElement < (self at:e)]] whileTrue:[e := e - 1].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1348
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1349
	(b <= e) ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1350
	    (b == e) ifFalse:[
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1351
		temp := self at:b.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1352
		self at:b put:(self at:e).
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1353
		self at:e put:temp.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1354
		temp := aCollection at:b.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1355
		aCollection at:b put:(aCollection at:e).
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1356
		aCollection at:e put:temp
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1357
	    ].
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1358
	    b := b + 1.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1359
	    e := e - 1
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1360
	]
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1361
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1362
    (begin < e) ifTrue:[self quickSortFrom:begin to:e with:aCollection].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1363
    (b < end) ifTrue:[self quickSortFrom:b to:end with:aCollection]
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1364
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1365
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1366
quickSortFrom:begin to:end sortBlock:sortBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1367
    "actual quicksort worker for sort:-message"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1368
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1369
    |b "{ Class: SmallInteger }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1370
     e "{ Class: SmallInteger }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1371
     middleElement temp |
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1372
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1373
    b := begin.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1374
    e := end.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1375
    middleElement := self at:((b + e) // 2).
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1376
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1377
    [b < e] whileTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1378
	[b < end and:[sortBlock value:(self at:b) value:middleElement]] whileTrue:[b := b + 1].
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1379
	[e > begin and:[sortBlock value:middleElement value:(self at:e)]] whileTrue:[e := e - 1].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1380
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1381
	(b <= e) ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1382
	    (b == e) ifFalse:[
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1383
		temp := self at:b.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1384
		self at:b put:(self at:e).
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1385
		self at:e put:temp
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1386
	    ].
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1387
	    b := b + 1.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1388
	    e := e - 1
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1389
	]
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1390
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1391
    (begin < e) ifTrue:[self quickSortFrom:begin to:e sortBlock:sortBlock].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1392
    (b < end) ifTrue:[self quickSortFrom:b to:end sortBlock:sortBlock]
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1393
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1394
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1395
quickSortFrom:begin to:end sortBlock:sortBlock with:aCollection
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1396
    "actual quicksort worker for sort:with:-message"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1397
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1398
    |b "{ Class: SmallInteger }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1399
     e "{ Class: SmallInteger }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1400
     middleElement temp |
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1401
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1402
    b := begin.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1403
    e := end.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1404
    middleElement := self at:((b + e) // 2).
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1405
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1406
    [b < e] whileTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1407
	[b < end and:[sortBlock value:(self at:b) value:middleElement]] whileTrue:[b := b + 1].
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1408
	[e > begin and:[sortBlock value:middleElement value:(self at:e)]] whileTrue:[e := e - 1].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1409
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1410
	(b <= e) ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1411
	    (b == e) ifFalse:[
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1412
		temp := self at:b.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1413
		self at:b put:(self at:e).
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1414
		self at:e put:temp.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1415
		temp := aCollection at:b.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1416
		aCollection at:b put:(aCollection at:e).
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1417
		aCollection at:e put:temp
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1418
	    ].
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1419
	    b := b + 1.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1420
	    e := e - 1
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1421
	]
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1422
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1423
    (begin < e) ifTrue:[self quickSortFrom:begin to:e sortBlock:sortBlock with:aCollection].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1424
    (b < end) ifTrue:[self quickSortFrom:b to:end sortBlock:sortBlock with:aCollection]
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1425
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1426
69
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
  1427
topologicalSort:sortBlock
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
  1428
    "sort the collection inplace using a sloooow sort algorithm.
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1429
     This algorithm has O-square runtime behavior and should be used only
69
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
  1430
     in special situations.
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
  1431
     It compares all elements, thus can be used when a>b, b>c does NOT imply
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
  1432
     a>c (for example, to sort classes by inheritance)
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1433
69
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
  1434
     In other situations, use #sort; which implements the quicksort algorithm.
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
  1435
    "
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
  1436
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
  1437
    |smallestIndex "{ Class: SmallInteger }"
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
  1438
     end           "{ Class: SmallInteger }"
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
  1439
     smallest thisOne|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1440
77
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  1441
    "this is just a q&d hack - there must be better implementations for this ;-)"
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  1442
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1443
    end := self size.
69
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
  1444
    1 to:end do:[:index |
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1445
	smallest := self at:index.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1446
	smallestIndex := index.
69
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
  1447
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1448
	(index + 1) to:end do:[:index2 |
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1449
	    thisOne := self at:index2.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1450
	    (sortBlock value:thisOne value:smallest) ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1451
		smallestIndex := index2.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1452
		smallest := thisOne
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1453
	    ].
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1454
	].
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1455
	(smallestIndex ~~ index) ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1456
	    thisOne := self at:index.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1457
	    self at:index put:smallest.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1458
	    self at:smallestIndex put:thisOne
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1459
	].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1460
    ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1461
69
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
  1462
    "
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1463
     #(1 16 7 98 3 19 4 0) topologicalSort:[:a :b | a < b]   
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1464
     #(1 16 7 98 3 19 4 0) sort:[:a :b | a < b]              
77
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  1465
     Smalltalk allClasses asArray topologicalSort:[:a :b | b isSubclassOf:a] 
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1466
     Smalltalk allClasses asArray sort:[:a :b | b isSubclassOf:a] 
69
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
  1467
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1468
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1469
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1470
sort
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1471
    "sort the collection inplace. The elements are compared using
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1472
     > and < i.e. they should offer a magnitude-like protocol.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1473
     The implementation uses the quicksort algorithm, which may not be
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1474
     the best possible for all situations."
13
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
  1475
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1476
    |stop|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1477
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1478
    stop := self size.
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1479
    (stop > 1) ifTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1480
	self quickSortFrom:1 to:stop
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1481
    ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1482
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1483
    "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1484
     #(1 16 7 98 3 19 4 0) sort
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1485
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1486
     |data|
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1487
     data := Random new next:100000.
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1488
     'random  ' print. (Time millisecondsToRun:[data sort]) printNL.
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1489
     'sorted  ' print. (Time millisecondsToRun:[data sort]) printNL.
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1490
     data reverse. 
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1491
     'reverse ' print. (Time millisecondsToRun:[data sort]) printNL.
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1492
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1493
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1494
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1495
sort:sortBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1496
    "sort the collection inplace using the 2-arg block sortBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1497
     for comparison. This allows any sort criteria to be implemented."
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1498
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1499
    |stop|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1500
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1501
    stop := self size.
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1502
    (stop > 1) ifTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1503
	self quickSortFrom:1 to:stop sortBlock:sortBlock
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1504
    ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1505
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1506
    "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1507
     #(1 16 7 98 3 19 4 0) sort:[:a :b | a < b]
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1508
     #(1 16 7 98 3 19 4 0) sort:[:a :b | a > b]
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1509
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1510
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1511
69
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
  1512
sortWith:aCollection
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
  1513
    "sort the receiver collection inplace, also sort aCollection with it.
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
  1514
     Use, when you have a key collection to sort another collection with."
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
  1515
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
  1516
    |stop|
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
  1517
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
  1518
    stop := self size.
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
  1519
    (stop > 1) ifTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1520
	self quickSortFrom:1 to:stop with:aCollection
69
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
  1521
    ]
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
  1522
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
  1523
    "
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
  1524
     |c1 c2|
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
  1525
     c1 := #(1 16 7 9).
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
  1526
     c2 := #('one' 'sixteen' 'seven' 'nine').
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
  1527
     c1 sortWith:c2.
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1528
     c1 printNL.
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1529
     c2 printNL
69
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
  1530
    "
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
  1531
!
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
  1532
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1533
sort:sortBlock with:aCollection
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1534
    "sort the collection inplace using the 2-arg block sortBlock
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1535
     for comparison. Also reorder the elements in aCollection.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1536
     Use, when you have a key collection to sort some other collection with."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1537
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1538
    |stop|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1539
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1540
    stop := self size.
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1541
    (stop > 1) ifTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1542
	self quickSortFrom:1 to:stop sortBlock:sortBlock with:aCollection
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1543
    ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1544
69
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
  1545
    "
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
  1546
     |c1 c2|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1547
     c1 := #(1 16 7 9).
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1548
     c2 := #('one' 'sixteen' 'seven' 'nine').
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1549
     c1 sort:[:a :b | a > b] with:c2.
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1550
     c1 printNL.
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1551
     c2 printNL
69
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
  1552
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1553
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1554
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1555
!SequenceableCollection methodsFor:'enumerating'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1556
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1557
do:aBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1558
    "evaluate the argument, aBlock for every element in the collection."
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1559
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1560
    |stop "{ Class:SmallInteger }"|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1561
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1562
    stop := self size.
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1563
    1 to:stop do:[:index |
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1564
	aBlock value:(self at:index).
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1565
    ]
77
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  1566
    "
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  1567
     #(one two three four five six) do:[:element | Transcript showCr:element]
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  1568
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1569
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1570
3
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  1571
keysAndValuesDo:aTwoArgBlock
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  1572
    "evaluate the argument, aBlock for every element in the collection,
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  1573
     passing both index and element as arguments."
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  1574
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1575
    |stop  "{ Class:SmallInteger }"|
3
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  1576
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1577
    stop := self size.
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1578
    1 to:stop do:[:index |
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1579
	aTwoArgBlock value:index value:(self at:index).
3
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  1580
    ]
77
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  1581
    "
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  1582
     #(one two three four five six) keysAndValuesDo:[:key :element | Transcript show:key; space; showCr:element]
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  1583
    "
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  1584
!
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  1585
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  1586
with:aSequenceableCollection do:aTwoArgBlock
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  1587
    "evaluate the argument, aBlock for successive elements from
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  1588
     each the receiver and the argument, aSequenceableCollection.
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  1589
     The second argument, aBlock must be a two-argument block.
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  1590
     The collection argument must implement access via a numeric key."
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  1591
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  1592
    |stop  "{ Class: SmallInteger }" |
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  1593
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  1594
    stop := self size.
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  1595
    1 to:stop do:[:index |
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1596
	aTwoArgBlock value:(self at:index) value:(aSequenceableCollection at:index).
77
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  1597
    ]
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  1598
    "
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  1599
     #(one two three four five six) with:(1 to:10) do:[:el1 :el2 | Transcript show:el1; space; showCr:el2]
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  1600
    "
3
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  1601
!
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  1602
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1603
from:index1 to:index2 do:aBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1604
    "evaluate the argument, aBlock for the elements with index index1 to
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1605
     index2 in the collection"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1606
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1607
    |start "{ Class:SmallInteger }"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1608
     stop  "{ Class:SmallInteger }" |
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1609
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1610
    start := index1.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1611
    stop := index2.
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1612
    start to:stop do:[:index |
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1613
	aBlock value:(self at:index).
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1614
    ]
77
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  1615
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  1616
    "
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  1617
     #(one two three four five six) from:3 to:5 do:[:element | Transcript showCr:element]
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  1618
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1619
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1620
42
e33491f6f260 *** empty log message ***
claus
parents: 32
diff changeset
  1621
from:index1 to:index2 reverseDo:aBlock
e33491f6f260 *** empty log message ***
claus
parents: 32
diff changeset
  1622
    "evaluate the argument, aBlock for the elements with index index1 to
e33491f6f260 *** empty log message ***
claus
parents: 32
diff changeset
  1623
     index2 in the collection. Step in reverse order"
e33491f6f260 *** empty log message ***
claus
parents: 32
diff changeset
  1624
e33491f6f260 *** empty log message ***
claus
parents: 32
diff changeset
  1625
    |start "{ Class:SmallInteger }"
e33491f6f260 *** empty log message ***
claus
parents: 32
diff changeset
  1626
     stop  "{ Class:SmallInteger }" |
e33491f6f260 *** empty log message ***
claus
parents: 32
diff changeset
  1627
e33491f6f260 *** empty log message ***
claus
parents: 32
diff changeset
  1628
    start := index1.
e33491f6f260 *** empty log message ***
claus
parents: 32
diff changeset
  1629
    stop := index2.
e33491f6f260 *** empty log message ***
claus
parents: 32
diff changeset
  1630
    stop to:start by:-1 do:[:index |
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1631
	aBlock value:(self at:index).
42
e33491f6f260 *** empty log message ***
claus
parents: 32
diff changeset
  1632
    ]
e33491f6f260 *** empty log message ***
claus
parents: 32
diff changeset
  1633
77
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  1634
    "
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  1635
     #(one two three four five six) from:3 to:5 reverseDo:[:element | Transcript showCr:element]
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  1636
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1637
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1638
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1639
reverseDo:aBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1640
    "evaluate the argument, aBlock for every element in the collection
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1641
     in reverse order"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1642
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1643
    |sz  "{ Class:SmallInteger }"|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1644
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1645
    sz := self size.
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1646
    sz to:1 by:-1 do:[:index |
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1647
	aBlock value:(self at:index).
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1648
    ]
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1649
77
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  1650
    "
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  1651
     #(one two three four five six) reverseDo:[:element | Transcript showCr:element]
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  1652
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1653
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1654
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1655
collect:aBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1656
    "evaluate the argument, aBlock for every element in the collection
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1657
     and return a collection of the results"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1658
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1659
    |newCollection
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1660
     sz  "{ Class:SmallInteger }"|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1661
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1662
    sz := self size.
252
  1663
    newCollection := self copyEmptyAndGrow:sz.
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1664
    1 to:sz do:[:index |
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1665
	newCollection at:index put:(aBlock value:(self at:index)).
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1666
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1667
    ^ newCollection
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1668
77
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  1669
    "
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  1670
     #(one two three four five six) collect:[:element | element asUppercase]  
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1671
     #(1 2 3 4 5 6 7 8 9) collect:[:element | element factorial]   
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1672
     (1 to:9) collect:[:element | element * element]   
77
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  1673
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1674
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1675
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1676
from:start to:stop collect:aBlock
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1677
    "evaluate the argument, aBlock for the elements indexed by start
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1678
     to stop in the collection and return a collection of the results"
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1679
202
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
  1680
    |newCollection sz
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1681
     idx  "{ Class:SmallInteger }"|
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1682
202
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
  1683
    sz := stop - start + 1.
252
  1684
    newCollection := self copyEmptyAndGrow:sz.
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1685
    idx := 1.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1686
    start to:stop do:[:index |
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1687
	newCollection at:idx put:(aBlock value:(self at:index)).
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1688
	idx := idx + 1
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1689
    ].
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1690
    ^ newCollection
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1691
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1692
    "
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1693
     #(one two three four five six) from:2 to:4 collect:[:element | element asUppercase]  
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1694
    "
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1695
!
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1696
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1697
select:aBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1698
    "evaluate the argument, aBlock for every element in the collection
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1699
     and return a collection of all elements for which the block return
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1700
     true"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1701
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1702
    |element newColl species needCopy
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1703
     sz  "{ Class:SmallInteger }"|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1704
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1705
    sz := self size.
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1706
    species := self species.
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1707
    species growIsCheap ifFalse:[
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1708
	newColl := OrderedCollection new:sz.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1709
	needCopy := true
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1710
    ] ifTrue:[
202
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
  1711
	newColl := self copyEmpty:sz.
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1712
	needCopy := false
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1713
    ].
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1714
    1 to:sz do:[:index |
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1715
	element := self at:index.
252
  1716
	(aBlock value:element) ifTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1717
	    newColl add:element
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1718
	].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1719
    ].
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1720
    needCopy ifTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1721
	newColl := (species withAll:newColl) postCopyFrom:self
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1722
    ].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1723
    ^ newColl
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1724
77
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  1725
    "
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  1726
     #(one two three four five six) select:[:element | element startsWith:'f']   
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1727
     #(1 2 3 4 5 6 7 8 9) select:[:element | element odd]   
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1728
     (#(17 12 1 98 51) asSortedCollection:[:a :b | b < a]) select:[:element | element odd]   
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1729
     (1 to:9) select:[:element | element odd]   
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1730
     (Smalltalk allClasses) select:[:class | class name startsWith:'S']   
77
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  1731
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1732
! !