SequenceableCollection.st
author Claus Gittinger <cg@exept.de>
Tue, 14 Nov 1995 20:02:34 +0100
changeset 544 d78012b20769
parent 530 07d0bce293c9
child 586 cab695f942a6
permissions -rw-r--r--
*** empty log message ***
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
88
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    20
!SequenceableCollection class methodsFor:'documentation'!
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    21
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    22
copyright
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    23
"
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    24
 COPYRIGHT (c) 1989 by Claus Gittinger
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
    25
	      All Rights Reserved
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    26
88
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    27
 This software is furnished under a license and may be used
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    28
 only in accordance with the terms of that license and with the
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    29
 inclusion of the above copyright notice.   This software may not
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    30
 be provided or otherwise made available to, or used by, any
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    31
 other person.  No title to or ownership of the software is
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    32
 hereby transferred.
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    33
"
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    34
!
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    35
88
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    36
version
530
07d0bce293c9 uff - version methods changed to return stings
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
    37
    ^ '$Header: /cvs/stx/stx/libbasic/SequenceableCollection.st,v 1.40 1995-11-11 15:26:36 cg Exp $'
88
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    38
!
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    39
88
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    40
documentation
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    41
"
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    42
    SequenceableCollections have ordered elements which can be accessed via
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    43
    a numeric index. 
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    44
    SequenceableCollection is an abstract class - there are no instances of 
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    45
    it in the system. See concrete subclasses (such as OrderedCollection).
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
a27a279701f8 Initial revision
claus
parents:
diff changeset
    49
!SequenceableCollection class methodsFor:'instance creation'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    50
a27a279701f8 Initial revision
claus
parents:
diff changeset
    51
new:size withAll:element
360
claus
parents: 359
diff changeset
    52
    "return a new collection of size, where all elements are
claus
parents: 359
diff changeset
    53
     initialized to element."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    54
a27a279701f8 Initial revision
claus
parents:
diff changeset
    55
    |newCollection|
a27a279701f8 Initial revision
claus
parents:
diff changeset
    56
a27a279701f8 Initial revision
claus
parents:
diff changeset
    57
    newCollection := self new:size.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    58
    newCollection atAllPut:element.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    59
    ^ newCollection
360
claus
parents: 359
diff changeset
    60
!
claus
parents: 359
diff changeset
    61
claus
parents: 359
diff changeset
    62
withSize:size
claus
parents: 359
diff changeset
    63
    "return a new collection of size.
claus
parents: 359
diff changeset
    64
     For variable size collections, this is different from #new:,
claus
parents: 359
diff changeset
    65
     in that #new: creates an empty collection with preallocated size,
claus
parents: 359
diff changeset
    66
     while #withSize: creates a non empty one."
claus
parents: 359
diff changeset
    67
claus
parents: 359
diff changeset
    68
    |newCollection|
claus
parents: 359
diff changeset
    69
claus
parents: 359
diff changeset
    70
    newCollection := self new:size.
claus
parents: 359
diff changeset
    71
    newCollection grow:size.
claus
parents: 359
diff changeset
    72
    ^ newCollection
claus
parents: 359
diff changeset
    73
claus
parents: 359
diff changeset
    74
    "
claus
parents: 359
diff changeset
    75
     (OrderedCollection new:10) inspect.
claus
parents: 359
diff changeset
    76
     (OrderedCollection withSize:10) inspect.
claus
parents: 359
diff changeset
    77
     (Array new:10) inspect.
claus
parents: 359
diff changeset
    78
     (Array withSize:10) inspect.
claus
parents: 359
diff changeset
    79
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    80
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
    81
a27a279701f8 Initial revision
claus
parents:
diff changeset
    82
!SequenceableCollection methodsFor:'accessing'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    83
a27a279701f8 Initial revision
claus
parents:
diff changeset
    84
first
a27a279701f8 Initial revision
claus
parents:
diff changeset
    85
    "return the first element"
a27a279701f8 Initial revision
claus
parents:
diff changeset
    86
a27a279701f8 Initial revision
claus
parents:
diff changeset
    87
    ^ self at:1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    88
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    89
a27a279701f8 Initial revision
claus
parents:
diff changeset
    90
last
a27a279701f8 Initial revision
claus
parents:
diff changeset
    91
    "return the last element"
a27a279701f8 Initial revision
claus
parents:
diff changeset
    92
a27a279701f8 Initial revision
claus
parents:
diff changeset
    93
    ^ self at:(self size)
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
    94
!
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
    95
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
    96
at:index ifAbsent:exceptionBlock
61
claus
parents: 44
diff changeset
    97
    "return the element at index if valid. 
claus
parents: 44
diff changeset
    98
     If the index is invalid, return the result of evaluating 
302
1f76060d58a4 *** empty log message ***
claus
parents: 293
diff changeset
    99
     the exceptionblock.
1f76060d58a4 *** empty log message ***
claus
parents: 293
diff changeset
   100
     NOTICE: 
1f76060d58a4 *** empty log message ***
claus
parents: 293
diff changeset
   101
	in ST-80, this message is only defined for Dictionaries,
1f76060d58a4 *** empty log message ***
claus
parents: 293
diff changeset
   102
	however, having a common protocol with indexed collections
1f76060d58a4 *** empty log message ***
claus
parents: 293
diff changeset
   103
	often simplifies things."
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
   104
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
   105
    ((index < 1) or:[index > self size]) ifTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   106
	^ exceptionBlock value
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
   107
    ].
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
   108
    ^ self at:index
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
   109
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   110
    "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   111
     #(1 2 3) at:4 ifAbsent:['no such index']
302
1f76060d58a4 *** empty log message ***
claus
parents: 293
diff changeset
   112
     #(1 2 3) asOrderedCollection at:4 ifAbsent:['no such index'] 
1f76060d58a4 *** empty log message ***
claus
parents: 293
diff changeset
   113
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   114
     (Dictionary with:(#foo -> #bar)
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   115
		 with:(#frob -> #baz)) 
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   116
	 at:#foobar ifAbsent:['no such index']
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   117
    "
362
claus
parents: 360
diff changeset
   118
!
claus
parents: 360
diff changeset
   119
claus
parents: 360
diff changeset
   120
keyAtValue:value
claus
parents: 360
diff changeset
   121
    "return the index of a value.
claus
parents: 360
diff changeset
   122
     This is normally not used (use indexOf:), but makes the
claus
parents: 360
diff changeset
   123
     protocol more compatible with dictionaries."
claus
parents: 360
diff changeset
   124
claus
parents: 360
diff changeset
   125
    ^ self identityIndexOf:value
claus
parents: 360
diff changeset
   126
!
claus
parents: 360
diff changeset
   127
claus
parents: 360
diff changeset
   128
keyAtValue:value ifAbsent:exceptionBlock
claus
parents: 360
diff changeset
   129
    "return the index of a value.
claus
parents: 360
diff changeset
   130
     This is normally not used (use indexOf:), but makes the
claus
parents: 360
diff changeset
   131
     protocol more compatible with dictionaries."
claus
parents: 360
diff changeset
   132
claus
parents: 360
diff changeset
   133
    ^ self identityIndexOf:value ifAbsent:exceptionBlock
claus
parents: 360
diff changeset
   134
!
claus
parents: 360
diff changeset
   135
claus
parents: 360
diff changeset
   136
keyAtEqualValue:value
claus
parents: 360
diff changeset
   137
    "return the index of a value.
claus
parents: 360
diff changeset
   138
     This is normally not used (use indexOf:), but makes the
claus
parents: 360
diff changeset
   139
     protocol more compatible with dictionaries."
claus
parents: 360
diff changeset
   140
claus
parents: 360
diff changeset
   141
    ^ self indexOf:value
claus
parents: 360
diff changeset
   142
!
claus
parents: 360
diff changeset
   143
claus
parents: 360
diff changeset
   144
keyAtEqualValue:value ifAbsent:exceptionBlock
claus
parents: 360
diff changeset
   145
    "return the index of a value.
claus
parents: 360
diff changeset
   146
     This is normally not used (use indexOf:), but makes the
claus
parents: 360
diff changeset
   147
     protocol more compatible with dictionaries."
claus
parents: 360
diff changeset
   148
claus
parents: 360
diff changeset
   149
    ^ self indexOf:value ifAbsent:exceptionBlock
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   150
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   151
13
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
   152
!SequenceableCollection methodsFor:'queries'!
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
   153
202
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   154
isSequenceable
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   155
    "return true, if the receiver is some kind of sequenceableCollection"
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   156
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   157
    ^ true
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   158
!
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   159
69
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
   160
isSequenceableCollection
202
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   161
    "OBSOLETE: use isSequenceable for ST-80 compatibility.
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   162
     This method is a historic leftover and will be removed."
69
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
   163
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
   164
    ^ true
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
   165
!
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
   166
13
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
   167
firstIndex
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
   168
    "return the first elements index"
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
   169
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
   170
    ^ 1
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
   171
!
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
   172
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
   173
lastIndex
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
   174
    "return the last elements index"
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
   175
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
   176
    ^ self size
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
   177
!
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
   178
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
   179
size
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
   180
    "return the number of elements in the collection.
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
   181
     concrete implementations must define this"
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
   182
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
   183
    ^ self subclassResponsibility
77
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
   184
!
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
   185
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
   186
keys
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
   187
    "return a collection with all keys in the Smalltalk dictionary"
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
   188
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
   189
    |sz|
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
   190
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
   191
    sz := self size.
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
   192
    sz == 0 ifTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   193
	^ #()
77
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
   194
    ].
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
   195
    ^ 1 to:sz
13
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
   196
! !
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
   197
260
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   198
!SequenceableCollection methodsFor:'converting'!
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   199
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   200
asStringWithCRs
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   201
    "return a string generated by concatenating my elements 
263
e0195b4ad1ac *** empty log message ***
claus
parents: 260
diff changeset
   202
     (which must be strings or nil) and embedding cr characters in between.
260
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   203
     Nil entries and empty strings are counted as empty lines."
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   204
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   205
    ^ self asStringWithCRsFrom:1 to:(self size)
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   206
!
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   207
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   208
asStringWithCRsFrom:firstLine to:lastLine
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   209
    "return a string generated by concatenating some of my elements 
263
e0195b4ad1ac *** empty log message ***
claus
parents: 260
diff changeset
   210
     (which must be strings or nil) and embedding cr characters in between.
260
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   211
     Nil entries and empty strings are counted as empty lines."
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   212
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   213
    ^ self asStringWithCRsFrom:firstLine to:lastLine compressTabs:false withCR:true
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   214
!
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   215
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   216
asStringWithCRsFrom:firstLine to:lastLine compressTabs:compressTabs
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   217
    "return part of myself as a string with embedded cr's.
263
e0195b4ad1ac *** empty log message ***
claus
parents: 260
diff changeset
   218
     My elements must be strings or nil.
260
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   219
     If the argument compressTabs is true, leading spaces are converted
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   220
     to tab-characters (8col tabs).
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   221
     Nil entries and empty strings are taken as empty lines."
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   222
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   223
    ^ self asStringWithCRsFrom:firstLine to:lastLine compressTabs:compressTabs withCR:true
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   224
!
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   225
266
f4a7a506a995 *** empty log message ***
claus
parents: 263
diff changeset
   226
asStringWithCRsFrom:firstLine to:lastLine compressTabs:compressTabs withCR:withCR
260
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   227
    "return part of myself as a string with embedded cr's.
263
e0195b4ad1ac *** empty log message ***
claus
parents: 260
diff changeset
   228
     My elements must be strings or nil; nil entries and empty strings are
260
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   229
     taken as empty lines.
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   230
     If the argument compressTabs is true, leading spaces are converted
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   231
     to tab-characters (8col tabs). WithCR controls whether the last line
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   232
     should be followed by a cr or not."
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   233
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   234
    ^ self asStringWith:(Character cr)
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   235
		   from:firstLine 
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   236
		     to:lastLine 
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   237
	   compressTabs:compressTabs 
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   238
		  final:(withCR ifTrue:[Character cr] ifFalse:[nil])
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   239
!
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   240
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   241
asStringWith:sepCharacter from:firstLine to:lastLine compressTabs:compressTabs final:endCharacter
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   242
    "return part of myself as a string with embedded sepCharacters.
263
e0195b4ad1ac *** empty log message ***
claus
parents: 260
diff changeset
   243
     My elements must be strings or nil; nil entries and empty strings are
260
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   244
     taken as empty lines.
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   245
     If the argument compressTabs is true, leading spaces are converted
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   246
     to tab-characters (8col tabs). The last line is followed by a final
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   247
     character (if non-nil).
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   248
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   249
     This method is tuned for big collections, in not creating many
263
e0195b4ad1ac *** empty log message ***
claus
parents: 260
diff changeset
   250
     intermediate strings (has linear runtime). For very small collections
e0195b4ad1ac *** empty log message ***
claus
parents: 260
diff changeset
   251
     and small strings, it may be faster to use the comma , operation."
260
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   252
293
31df3850e98c *** empty log message ***
claus
parents: 282
diff changeset
   253
    |idx1        "{ Class:SmallInteger }"
31df3850e98c *** empty log message ***
claus
parents: 282
diff changeset
   254
     idx2        "{ Class:SmallInteger }"
31df3850e98c *** empty log message ***
claus
parents: 282
diff changeset
   255
     totalLength "{ Class:SmallInteger }"
260
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   256
     pos         "{ Class:SmallInteger }"
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   257
     newString lineString spaces idx nTabs sepCnt|
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   258
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   259
    "
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   260
     first accumulate the size of the string, to avoid
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   261
     countless reallocations. If tabs are compressed,
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   262
     the size computed is not exact, but gives an upper bound ...
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   263
    "
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   264
    totalLength := 0.
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   265
    sepCnt := sepCharacter notNil ifTrue:[1] ifFalse:[0].
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   266
293
31df3850e98c *** empty log message ***
claus
parents: 282
diff changeset
   267
    idx1 := firstLine.
31df3850e98c *** empty log message ***
claus
parents: 282
diff changeset
   268
    idx2 := lastLine.
31df3850e98c *** empty log message ***
claus
parents: 282
diff changeset
   269
    idx1 to:idx2 do:[:lineIndex |
260
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   270
	lineString := self at:lineIndex.
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   271
	lineString isNil ifTrue:[
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   272
	    totalLength := totalLength + sepCnt
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   273
	] ifFalse: [
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   274
	    totalLength := totalLength + lineString size + sepCnt
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   275
	].
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   276
    ].
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   277
    endCharacter isNil ifTrue:[
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   278
	totalLength := totalLength - 1
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   279
    ].
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   280
    spaces := '        '.
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   281
    newString := String new:totalLength.
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   282
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   283
    "
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   284
     now, replace ...
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   285
    "
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   286
    pos := 1.
293
31df3850e98c *** empty log message ***
claus
parents: 282
diff changeset
   287
    idx1 to:idx2 do:[:lineIndex |
260
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   288
	|thisLen|
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   289
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   290
	lineString := self at:lineIndex.
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   291
	thisLen := lineString size.
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   292
	thisLen ~~ 0 ifTrue:[
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   293
	    compressTabs ifTrue:[
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   294
		"
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   295
		 mhmh: could use withTabs from String-class here,
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   296
		 but we should avoid creating too many temporary strings
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   297
		 (especially, since this method is typically used when converting
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   298
		 big texts such as when saving in the filebrowser ...).
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   299
		 Therefore, we convert tabs inline here doing a direct replace
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   300
		 in newString."
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   301
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   302
		idx := lineString findFirst:[:c | (c ~~ Character space)].
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   303
		nTabs := (idx-1) // 8.
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   304
		nTabs ~~ 0 ifTrue:[
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   305
		    "any tabs"
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   306
		    newString atAll:(pos to:pos+nTabs-1) put:(Character tab).
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   307
		    pos := pos + nTabs.
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   308
		    newString replaceFrom:pos with:lineString startingAt:(nTabs * 8 + 1).
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   309
		    pos := pos + thisLen - (nTabs * 8).
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   310
		] ifFalse:[
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   311
		    newString replaceFrom:pos with:lineString.
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   312
		    pos := pos + thisLen
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   313
		].
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   314
	    ] ifFalse:[
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   315
		newString replaceFrom:pos with:lineString.
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   316
		pos := pos + thisLen
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   317
	    ]
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   318
	].
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   319
	(sepCharacter notNil 
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   320
	and:[lineIndex ~~ lastLine]) ifTrue:[
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   321
	    newString at:pos put:sepCharacter.
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   322
	    pos := pos + 1
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   323
	] ifFalse:[
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   324
	    endCharacter notNil ifTrue:[
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   325
		newString at:pos put:endCharacter.
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   326
		pos := pos + 1
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   327
	    ]
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   328
	]
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   329
    ].
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   330
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   331
    "
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   332
     in case of tab compression, the result has to be
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   333
     cut to size ... sorry
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   334
    "
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   335
    pos ~~ totalLength ifTrue:[
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   336
	^ newString copyTo:(pos - 1)
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   337
    ].
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   338
    ^ newString
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   339
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   340
    "
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   341
     creating entries for searchpath:
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   342
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   343
     #('foo' 'bar' 'baz' '/foo/bar') 
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   344
	asStringWith:$: from:1 to:4 compressTabs:false final:nil 
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   345
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   346
     with trailing colon:
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   347
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   348
     #('foo' 'bar' 'baz' '/foo/bar') 
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   349
	asStringWith:$: from:1 to:4 compressTabs:false final:$: 
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   350
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   351
     concatenating all elements:
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   352
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   353
     #('foo' 'bar' 'baz') 
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   354
	asStringWith:nil from:1 to:3 compressTabs:false final:nil 
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   355
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   356
     creating a string from a collection of lines:
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   357
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   358
     #('foo' 'bar' 'baz') 
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   359
	asStringWith:(Character cr) from:1 to:3 compressTabs:false final:(Character cr) 
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   360
    "
379
5b5a130ccd09 revision added
claus
parents: 375
diff changeset
   361
!
5b5a130ccd09 revision added
claus
parents: 375
diff changeset
   362
5b5a130ccd09 revision added
claus
parents: 375
diff changeset
   363
decodeAsLiteralArray
5b5a130ccd09 revision added
claus
parents: 375
diff changeset
   364
    |cls|
5b5a130ccd09 revision added
claus
parents: 375
diff changeset
   365
5b5a130ccd09 revision added
claus
parents: 375
diff changeset
   366
    cls := Smalltalk at:(self first) ifAbsent:nil.
5b5a130ccd09 revision added
claus
parents: 375
diff changeset
   367
    cls isNil ifTrue:[
5b5a130ccd09 revision added
claus
parents: 375
diff changeset
   368
	^ self error:'unknown class in spec:' , self first.
5b5a130ccd09 revision added
claus
parents: 375
diff changeset
   369
    ].
5b5a130ccd09 revision added
claus
parents: 375
diff changeset
   370
    ^ cls new fromLiteralArrayEncoding:self.
5b5a130ccd09 revision added
claus
parents: 375
diff changeset
   371
5b5a130ccd09 revision added
claus
parents: 375
diff changeset
   372
    "
5b5a130ccd09 revision added
claus
parents: 375
diff changeset
   373
     #(Point 10 20) decodeAsLiteralArray  
5b5a130ccd09 revision added
claus
parents: 375
diff changeset
   374
     #(Rectangle 100 200 400 500) decodeAsLiteralArray 
5b5a130ccd09 revision added
claus
parents: 375
diff changeset
   375
    "
422
claus
parents: 384
diff changeset
   376
!
claus
parents: 384
diff changeset
   377
claus
parents: 384
diff changeset
   378
literalArrayEncoding
claus
parents: 384
diff changeset
   379
    ^ (self collect:[:el | el literalArrayEncoding]) asArray
claus
parents: 384
diff changeset
   380
claus
parents: 384
diff changeset
   381
    "
claus
parents: 384
diff changeset
   382
     (Array with:(Color red:50 green:50 blue:50)
claus
parents: 384
diff changeset
   383
	    with:(1 @ 2)
claus
parents: 384
diff changeset
   384
     ) literalArrayEncoding   
claus
parents: 384
diff changeset
   385
    "
260
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   386
! !
cefb485445a7 *** empty log message ***
claus
parents: 252
diff changeset
   387
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   388
!SequenceableCollection methodsFor:'comparing'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   389
a27a279701f8 Initial revision
claus
parents:
diff changeset
   390
= aCollection
a27a279701f8 Initial revision
claus
parents:
diff changeset
   391
    "return true if the receiver and aCollection represent collections
a27a279701f8 Initial revision
claus
parents:
diff changeset
   392
     with equal contents."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   393
a27a279701f8 Initial revision
claus
parents:
diff changeset
   394
    |index "{ Class: SmallInteger }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   395
     stop  "{ Class: SmallInteger }" |
a27a279701f8 Initial revision
claus
parents:
diff changeset
   396
a27a279701f8 Initial revision
claus
parents:
diff changeset
   397
    (aCollection == self) ifTrue:[^true].
359
claus
parents: 356
diff changeset
   398
    (aCollection isSequenceable) ifFalse:[^false].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   399
a27a279701f8 Initial revision
claus
parents:
diff changeset
   400
    stop := self size.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   401
    stop == (aCollection size) ifFalse:[^false].
61
claus
parents: 44
diff changeset
   402
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   403
    index := 1.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   404
    [index <= stop] whileTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   405
	(self at:index) = (aCollection at:index) ifFalse:[^false].
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   406
	index := index + 1
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   407
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   408
    ^ true
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   409
69
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
   410
    "
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
   411
     #(1 2 3 4 5) = #(1 2 3 4 5)                        
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
   412
     #($1 $2 $3 $4 $5) = #(1 2 3 4 5)                   
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
   413
     #($1 $2 $3 $4 $5) = '12345'                       
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
   414
     #($1 $2 $3 $4 $5) = '54321' asSortedCollection   
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
   415
    "
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
   416
!
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
   417
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
   418
hash
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
   419
    "return a hash key for the receiver"
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
   420
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
   421
    "this hash is stupid - but for larger collections, the hashing
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
   422
     time can become much bigger than the time lost in added probing.
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
   423
     Time will show ..."
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
   424
375
claus
parents: 368
diff changeset
   425
    ^ ((self at:1 ifAbsent:[0]) hash * self size) bitAnd:16r3FFFFFFF
69
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
   426
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
   427
    "
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
   428
     #(1 2 3 4 5) hash
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
   429
     #(1 2 3 4 5.0) asOrderedCollection hash
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
   430
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   431
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   432
a27a279701f8 Initial revision
claus
parents:
diff changeset
   433
startsWith:aCollection
a27a279701f8 Initial revision
claus
parents:
diff changeset
   434
    "return true, if the receivers first elements match those
a27a279701f8 Initial revision
claus
parents:
diff changeset
   435
     of aCollection"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   436
a27a279701f8 Initial revision
claus
parents:
diff changeset
   437
    |index "{ Class: SmallInteger }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   438
     stop  "{ Class: SmallInteger }" |
a27a279701f8 Initial revision
claus
parents:
diff changeset
   439
a27a279701f8 Initial revision
claus
parents:
diff changeset
   440
    (aCollection == self) ifTrue:[^true].
359
claus
parents: 356
diff changeset
   441
    (aCollection isSequenceable) ifFalse:[^false].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   442
a27a279701f8 Initial revision
claus
parents:
diff changeset
   443
    stop := aCollection size.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   444
    stop > self size ifTrue:[^false].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   445
a27a279701f8 Initial revision
claus
parents:
diff changeset
   446
    index := 1.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   447
    [index <= stop] whileTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   448
	(self at:index) = (aCollection at:index) ifFalse:[^false].
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   449
	index := index + 1
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   450
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   451
    ^ true
a27a279701f8 Initial revision
claus
parents:
diff changeset
   452
69
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
   453
    "
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
   454
     'abcde' startsWith:#($a $b $c)
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
   455
     #[1 2 3 4] startsWith:#(1 2 3)
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
   456
     #(1 2 3 4) asOrderedCollection startsWith:#(1 2 3)
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
   457
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   458
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   459
a27a279701f8 Initial revision
claus
parents:
diff changeset
   460
endsWith:aCollection
a27a279701f8 Initial revision
claus
parents:
diff changeset
   461
    "return true, if the receivers last elements match those
a27a279701f8 Initial revision
claus
parents:
diff changeset
   462
     of aCollection"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   463
a27a279701f8 Initial revision
claus
parents:
diff changeset
   464
    |index1 "{ Class: SmallInteger }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   465
     index2 "{ Class: SmallInteger }" 
61
claus
parents: 44
diff changeset
   466
     stop   "{ Class: SmallInteger }" 
claus
parents: 44
diff changeset
   467
     sz     "{ Class: SmallInteger }"|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   468
61
claus
parents: 44
diff changeset
   469
    (aCollection == self) ifTrue:[^ true].
359
claus
parents: 356
diff changeset
   470
    (aCollection isSequenceable) ifFalse:[^ false].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   471
a27a279701f8 Initial revision
claus
parents:
diff changeset
   472
    stop := aCollection size.
61
claus
parents: 44
diff changeset
   473
    sz := self size.
claus
parents: 44
diff changeset
   474
    stop > sz ifTrue:[^false].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   475
61
claus
parents: 44
diff changeset
   476
    index1 := sz.
13
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
   477
    index2 := stop.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   478
    [index2 > 0] whileTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   479
	(self at:index1) = (aCollection at:index2) ifFalse:[^ false].
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   480
	index1 := index1 - 1.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   481
	index2 := index2 - 1
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   482
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   483
    ^ true
a27a279701f8 Initial revision
claus
parents:
diff changeset
   484
69
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
   485
    "
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
   486
     'abcde' endsWith:#($d $e)
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
   487
     #[1 2 3 4] endsWith:#(3 4)    
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
   488
     #(1 2 3 4) asOrderedCollection endsWith:#(3 4)
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
   489
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   490
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   491
a27a279701f8 Initial revision
claus
parents:
diff changeset
   492
!SequenceableCollection methodsFor:'copying'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   493
a27a279701f8 Initial revision
claus
parents:
diff changeset
   494
, aCollection
a27a279701f8 Initial revision
claus
parents:
diff changeset
   495
    "return a new collection formed from concatenating the receiver with
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   496
     the argument. The class of the new collection is determined by the
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   497
     receivers class, so mixing classes is possible, if the second collections
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   498
     elements can be stored into instances of the receivers class."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   499
a27a279701f8 Initial revision
claus
parents:
diff changeset
   500
    |newCollection 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   501
     mySize    "{ Class: SmallInteger }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   502
     newSize   "{ Class: SmallInteger }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   503
     otherSize "{ Class: SmallInteger }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   504
     dstIndex  "{ Class: SmallInteger }"|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   505
a27a279701f8 Initial revision
claus
parents:
diff changeset
   506
    mySize := self size.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   507
    otherSize := aCollection size.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   508
    newSize := mySize + otherSize.
202
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   509
252
   510
    newCollection := self copyEmptyAndGrow:newSize.   "must grow, otherwise replace fails"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   511
a27a279701f8 Initial revision
claus
parents:
diff changeset
   512
    newCollection replaceFrom:1 to:mySize with:self startingAt:1.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   513
    dstIndex := mySize + 1.
202
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   514
    aCollection isSequenceable ifTrue:[
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   515
	"
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   516
	 yes, aCollection has indexed elements
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   517
	"
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   518
	newCollection replaceFrom:dstIndex to:newSize
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   519
			     with:aCollection startingAt:1.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   520
	^ newCollection
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   521
    ] ifFalse:[
202
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   522
	"
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   523
	 no, enumerate aCollection
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   524
	"
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   525
	aCollection do:[:element |
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   526
	    newCollection at:dstIndex put:element.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   527
	    dstIndex := dstIndex + 1
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   528
	]
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   529
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   530
    ^ newCollection
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   531
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   532
    "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   533
     #($a $b $c) , #(1 2 3)
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   534
     #($a $b $c) , '123'
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   535
     'abc' , '123'
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   536
     'abc' , #($q $w $e $r $t $y) asSortedCollection
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   537
     'abc' , #(1 2 3 4 5)"  "-- will fail, since strings cannot store integers
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   538
     'abc' asArray , #(1 2 3 4 5)
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   539
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   540
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   541
a27a279701f8 Initial revision
claus
parents:
diff changeset
   542
copyWith:newElement
233
98f588af201a comments
claus
parents: 202
diff changeset
   543
    "return a new collection containing the receivers elements
98f588af201a comments
claus
parents: 202
diff changeset
   544
     and the single new element, newElement. 
98f588af201a comments
claus
parents: 202
diff changeset
   545
     This is different from concatentation, which expects another collection
98f588af201a comments
claus
parents: 202
diff changeset
   546
     as argument, but equivalent to copy-and-addLast."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   547
a27a279701f8 Initial revision
claus
parents:
diff changeset
   548
    |newCollection mySize newSize|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   549
a27a279701f8 Initial revision
claus
parents:
diff changeset
   550
    mySize := self size.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   551
    newSize := mySize + 1.
252
   552
    newCollection := self copyEmptyAndGrow:newSize.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   553
    newCollection replaceFrom:1 to:mySize with:self startingAt:1.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   554
    newCollection at:newSize put:newElement.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   555
    ^newCollection
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   556
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   557
    "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   558
     #(1 2 3 4 5) copyWith:$a
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   559
     'abcdefg' copyWith:$h
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   560
     'abcdefg' copyWith:'123'   -- will fail: string cannot be stored into string
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   561
     'abcdefg' copyWith:1       -- will fail: integer cannot be stored into string
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   562
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   563
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   564
61
claus
parents: 44
diff changeset
   565
copyWithoutFirst:elementToSkip
claus
parents: 44
diff changeset
   566
    "return a new collection consisting of a copy of the receivers elements
claus
parents: 44
diff changeset
   567
     without the first elementToSkip, if it was present. 
claus
parents: 44
diff changeset
   568
     No error is reported, if elementToSkip is not in the collection."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   569
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   570
    |copy skipIndex sz|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   571
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   572
    skipIndex := self indexOf:elementToSkip startingAt:1.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   573
    (skipIndex == 0) ifTrue:[^ self copy].
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   574
202
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   575
    sz := self size - 1.
252
   576
    copy := self copyEmptyAndGrow:sz.
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   577
    copy replaceFrom:1 to:(skipIndex - 1) with:self startingAt:1.
202
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   578
    copy replaceFrom:skipIndex to:sz with:self startingAt:(skipIndex + 1).
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   579
    ^ copy
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   580
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   581
    "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   582
     #($a $b $c $d $e $f $g) copyWithoutFirst:$d
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   583
     #($a $b $c $d $e $f $g) copyWithoutFirst:$x
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   584
     #(90 80 70 60 50) copyWithoutFirst:70
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   585
     #(90 80 70 80 60 45 80 50) copyWithoutFirst:80
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   586
    "
61
claus
parents: 44
diff changeset
   587
!
claus
parents: 44
diff changeset
   588
claus
parents: 44
diff changeset
   589
copyWithout:elementToSkip
claus
parents: 44
diff changeset
   590
    "return a new collection consisting of a copy of the receiver, with
claus
parents: 44
diff changeset
   591
     ALL elements equal to elementToSkip are left out.
claus
parents: 44
diff changeset
   592
     No error is reported, if elementToSkip is not in the collection."
claus
parents: 44
diff changeset
   593
293
31df3850e98c *** empty log message ***
claus
parents: 282
diff changeset
   594
    |n         "{ Class: SmallInteger }"
31df3850e98c *** empty log message ***
claus
parents: 282
diff changeset
   595
     sz        "{ Class: SmallInteger }"
31df3850e98c *** empty log message ***
claus
parents: 282
diff changeset
   596
     srcIndex  "{ Class: SmallInteger }"
31df3850e98c *** empty log message ***
claus
parents: 282
diff changeset
   597
     dstIndex  "{ Class: SmallInteger }"
31df3850e98c *** empty log message ***
claus
parents: 282
diff changeset
   598
     skipIndex "{ Class: SmallInteger }"
31df3850e98c *** empty log message ***
claus
parents: 282
diff changeset
   599
     copy l|
61
claus
parents: 44
diff changeset
   600
claus
parents: 44
diff changeset
   601
    "the code below may look like overkill, 
claus
parents: 44
diff changeset
   602
     however, for big collections its better to move data
claus
parents: 44
diff changeset
   603
     around in big chunks"
claus
parents: 44
diff changeset
   604
claus
parents: 44
diff changeset
   605
    n := self occurrencesOf:elementToSkip.
claus
parents: 44
diff changeset
   606
    n == 0 ifTrue:[^ self copy].
claus
parents: 44
diff changeset
   607
claus
parents: 44
diff changeset
   608
    sz := self size.
252
   609
    copy := self copyEmptyAndGrow:(sz - n).
61
claus
parents: 44
diff changeset
   610
claus
parents: 44
diff changeset
   611
    srcIndex := 1.
claus
parents: 44
diff changeset
   612
    dstIndex := 1.
claus
parents: 44
diff changeset
   613
claus
parents: 44
diff changeset
   614
    n timesRepeat:[
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   615
	skipIndex := self indexOf:elementToSkip startingAt:srcIndex.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   616
	l := skipIndex - srcIndex.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   617
	l ~~ 0 ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   618
	    copy replaceFrom:dstIndex to:(dstIndex + l - 1) 
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   619
			with:self startingAt:srcIndex.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   620
	    dstIndex := dstIndex + l
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   621
	].
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   622
	srcIndex := skipIndex + 1
61
claus
parents: 44
diff changeset
   623
    ].
claus
parents: 44
diff changeset
   624
    l := sz - srcIndex.
claus
parents: 44
diff changeset
   625
    copy replaceFrom:dstIndex to:(dstIndex + l)
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   626
		with:self startingAt:srcIndex.
61
claus
parents: 44
diff changeset
   627
    ^ copy
claus
parents: 44
diff changeset
   628
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   629
    "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   630
     #($a $b $c $d $e $f $g) copyWithout:$d
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   631
     #($a $b $c $d $e $f $g) copyWithout:$a
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   632
     #($a $b $c $d $e $f $g) copyWithout:$g
202
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   633
     'abcdefghi' copyWithout:$h    
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   634
     'abcdefg' copyWithout:$h       
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   635
     #($a $b $c $a $a $d $e $a $f $g) copyWithout:$a
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   636
     #($a $b $c $d $e $f $g) copyWithout:$x
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   637
     #(90 80 70 60 50) copyWithout:70
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   638
     #(90 80 70 80 60 45 80 50) copyWithout:80
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   639
    "
61
claus
parents: 44
diff changeset
   640
!
claus
parents: 44
diff changeset
   641
claus
parents: 44
diff changeset
   642
copyWithoutIndex:omitIndex
claus
parents: 44
diff changeset
   643
    "return a new collection consisting of receivers elements
claus
parents: 44
diff changeset
   644
     without the argument stored at omitIndex"
claus
parents: 44
diff changeset
   645
claus
parents: 44
diff changeset
   646
    |copy sz|
claus
parents: 44
diff changeset
   647
202
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   648
    sz := self size - 1.
252
   649
    copy := self copyEmptyAndGrow:sz.
293
31df3850e98c *** empty log message ***
claus
parents: 282
diff changeset
   650
    copy replaceFrom:1 to:(omitIndex - 1) with:self startingAt:1.
31df3850e98c *** empty log message ***
claus
parents: 282
diff changeset
   651
    copy replaceFrom:omitIndex to:sz with:self startingAt:(omitIndex + 1).
61
claus
parents: 44
diff changeset
   652
    ^ copy
claus
parents: 44
diff changeset
   653
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   654
    "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   655
     #(1 2 3 4 5 6 7 8 9 0) copyWithoutIndex:3
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   656
     'abcdefghijkl' copyWithoutIndex:5
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   657
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   658
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   659
a27a279701f8 Initial revision
claus
parents:
diff changeset
   660
copyFrom:start to:stop
a27a279701f8 Initial revision
claus
parents:
diff changeset
   661
    "return a new collection consisting of receivers elements
a27a279701f8 Initial revision
claus
parents:
diff changeset
   662
     between start and stop"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   663
a27a279701f8 Initial revision
claus
parents:
diff changeset
   664
    |newCollection newSize|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   665
a27a279701f8 Initial revision
claus
parents:
diff changeset
   666
    newSize := stop - start + 1.
252
   667
    newCollection := self copyEmptyAndGrow:newSize.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   668
    newCollection replaceFrom:1 to:newSize with:self startingAt:start.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   669
    ^ newCollection
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   670
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   671
    "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   672
     #($a $b $c $d $e $f $g) copyFrom:2 to:5
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   673
     '1234567890' copyFrom:2 to:5
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   674
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   675
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   676
a27a279701f8 Initial revision
claus
parents:
diff changeset
   677
copyFrom:start
a27a279701f8 Initial revision
claus
parents:
diff changeset
   678
    "return a new collection consisting of receivers elements
a27a279701f8 Initial revision
claus
parents:
diff changeset
   679
     from start to the end of the collection"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   680
a27a279701f8 Initial revision
claus
parents:
diff changeset
   681
    ^ self copyFrom:start to:(self size)
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   682
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   683
    "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   684
     #($a $b $c $d $e $f $g) copyFrom:2
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   685
     '1234567890' copyFrom:2
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   686
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   687
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   688
a27a279701f8 Initial revision
claus
parents:
diff changeset
   689
copyTo:stop
a27a279701f8 Initial revision
claus
parents:
diff changeset
   690
    "return a new collection consisting of receivers elements
61
claus
parents: 44
diff changeset
   691
     from 1 up to (including) index stop"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   692
a27a279701f8 Initial revision
claus
parents:
diff changeset
   693
    ^ self copyFrom:1 to:stop
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   694
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   695
    "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   696
     #($a $b $c $d $e $f $g) copyTo:5
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   697
     '1234567890' copyTo:4
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   698
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   699
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   700
61
claus
parents: 44
diff changeset
   701
copyFirst:count
claus
parents: 44
diff changeset
   702
    "return a new collection consisting of the receivers first count
claus
parents: 44
diff changeset
   703
     elements - this is just a rename of copyTo: - for compatibility."
claus
parents: 44
diff changeset
   704
claus
parents: 44
diff changeset
   705
    ^ self copyFrom:1 to:count
claus
parents: 44
diff changeset
   706
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   707
    "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   708
     #($a $b $c $d $e $f $g) copyFirst:5
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   709
     '1234567890' copyFirst:4
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   710
    "
61
claus
parents: 44
diff changeset
   711
!
claus
parents: 44
diff changeset
   712
claus
parents: 44
diff changeset
   713
copyLast:count
claus
parents: 44
diff changeset
   714
    "return a new collection consisting of the receivers last count
claus
parents: 44
diff changeset
   715
     elements."
claus
parents: 44
diff changeset
   716
claus
parents: 44
diff changeset
   717
    |sz|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   718
61
claus
parents: 44
diff changeset
   719
    sz := self size.
claus
parents: 44
diff changeset
   720
    ^ self copyFrom:(sz - count + 1) to:sz
claus
parents: 44
diff changeset
   721
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   722
    "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   723
     #($a $b $c $d $e $f $g) copyLast:5
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   724
     '1234567890' copyLast:4
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   725
    "
61
claus
parents: 44
diff changeset
   726
!
claus
parents: 44
diff changeset
   727
202
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   728
copyWithoutLast:count
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   729
    "return a new collection consisting of the receivers elements
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   730
     except the last count elements."
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   731
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   732
    |sz|
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   733
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   734
    sz := self size.
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   735
    ^ self copyTo:(sz - count)
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   736
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   737
    "
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   738
     #($a $b $c $d $e $f $g) copyWithoutLast:5 
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   739
     '1234567890' copyWithoutLast:4 
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   740
    "
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   741
!
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   742
61
claus
parents: 44
diff changeset
   743
copyUpTo:element
claus
parents: 44
diff changeset
   744
    "return a new collection consisting of the receiver elements
308
f04744ef7b5d *** empty log message ***
claus
parents: 302
diff changeset
   745
     up-to (but excluding) the first occurence of element;
f04744ef7b5d *** empty log message ***
claus
parents: 302
diff changeset
   746
     or to the end, if element is not included"
61
claus
parents: 44
diff changeset
   747
claus
parents: 44
diff changeset
   748
    |idx|
claus
parents: 44
diff changeset
   749
claus
parents: 44
diff changeset
   750
    idx := self indexOf:element.
308
f04744ef7b5d *** empty log message ***
claus
parents: 302
diff changeset
   751
    idx == 0 ifTrue:[^ self copy].    "question: is this ok?"
202
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   752
    idx == 1 ifTrue:[^ self copyEmpty].
61
claus
parents: 44
diff changeset
   753
    ^ self copyFrom:1 to:(idx-1)
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   754
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   755
    "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   756
     #($a $b $c $d $e $f $g) copyUpTo:$d
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   757
     '1234567890' copyUpTo:$5
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   758
     '1234567890' copyUpTo:$a
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   759
     '1234567890' copyUpTo:$1
308
f04744ef7b5d *** empty log message ***
claus
parents: 302
diff changeset
   760
     '123456789' copyUpTo:$0
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   761
    "
61
claus
parents: 44
diff changeset
   762
!
claus
parents: 44
diff changeset
   763
claus
parents: 44
diff changeset
   764
copyThrough:element
claus
parents: 44
diff changeset
   765
    "return a new collection consisting of the receiver elements
claus
parents: 44
diff changeset
   766
     up-to (AND including) the first occurence of element."
claus
parents: 44
diff changeset
   767
claus
parents: 44
diff changeset
   768
    |idx|
claus
parents: 44
diff changeset
   769
claus
parents: 44
diff changeset
   770
    idx := self indexOf:element.
claus
parents: 44
diff changeset
   771
    idx == 0 ifTrue:[^ nil].    "question: is this ok?"
claus
parents: 44
diff changeset
   772
    ^ self copyFrom:1 to:idx
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   773
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   774
    "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   775
     #($a $b $c $d $e $f $g) copyThrough:$d
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   776
     '1234567890' copyThrough:$5
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   777
     '1234567890' copyThrough:$a
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   778
     '1234567890' copyThrough:$1
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   779
    "
61
claus
parents: 44
diff changeset
   780
!
claus
parents: 44
diff changeset
   781
claus
parents: 44
diff changeset
   782
copyReplaceFrom:startIndex to:endIndex with:aCollection
claus
parents: 44
diff changeset
   783
    "return a copy of the receiver, where the elements from startIndex to
claus
parents: 44
diff changeset
   784
     endIndex have been replaced by the elements of aCollection"
claus
parents: 44
diff changeset
   785
202
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   786
    |newColl sz replSize|
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   787
61
claus
parents: 44
diff changeset
   788
    replSize := aCollection size.
202
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
   789
    sz := self size - (endIndex - startIndex + 1) + replSize.
252
   790
    newColl := self copyEmptyAndGrow:sz.
61
claus
parents: 44
diff changeset
   791
    newColl replaceFrom:1 to:(startIndex - 1) with:self.
claus
parents: 44
diff changeset
   792
    newColl replaceFrom:startIndex with:aCollection.
claus
parents: 44
diff changeset
   793
    newColl replaceFrom:(startIndex + replSize) with:self startingAt:(endIndex + 1).
claus
parents: 44
diff changeset
   794
    ^ newColl
claus
parents: 44
diff changeset
   795
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   796
    "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   797
     #(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
   798
     'hello world' copyReplaceFrom:6 to:6 with:' there, '  
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   799
    "
186
a4c3032fc825 *** empty log message ***
claus
parents: 159
diff changeset
   800
!
a4c3032fc825 *** empty log message ***
claus
parents: 159
diff changeset
   801
a4c3032fc825 *** empty log message ***
claus
parents: 159
diff changeset
   802
copyReplaceFrom:startIndex with:aCollection
a4c3032fc825 *** empty log message ***
claus
parents: 159
diff changeset
   803
    "return a copy of the receiver, where the elements from startIndex to
a4c3032fc825 *** empty log message ***
claus
parents: 159
diff changeset
   804
     the end have been replaced by the elements of aCollection"
a4c3032fc825 *** empty log message ***
claus
parents: 159
diff changeset
   805
a4c3032fc825 *** empty log message ***
claus
parents: 159
diff changeset
   806
    ^ self copyReplaceFrom:startIndex to:(self size) with:aCollection
a4c3032fc825 *** empty log message ***
claus
parents: 159
diff changeset
   807
a4c3032fc825 *** empty log message ***
claus
parents: 159
diff changeset
   808
    "
a4c3032fc825 *** empty log message ***
claus
parents: 159
diff changeset
   809
     #(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
   810
     'hello world' copyReplaceFrom:7 with:'smalltalk fan'  
a4c3032fc825 *** empty log message ***
claus
parents: 159
diff changeset
   811
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   812
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   813
a27a279701f8 Initial revision
claus
parents:
diff changeset
   814
!SequenceableCollection methodsFor:'filling and replacing'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   815
a27a279701f8 Initial revision
claus
parents:
diff changeset
   816
from:index1 to:index2 put:anObject
a27a279701f8 Initial revision
claus
parents:
diff changeset
   817
    "replace the elements from index1 to index2 of the collection
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   818
     by the argument, anObject.
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   819
     Notice: This operation modifies the receiver, NOT a copy;
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   820
     therefore the change may affect all others referencing the receiver."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   821
a27a279701f8 Initial revision
claus
parents:
diff changeset
   822
    |index "{ Class: SmallInteger }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   823
     end   "{ Class: SmallInteger }"|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   824
a27a279701f8 Initial revision
claus
parents:
diff changeset
   825
    index := index1.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   826
    end := index2.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   827
    [index <= end] whileTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   828
	self at:index put:anObject.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   829
	index := index + 1
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   830
    ]
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   831
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   832
    "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   833
     #(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
   834
     'abcdefghijkl' from:3 to:6 put:$X
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   835
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   836
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   837
a27a279701f8 Initial revision
claus
parents:
diff changeset
   838
atAllPut:anObject
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   839
    "replace all elements of the collection by the argument, anObject.
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   840
     Notice: This operation modifies the receiver, NOT a copy;
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   841
     therefore the change may affect all others referencing the receiver."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   842
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
   843
    self from:1 to:(self size) put:anObject
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   844
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   845
    "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   846
     (Array new:10) atAllPut:1
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   847
     (String new:10) atAllPut:$a
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   848
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   849
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   850
a27a279701f8 Initial revision
claus
parents:
diff changeset
   851
atAll:indexCollection put:anObject
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   852
    "put anObject into all indexes from indexCollection in the receiver.
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   853
     Notice: This operation modifies the receiver, NOT a copy;
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   854
     therefore the change may affect all others referencing the receiver."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   855
a27a279701f8 Initial revision
claus
parents:
diff changeset
   856
    indexCollection do:[:index | self at:index put:anObject]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   857
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   858
    "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   859
     (Array new:10) atAll:(1 to:5) put:0
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   860
     (Array new:10) atAll:#(1 5 6 9) put:0
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   861
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   862
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   863
362
claus
parents: 360
diff changeset
   864
replaceAll:oldObject with:newObject
claus
parents: 360
diff changeset
   865
    "ST-80 compatibility: an alias for #replaceAll:by:"
claus
parents: 360
diff changeset
   866
claus
parents: 360
diff changeset
   867
    ^ self replaceAll:oldObject by:newObject
claus
parents: 360
diff changeset
   868
!
claus
parents: 360
diff changeset
   869
claus
parents: 360
diff changeset
   870
replaceAll:oldObject with:newObject from:startIndex to:stopIndex
claus
parents: 360
diff changeset
   871
    "ST-80 compatibility: an alias for #replaceAll:by:from:to:"
claus
parents: 360
diff changeset
   872
claus
parents: 360
diff changeset
   873
    ^ self replaceAll:oldObject by:newObject from:startIndex to:stopIndex
claus
parents: 360
diff changeset
   874
!
claus
parents: 360
diff changeset
   875
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   876
replaceAll:oldObject by:newObject
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   877
    "replace all oldObjects by newObject in the receiver.
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   878
     Notice: This operation modifies the receiver, NOT a copy;
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   879
     therefore the change may affect all others referencing the receiver."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   880
362
claus
parents: 360
diff changeset
   881
    ^ self replaceAll:oldObject by:newObject from:1 to:self size
claus
parents: 360
diff changeset
   882
claus
parents: 360
diff changeset
   883
    "
claus
parents: 360
diff changeset
   884
     '123123abc123' replaceAll:$1 by:$*  
claus
parents: 360
diff changeset
   885
    "
claus
parents: 360
diff changeset
   886
!
293
31df3850e98c *** empty log message ***
claus
parents: 282
diff changeset
   887
362
claus
parents: 360
diff changeset
   888
replaceAll:oldObject by:newObject from:startIndex to:stopIndex
claus
parents: 360
diff changeset
   889
    "replace all oldObjects found between startIndex and endIndex,
claus
parents: 360
diff changeset
   890
     by newObject in the receiver.
claus
parents: 360
diff changeset
   891
     Notice: This operation modifies the receiver, NOT a copy;
claus
parents: 360
diff changeset
   892
     therefore the change may affect all others referencing the receiver."
claus
parents: 360
diff changeset
   893
claus
parents: 360
diff changeset
   894
    |start "{ Class: SmallInteger }"
claus
parents: 360
diff changeset
   895
     stop  "{ Class: SmallInteger }"|
claus
parents: 360
diff changeset
   896
claus
parents: 360
diff changeset
   897
    start := startIndex.
claus
parents: 360
diff changeset
   898
    stop := stopIndex.
claus
parents: 360
diff changeset
   899
    startIndex to:stopIndex do:[:index |
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   900
	(self at:index) = oldObject ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   901
	    self at:index put:newObject
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   902
	]
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   903
    ]
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   904
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   905
    "
362
claus
parents: 360
diff changeset
   906
     '123123abc123' replaceAll:$1 by:$*              
claus
parents: 360
diff changeset
   907
     '123123abc123' replaceAll:$1 by:$* from:1 to:6   
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   908
    "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   909
!
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   910
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   911
replaceAny:aCollection by:newObject
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   912
    "replace all elements, which are in aCollection by newObject in the receiver.
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   913
     Notice: This operation modifies the receiver, NOT a copy;
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   914
     therefore the change may affect all others referencing the receiver."
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   915
362
claus
parents: 360
diff changeset
   916
    ^ self replaceAny:aCollection by:newObject from:1 to:self size 
claus
parents: 360
diff changeset
   917
claus
parents: 360
diff changeset
   918
    "
claus
parents: 360
diff changeset
   919
     '123123abc123' replaceAny:#($1 $2) by:$*      
claus
parents: 360
diff changeset
   920
     #('foo' 'bar' 'foo' 'baz' foo 1 2 3) replaceAny:#(foo 1) by:'*'  
claus
parents: 360
diff changeset
   921
    "
claus
parents: 360
diff changeset
   922
!
293
31df3850e98c *** empty log message ***
claus
parents: 282
diff changeset
   923
362
claus
parents: 360
diff changeset
   924
replaceAny:aCollection by:newObject from:startIndex to:stopIndex
claus
parents: 360
diff changeset
   925
    "replace all elements within a range,
claus
parents: 360
diff changeset
   926
     which are in contained in aCollection by newObject.
claus
parents: 360
diff changeset
   927
     Notice: This operation modifies the receiver, NOT a copy;
claus
parents: 360
diff changeset
   928
     therefore the change may affect all others referencing the receiver."
claus
parents: 360
diff changeset
   929
claus
parents: 360
diff changeset
   930
    |start "{ Class: SmallInteger }"
claus
parents: 360
diff changeset
   931
     stop "{ Class: SmallInteger }"|
claus
parents: 360
diff changeset
   932
claus
parents: 360
diff changeset
   933
    start := startIndex.
claus
parents: 360
diff changeset
   934
    stop := stopIndex.
claus
parents: 360
diff changeset
   935
    startIndex to:stopIndex do:[:index |
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   936
	(aCollection includes:(self at:index)) ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   937
	    self at:index put:newObject
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   938
	]
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   939
    ]
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   940
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   941
    "
362
claus
parents: 360
diff changeset
   942
     '123123abc123' replaceAny:#($1 $2) by:$* from:1 to:6      
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   943
     #('foo' 'bar' 'foo' 'baz' foo 1 2 3) replaceAny:#(foo 1) by:'*'  
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   944
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   945
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   946
a27a279701f8 Initial revision
claus
parents:
diff changeset
   947
replaceFrom:start with:replacementCollection
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   948
    "replace elements in the receiver starting at start,
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   949
     with elements taken from replacementCollection starting at 1
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   950
     to the end of replacementCollection.
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   951
     Notice: This operation modifies the receiver, NOT a copy;
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   952
     therefore the change may affect all others referencing the receiver."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   953
a27a279701f8 Initial revision
claus
parents:
diff changeset
   954
    ^ self replaceFrom:start 
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   955
		    to:(start + replacementCollection size - 1)
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   956
		  with:replacementCollection
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   957
	    startingAt:1
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   958
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   959
    "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   960
     '1234567890' replaceFrom:5 with:'abc'
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   961
     #($a $b $c $d $e) replaceFrom:2 with:'123'
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   962
    "
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   963
!
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   964
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   965
replaceFrom:start with:replacementCollection startingAt:offset
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   966
    "replace elements in the receiver starting at start,
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   967
     with elements taken from replacementCollection starting at offset
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   968
     to the end of replacementCollection.
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   969
     Notice: This operation modifies the receiver, NOT a copy;
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   970
     therefore the change may affect all others referencing the receiver."
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   971
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   972
    ^ self replaceFrom:start 
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   973
		    to:(start + replacementCollection size - offset)
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   974
		  with:replacementCollection
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   975
	    startingAt:offset
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   976
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   977
    "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   978
     '1234567890' replaceFrom:5 with:'abcdef' startingAt:3
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   979
     #($a $b $c $d $e) replaceFrom:2 with:'12345' startingAt:4
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   980
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   981
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   982
a27a279701f8 Initial revision
claus
parents:
diff changeset
   983
replaceFrom:start to:stop with:replacementCollection
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   984
    "replace elements in the receiver between index start and stop,
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   985
     with elements taken from replacementCollection starting at 1.
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   986
     Notice: This operation modifies the receiver, NOT a copy;
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
   987
     therefore the change may affect all others referencing the receiver."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   988
a27a279701f8 Initial revision
claus
parents:
diff changeset
   989
    ^ self replaceFrom:start
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   990
		    to:stop
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   991
		  with:replacementCollection
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
   992
	    startingAt:1
61
claus
parents: 44
diff changeset
   993
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   994
    "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   995
     '1234567890' replaceFrom:5 to:7 with:'abcdef'
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   996
     #($a $b $c $d $e) replaceFrom:2 to:3 with:'12345'
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   997
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   998
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   999
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1000
replaceFrom:start to:stop with:replacementCollection startingAt:repStart
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
  1001
    "replace elements in the receiver between index start and stop,
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
  1002
     with elements  taken from replacementCollection starting at repStart.
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
  1003
     Notice: This operation modifies the receiver, NOT a copy;
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
  1004
     therefore the change may affect all others referencing the receiver."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1005
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1006
    |srcIndex "{ Class: SmallInteger }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1007
     dstIndex "{ Class: SmallInteger }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1008
     end      "{ Class: SmallInteger }" |
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1009
293
31df3850e98c *** empty log message ***
claus
parents: 282
diff changeset
  1010
    (repStart < start) ifTrue:[
31df3850e98c *** empty log message ***
claus
parents: 282
diff changeset
  1011
	" must do reverse copy "
31df3850e98c *** empty log message ***
claus
parents: 282
diff changeset
  1012
	srcIndex := repStart + (stop - start).
31df3850e98c *** empty log message ***
claus
parents: 282
diff changeset
  1013
	dstIndex := stop.
31df3850e98c *** empty log message ***
claus
parents: 282
diff changeset
  1014
	end := start.
31df3850e98c *** empty log message ***
claus
parents: 282
diff changeset
  1015
	[dstIndex >= end] whileTrue:[
31df3850e98c *** empty log message ***
claus
parents: 282
diff changeset
  1016
	    self at:dstIndex put:(replacementCollection at:srcIndex).
31df3850e98c *** empty log message ***
claus
parents: 282
diff changeset
  1017
	    srcIndex := srcIndex - 1.
31df3850e98c *** empty log message ***
claus
parents: 282
diff changeset
  1018
	    dstIndex := dstIndex - 1
31df3850e98c *** empty log message ***
claus
parents: 282
diff changeset
  1019
	].
31df3850e98c *** empty log message ***
claus
parents: 282
diff changeset
  1020
	^ self
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1021
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1022
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1023
    srcIndex := repStart.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1024
    dstIndex := start.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1025
    end := stop.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1026
    [dstIndex <= end] whileTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1027
	self at:dstIndex put:(replacementCollection at:srcIndex).
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1028
	srcIndex := srcIndex + 1.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1029
	dstIndex := dstIndex + 1
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1030
    ]
61
claus
parents: 44
diff changeset
  1031
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1032
    "
282
94f5c3a6230d *** empty log message ***
claus
parents: 266
diff changeset
  1033
     '1234567890' replaceFrom:5 to:7 with:'abcdef' startingAt:3  
94f5c3a6230d *** empty log message ***
claus
parents: 266
diff changeset
  1034
     #($a $b $c $d $e) replaceFrom:2 to:3 with:'12345' startingAt:4 
94f5c3a6230d *** empty log message ***
claus
parents: 266
diff changeset
  1035
     #($a $b $c $d $e) asOrderedCollection replaceFrom:2 to:3 with:'12345' startingAt:4 
94f5c3a6230d *** empty log message ***
claus
parents: 266
diff changeset
  1036
94f5c3a6230d *** empty log message ***
claus
parents: 266
diff changeset
  1037
     |c|
94f5c3a6230d *** empty log message ***
claus
parents: 266
diff changeset
  1038
     c := #($a $b $c $d $e) asOrderedCollection.
94f5c3a6230d *** empty log message ***
claus
parents: 266
diff changeset
  1039
     c replaceFrom:2 to:3 with:c startingAt:4  
94f5c3a6230d *** empty log message ***
claus
parents: 266
diff changeset
  1040
94f5c3a6230d *** empty log message ***
claus
parents: 266
diff changeset
  1041
     |c|
94f5c3a6230d *** empty log message ***
claus
parents: 266
diff changeset
  1042
     c := #($a $b $c $d $e) asOrderedCollection.
94f5c3a6230d *** empty log message ***
claus
parents: 266
diff changeset
  1043
     c replaceFrom:4 to:5 with:c startingAt:2  
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1044
    "
61
claus
parents: 44
diff changeset
  1045
!
claus
parents: 44
diff changeset
  1046
claus
parents: 44
diff changeset
  1047
startingAt:sourceStart replaceElementsIn:destColl from:destStartIndex to:destEndIndex
claus
parents: 44
diff changeset
  1048
    "replace elements in destColl with elements from the receiver.
claus
parents: 44
diff changeset
  1049
     Notice: This operation modifies the destination collection, NOT a copy;
claus
parents: 44
diff changeset
  1050
     therefore the change may affect all others referencing this object."
claus
parents: 44
diff changeset
  1051
claus
parents: 44
diff changeset
  1052
    destColl replaceFrom:destStartIndex to:destEndIndex with:self startingAt:sourceStart
claus
parents: 44
diff changeset
  1053
claus
parents: 44
diff changeset
  1054
    "
claus
parents: 44
diff changeset
  1055
     |s|
claus
parents: 44
diff changeset
  1056
     s := 'abcdefghijklmnop'.
claus
parents: 44
diff changeset
  1057
     '1234567890' startingAt:1 replaceElementsIn:s from:1 to:3.
claus
parents: 44
diff changeset
  1058
     s'123defghijklmnop'
claus
parents: 44
diff changeset
  1059
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1060
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1061
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1062
!SequenceableCollection methodsFor:'adding & removing'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1063
61
claus
parents: 44
diff changeset
  1064
addFirst:anObject
claus
parents: 44
diff changeset
  1065
    "prepend the argument, anObject to the collection.
claus
parents: 44
diff changeset
  1066
     Return the argument, anObject.
claus
parents: 44
diff changeset
  1067
claus
parents: 44
diff changeset
  1068
     Notice, that this is modifies the receiver NOT a copy.
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1069
     Also note, that it may be a slow operation for some collections,
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1070
     due to the grow:-message, which is inefficient for fixed size 
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1071
     collections (i.e. for Strings and Arrays it is not recommened)."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1072
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1073
    |newSize|
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1074
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1075
    newSize := self size + 1.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1076
    self grow:newSize.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1077
    self replaceFrom:2 to:newSize with:self startingAt:1.
61
claus
parents: 44
diff changeset
  1078
    self at:1 put:anObject.
claus
parents: 44
diff changeset
  1079
    ^ anObject
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
  1080
61
claus
parents: 44
diff changeset
  1081
    "
claus
parents: 44
diff changeset
  1082
     |a| 
claus
parents: 44
diff changeset
  1083
     a:= #(1 2 3 4 5 6 7 8). 
claus
parents: 44
diff changeset
  1084
     a addFirst:'hello'. 
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1085
     a 
61
claus
parents: 44
diff changeset
  1086
    "
claus
parents: 44
diff changeset
  1087
    "
claus
parents: 44
diff changeset
  1088
     |c|
claus
parents: 44
diff changeset
  1089
     c := #(1 2 3 4 5 6 7 8) asOrderedCollection.
claus
parents: 44
diff changeset
  1090
     c addFirst:'hello'.
claus
parents: 44
diff changeset
  1091
     c
claus
parents: 44
diff changeset
  1092
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1093
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1094
61
claus
parents: 44
diff changeset
  1095
add:anObject
claus
parents: 44
diff changeset
  1096
    "append the argument, anObject to the collection.
claus
parents: 44
diff changeset
  1097
     Return the argument, anObject.
claus
parents: 44
diff changeset
  1098
claus
parents: 44
diff changeset
  1099
     Notice, that this is modifies the receiver NOT a copy.
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1100
     Also note, that it may be a slow operation for some collections,
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1101
     due to the grow:-message, which is inefficient for fixed size 
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1102
     collections (i.e. for Strings and Arrays it is not recommened)."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1103
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1104
    |newSize|
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1105
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1106
    newSize := self size + 1.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1107
    self grow:newSize.
61
claus
parents: 44
diff changeset
  1108
    self at:newSize put:anObject.
claus
parents: 44
diff changeset
  1109
    ^ anObject
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
  1110
61
claus
parents: 44
diff changeset
  1111
    "
claus
parents: 44
diff changeset
  1112
     |a|
claus
parents: 44
diff changeset
  1113
     a := #(1 2 3 4 5 6 7 8).
claus
parents: 44
diff changeset
  1114
     a add:'hello'.
claus
parents: 44
diff changeset
  1115
     a
claus
parents: 44
diff changeset
  1116
    "
claus
parents: 44
diff changeset
  1117
    "
claus
parents: 44
diff changeset
  1118
     |c|
claus
parents: 44
diff changeset
  1119
     c := #(1 2 3 4 5 6 7 8) asOrderedCollection.
claus
parents: 44
diff changeset
  1120
     c add:'hello'.
claus
parents: 44
diff changeset
  1121
     c
claus
parents: 44
diff changeset
  1122
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1123
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1124
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1125
add:anElement beforeIndex:index
61
claus
parents: 44
diff changeset
  1126
    "insert the first argument, anObject into the collection before slot index.
claus
parents: 44
diff changeset
  1127
     Return the receiver (sigh - ST-80 compatibility).
claus
parents: 44
diff changeset
  1128
claus
parents: 44
diff changeset
  1129
     Notice, that this is modifies the receiver NOT a copy.
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1130
     Also note, that it may be a slow operation for some collections,
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1131
     due to the grow:-message, which is inefficient for fixed size 
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1132
     collections (i.e. for Strings and Arrays it is not recommened)."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1133
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1134
    |newSize|
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1135
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1136
    newSize := self size + 1.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1137
    self grow:newSize.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1138
    self replaceFrom:index + 1 to:newSize with:self startingAt:index.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1139
    self at:index put:anElement
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
  1140
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1141
    "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1142
     #(1 2 3 4 5 6 7 8) add:'hello' beforeIndex:5
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1143
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1144
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1145
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1146
remove:anElement ifAbsent:aBlock
61
claus
parents: 44
diff changeset
  1147
    "search for anElement and, if present remove and return it.
claus
parents: 44
diff changeset
  1148
     If not present, return the value of evaluating aBlock.
claus
parents: 44
diff changeset
  1149
claus
parents: 44
diff changeset
  1150
     Notice, that this is modifies the receiver NOT a copy.
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1151
     Also note, that it may be a slow operation for some collections,
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1152
     due to the grow:-message, which is inefficient for fixed size 
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1153
     collections (i.e. for Strings and Arrays it is not recommened)."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1154
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1155
    |any 
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1156
     dstIndex "{ Class: SmallInteger }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1157
     sz       "{ Class: SmallInteger }"|
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1158
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1159
    dstIndex := 1.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1160
    any := false.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1161
    sz := self size.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1162
    1 to:sz do:[:srcIndex |
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1163
	(anElement = (self at:srcIndex)) ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1164
	    any := true
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1165
	] ifFalse:[
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1166
	    (dstIndex ~~ srcIndex) ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1167
		self at:dstIndex put:(self at:srcIndex)
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1168
	    ].
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1169
	    dstIndex := dstIndex + 1
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1170
	]
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1171
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1172
    any ifTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1173
	self grow:dstIndex - 1.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1174
	^ anElement
61
claus
parents: 44
diff changeset
  1175
    ].
claus
parents: 44
diff changeset
  1176
    ^ aBlock value
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
  1177
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1178
    "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1179
     #(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
  1180
     #(1 2 3 4 5 6 7 8 9 0) remove:99 ifAbsent:[#oops]
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1181
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1182
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1183
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1184
removeFromIndex:startIndex toIndex:endIndex
61
claus
parents: 44
diff changeset
  1185
    "remove the elements stored at indexes between startIndex and endIndex.
348
claus
parents: 308
diff changeset
  1186
     Return the receiver.
claus
parents: 308
diff changeset
  1187
     Returning the receiver is a historic leftover - it may at one
claus
parents: 308
diff changeset
  1188
     time return a collection of the removed elements.
61
claus
parents: 44
diff changeset
  1189
118
a0460951adf7 fixed grow:0
claus
parents: 95
diff changeset
  1190
     Notice, that this is modifies the receiver - NOT a copy; 
a0460951adf7 fixed grow:0
claus
parents: 95
diff changeset
  1191
     therefore any other users of the receiver will also see this change.
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1192
     Also note, that it may be a slow operation for some collections,
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1193
     due to the grow:-message, which is inefficient for fixed size 
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1194
     collections (i.e. for Strings and Arrays it is not recommened)."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1195
282
94f5c3a6230d *** empty log message ***
claus
parents: 266
diff changeset
  1196
    |size newSize|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1197
282
94f5c3a6230d *** empty log message ***
claus
parents: 266
diff changeset
  1198
    (endIndex >= (size := self size)) ifTrue:[
94f5c3a6230d *** empty log message ***
claus
parents: 266
diff changeset
  1199
	self grow:(startIndex - 1)
118
a0460951adf7 fixed grow:0
claus
parents: 95
diff changeset
  1200
    ] ifFalse:[
282
94f5c3a6230d *** empty log message ***
claus
parents: 266
diff changeset
  1201
	newSize := size - endIndex + startIndex - 1.
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1202
	self replaceFrom:startIndex to:newSize with:self startingAt:(endIndex + 1).
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1203
	self grow:newSize
118
a0460951adf7 fixed grow:0
claus
parents: 95
diff changeset
  1204
    ]
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
  1205
282
94f5c3a6230d *** empty log message ***
claus
parents: 266
diff changeset
  1206
"/    |newSize|
94f5c3a6230d *** empty log message ***
claus
parents: 266
diff changeset
  1207
"/
94f5c3a6230d *** empty log message ***
claus
parents: 266
diff changeset
  1208
"/    newSize := self size - endIndex + startIndex - 1.
94f5c3a6230d *** empty log message ***
claus
parents: 266
diff changeset
  1209
"/    newSize <= 0 ifTrue:[
94f5c3a6230d *** empty log message ***
claus
parents: 266
diff changeset
  1210
"/        self grow:0
94f5c3a6230d *** empty log message ***
claus
parents: 266
diff changeset
  1211
"/    ] ifFalse:[
94f5c3a6230d *** empty log message ***
claus
parents: 266
diff changeset
  1212
"/        self replaceFrom:startIndex to:newSize with:self startingAt:(endIndex + 1).
94f5c3a6230d *** empty log message ***
claus
parents: 266
diff changeset
  1213
"/        self grow:newSize
94f5c3a6230d *** empty log message ***
claus
parents: 266
diff changeset
  1214
"/    ]
94f5c3a6230d *** empty log message ***
claus
parents: 266
diff changeset
  1215
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1216
    "
118
a0460951adf7 fixed grow:0
claus
parents: 95
diff changeset
  1217
     #(1 2 3 4 5 6 7 8 9 0) asOrderedCollection removeFromIndex:3 toIndex:5 
a0460951adf7 fixed grow:0
claus
parents: 95
diff changeset
  1218
     #(1 2 3 4 5 6 7 8 9 0) removeFromIndex:3 toIndex:5 
a0460951adf7 fixed grow:0
claus
parents: 95
diff changeset
  1219
     #(1 2 3 4 5 6 7 8 9 0) asOrderedCollection removeFromIndex:1 toIndex:10 
a0460951adf7 fixed grow:0
claus
parents: 95
diff changeset
  1220
     #(1 2 3 4 5 6 7 8 9 0) removeFromIndex:1 toIndex:10 
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1221
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1222
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1223
348
claus
parents: 308
diff changeset
  1224
removeAtIndex:anIndex
claus
parents: 308
diff changeset
  1225
    "remove the element stored at anIndex. Return the removed object.
61
claus
parents: 44
diff changeset
  1226
claus
parents: 44
diff changeset
  1227
     Notice, that this is modifies the receiver NOT a copy.
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1228
     Also note, that it may be a slow operation for some collections,
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1229
     due to the grow:-message, which is inefficient for fixed size 
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1230
     collections (i.e. for Strings and Arrays it is not recommened)."
61
claus
parents: 44
diff changeset
  1231
claus
parents: 44
diff changeset
  1232
    |element|
claus
parents: 44
diff changeset
  1233
348
claus
parents: 308
diff changeset
  1234
    element := self at:anIndex.
claus
parents: 308
diff changeset
  1235
    self removeFromIndex:anIndex toIndex:anIndex.
61
claus
parents: 44
diff changeset
  1236
    ^ element
claus
parents: 44
diff changeset
  1237
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1238
    "
348
claus
parents: 308
diff changeset
  1239
     #(1 2 3 4 5 6 7 8 9) asOrderedCollection removeAtIndex:3
claus
parents: 308
diff changeset
  1240
     #(1 2 3 4 5) asOrderedCollection removeAtIndex:6
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1241
     #($a $b $c $d $e $f $g) removeAtIndex:3
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1242
    "
61
claus
parents: 44
diff changeset
  1243
!
claus
parents: 44
diff changeset
  1244
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1245
removeIndex:index
61
claus
parents: 44
diff changeset
  1246
    "remove the argument stored at index. Return the receiver.
claus
parents: 44
diff changeset
  1247
claus
parents: 44
diff changeset
  1248
     Notice, that this is modifies the receiver NOT a copy.
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1249
     Also note, that it may be a slow operation for some collections,
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1250
     due to the grow:-message, which is inefficient for fixed size 
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1251
     collections (i.e. for Strings and Arrays it is not recommened)."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1252
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1253
    self removeFromIndex:index toIndex:index
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
  1254
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1255
    "
348
claus
parents: 308
diff changeset
  1256
     #(1 2 3 4 5 6 7 8 9) asOrderedCollection removeIndex:3
claus
parents: 308
diff changeset
  1257
     #(1 2 3 4 5) asOrderedCollection removeIndex:6
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1258
     #($a $b $c $d $e $f $g) removeIndex:3
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1259
    "
61
claus
parents: 44
diff changeset
  1260
!
claus
parents: 44
diff changeset
  1261
claus
parents: 44
diff changeset
  1262
removeFirst
claus
parents: 44
diff changeset
  1263
    "remove the first element of the receiver and return it.
claus
parents: 44
diff changeset
  1264
claus
parents: 44
diff changeset
  1265
     Notice, that this is modifies the receiver NOT a copy.
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1266
     Also note, that it may be a slow operation for some collections,
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1267
     due to the grow:-message, which is inefficient for fixed size 
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1268
     collections (i.e. for Strings and Arrays it is not recommened)."
61
claus
parents: 44
diff changeset
  1269
claus
parents: 44
diff changeset
  1270
    ^ self removeAtIndex:1
claus
parents: 44
diff changeset
  1271
claus
parents: 44
diff changeset
  1272
    "
348
claus
parents: 308
diff changeset
  1273
     |a|
61
claus
parents: 44
diff changeset
  1274
     a := #(1 2 3 4 5 6).
claus
parents: 44
diff changeset
  1275
     a removeFirst.
348
claus
parents: 308
diff changeset
  1276
     a 
61
claus
parents: 44
diff changeset
  1277
    "
claus
parents: 44
diff changeset
  1278
!
claus
parents: 44
diff changeset
  1279
claus
parents: 44
diff changeset
  1280
removeLast
claus
parents: 44
diff changeset
  1281
    "remove the last element of the receiver and return it.
claus
parents: 44
diff changeset
  1282
claus
parents: 44
diff changeset
  1283
     Notice, that this is modifies the receiver NOT a copy.
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1284
     Also note, that it may be a slow operation for some collections,
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1285
     due to the grow:-message, which is inefficient for fixed size
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1286
     collections (i.e. for Strings and Arrays it is not recommened)."
61
claus
parents: 44
diff changeset
  1287
claus
parents: 44
diff changeset
  1288
    ^ self removeAtIndex:(self size) 
claus
parents: 44
diff changeset
  1289
claus
parents: 44
diff changeset
  1290
    "
348
claus
parents: 308
diff changeset
  1291
     |a|
61
claus
parents: 44
diff changeset
  1292
     a := #(1 2 3 4 5 6).
claus
parents: 44
diff changeset
  1293
     a removeLast.
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1294
     a   
61
claus
parents: 44
diff changeset
  1295
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1296
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1297
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1298
!SequenceableCollection methodsFor:'searching'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1299
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1300
detect:aBlock ifNone:exceptionBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1301
    "find the first element, for which evaluation of the argument, aBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1302
     return true; if none does so, return the evaluation of exceptionBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1303
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1304
    reimplemented here for speed"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1305
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1306
    |stop  "{ Class: SmallInteger }"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1307
     element|
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1308
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1309
    stop := self size.
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1310
    1 to:stop do:[:index |
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1311
	element := self at:index.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1312
	(aBlock value:element) ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1313
	    ^ element
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1314
	].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1315
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1316
    ^ exceptionBlock value
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1317
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1318
    "
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1319
     #(11 12 13 14) detect:[:n | n odd] ifNone:['sorry']    
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1320
     #(12 14 16 18) detect:[:n | n odd] ifNone:['sorry']     
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1321
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1322
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1323
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1324
indexOf:anElement
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1325
    "search the collection for anElement;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1326
     if found, return the index otherwise return 0.
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
  1327
     The comparison is done using = 
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
  1328
     (i.e. equality test - not identity test)."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1329
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1330
    ^ self indexOf:anElement startingAt:1
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
  1331
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1332
    "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1333
     #(10 20 30 40 50 60 70) indexOf:40
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1334
     #(10 20 30 40 50 60 70) indexOf:40.0
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1335
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1336
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1337
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1338
indexOf:anElement ifAbsent:exceptionBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1339
    "search the collection for anElement;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1340
     if found, return the index otherwise return the value of the
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1341
     exceptionBlock.
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
  1342
     The comparison is done using = 
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
  1343
     (i.e. equality test - not identity test)."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1344
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1345
    |index|
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1346
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1347
    index := self indexOf:anElement startingAt:1.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1348
    (index == 0) ifTrue:[^ exceptionBlock value].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1349
    ^ index
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1350
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1351
    "
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1352
     #(10 20 30 40 10 20 30 40) indexOf:40   ifAbsent:['none'] 
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1353
     #(10 20 30 40 10 20 30 40) indexOf:40.0 ifAbsent:['none'] 
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1354
     #(10 20 30 40 10 20 30 40) indexOf:35   ifAbsent:['none'] 
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1355
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1356
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1357
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1358
indexOf:anElement startingAt:start
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1359
    "search the collection for anElement, starting the search at index start;
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1360
     if found, return the index otherwise return 0.
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
  1361
     The comparison is done using = 
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
  1362
     (i.e. equality test - not identity test)."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1363
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1364
    |startIndex "{ Class: SmallInteger }"
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1365
     stop       "{ Class: SmallInteger }" |
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1366
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1367
    startIndex := start.
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1368
    stop := self size.
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1369
    startIndex to:stop do:[:index |
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1370
	anElement = (self at:index) ifTrue:[^ index].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1371
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1372
    ^ 0
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1373
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1374
    "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1375
     #(10 20 30 40 10 20 30 40) indexOf:40   startingAt:5  
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1376
     #(10 20 30 40 10 20 30 40) indexOf:40.0 startingAt:5  
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1377
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1378
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1379
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1380
indexOf:anElement startingAt:start ifAbsent:exceptionBlock
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1381
    "search the collection for anElement starting the search at index start;
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1382
     if found, return the index otherwise return the value of the
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1383
     exceptionBlock.
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
  1384
     The comparison is done using = 
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
  1385
     (i.e. equality test - not identity test)."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1386
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1387
    |index|
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1388
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1389
    index := self indexOf:anElement startingAt:start.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1390
    (index == 0) ifTrue:[^ exceptionBlock value].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1391
    ^ index
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1392
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1393
    "
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1394
     #(10 20 30 40 10 20 30 40) indexOf:40   startingAt:5 ifAbsent:['none'] 
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1395
     #(10 20 30 40 10 20 30 40) indexOf:40.0 startingAt:5 ifAbsent:['none'] 
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1396
     #(10 20 30 40 10 20 30 40) indexOf:35   startingAt:5 ifAbsent:['none'] 
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1397
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1398
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1399
252
  1400
indexOf:elementToFind replaceWith:replacement startingAt:start stoppingAt:stop
  1401
    "search for the first occurence of elementToFind starting at start,
  1402
     stopping the search at stop. If found, replace the element by replacement
  1403
     and return the index.
  1404
     If not found, return 0."
  1405
  1406
    |idx|
  1407
  1408
    idx := self indexOf:elementToFind startingAt:start.
  1409
    ((idx > 0) and:[idx <= stop]) ifTrue:[
  1410
	self at:idx put:replacement.
  1411
	^ idx
  1412
    ].
  1413
    ^ 0
  1414
  1415
    "
  1416
     |a|
  1417
  1418
     a := #(10 20 30 40 50 60 70).
  1419
     (a indexOf:30 replaceWith:nil startingAt:1 stoppingAt:7) printNL.
  1420
     a printNL.
  1421
    "
  1422
!
  1423
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1424
identityIndexOf:anElement
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1425
    "search the collection for anElement using identity compare (i.e. ==);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1426
     if found, return the index otherwise return 0."
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1427
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1428
    ^ self identityIndexOf:anElement startingAt:1
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
  1429
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1430
    "
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1431
     #(10 20 30 40 50 60 70) identityIndexOf:40
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1432
     #(10 20 30 40 50 60 70) identityIndexOf:40.0
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1433
     #(10 20 30 40 50 60 70) indexOf:40.0
360
claus
parents: 359
diff changeset
  1434
claus
parents: 359
diff changeset
  1435
    be careful:
claus
parents: 359
diff changeset
  1436
claus
parents: 359
diff changeset
  1437
     #(10 20 30 40.0 50 60 70) indexOf:40.0
claus
parents: 359
diff changeset
  1438
     #(10 20 30 40.0 50 60 70) identityIndexOf:40.0
claus
parents: 359
diff changeset
  1439
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1440
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1441
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1442
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1443
identityIndexOf:anElement ifAbsent:exceptionBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1444
    "search the collection for anElement using identity compare (i.e. ==);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1445
     if found, return the index otherwise return the value of the
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1446
     exceptionBlock."
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1447
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1448
    |index|
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1449
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1450
    index := self identityIndexOf:anElement startingAt:1.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1451
    (index == 0) ifTrue:[^ exceptionBlock value].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1452
    ^ index
159
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
     #(10 20 30 40 50 60 70) identityIndexOf:40  ifAbsent:['none']  
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1456
     #(10 20 30 40 50 60 70) identityIndexOf:35  ifAbsent:['none']  
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1457
     #(10 20 30 40 50 60 70) identityIndexOf:40.0 ifAbsent:['none'] 
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1458
     #(10 20 30 40 50 60 70) indexOf:40.0         ifAbsent:['none'] 
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
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1462
identityIndexOf:anElement startingAt:start
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1463
    "search the collection for anElement, starting search at index start
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1464
     using identity compare  (i.e. ==);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1465
     if found, return the index otherwise return 0."
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1466
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1467
    |startIndex "{ Class: SmallInteger }"
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1468
     stop       "{ Class: SmallInteger }" |
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1469
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1470
    startIndex := start.
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1471
    stop := self size.
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1472
    startIndex to:stop do:[:index |
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1473
	anElement == (self at:index) ifTrue:[^ index].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1474
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1475
    ^ 0
44
b262907c93ea *** empty log message ***
claus
parents: 42
diff changeset
  1476
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1477
    "
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1478
     #(10 20 30 40 10 20 30 40) identityIndexOf:40   startingAt:5
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1479
     #(10 20 30 40 10 20 30 40) identityIndexOf:40.0 startingAt:5
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1480
     #(10 20 30 40 10 20 30 40) indexOf:40.0         startingAt:5 
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1481
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1482
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1483
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1484
identityIndexOf:anElement startingAt:start ifAbsent:exceptionBlock
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1485
    "search the collection for anElement, starting search at index start;
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1486
     if found, return the index otherwise return the value of the
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1487
     exceptionBlock.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1488
     This one searches for identical objects (i.e. ==)."
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1489
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1490
    |index|
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1491
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1492
    index := self identityIndexOf:anElement startingAt:start.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1493
    (index == 0) ifTrue:[^ exceptionBlock value].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1494
    ^ index
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1495
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1496
    "
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1497
     #(10 20 30 40 10) identityIndexOf:10 startingAt:3 ifAbsent:['none'] 
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1498
     #(10 20 30 40 10) identityIndexOf:35 startingAt:3 ifAbsent:['none'] 
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1499
    "
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1500
!
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1501
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1502
indexOfAny:aCollection
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1503
    "search the collection for an element in aCollection.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1504
     if found, return the index otherwise return 0.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1505
     The comparison is done using = 
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1506
     (i.e. equality test - not identity test).
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1507
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1508
     Notice, that for big collections, the runtime of this search
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1509
     grows proportional to size(receiver) * size(aCollection).
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1510
     You may think about using other mechanisms (Sets, Dictionaries etc)."
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1511
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1512
    ^ self indexOfAny:aCollection startingAt:1
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1513
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1514
    "
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1515
     #(10 20 30 40 50 60 70) indexOfAny:#(40 30 50)
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1516
     #(10 20 30 40 50 60 70) indexOfAny:#(40.0 30.0 50)
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1517
    "
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1518
!
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1519
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1520
indexOfAny:aCollection startingAt:start
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1521
    "search the collection for an element in aCollection,
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1522
     starting the search at index start;
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1523
     if found, return the index otherwise return 0.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1524
     The comparison is done using = 
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1525
     (i.e. equality test - not identity test).
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1526
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1527
     Notice, that for big collections, the runtime of this search
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1528
     grows proportional to size(receiver) * size(aCollection).
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1529
     You may think about using other mechanisms (Sets, Dictionaries etc)."
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1530
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1531
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1532
    |startIndex "{ Class: SmallInteger }"
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1533
     stop       "{ Class: SmallInteger }" |
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1534
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1535
    startIndex := start.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1536
    stop := self size.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1537
    startIndex to:stop do:[:index |
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1538
	(aCollection includes:(self at:index)) ifTrue:[^ index].
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1539
    ].
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1540
    ^ 0
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1541
    "
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1542
     #(10 20 30 40 10 20 30 40) indexOfAny:#(40 50 30) startingAt:5  
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1543
     #(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
  1544
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1545
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1546
518
5372a8875432 added indexOfAny:startingAt:ifAbsent:
Claus Gittinger <cg@exept.de>
parents: 424
diff changeset
  1547
indexOfAny:aCollection startingAt:start ifAbsent:exceptionBlock
5372a8875432 added indexOfAny:startingAt:ifAbsent:
Claus Gittinger <cg@exept.de>
parents: 424
diff changeset
  1548
    "search the collection for an element in aCollection,
5372a8875432 added indexOfAny:startingAt:ifAbsent:
Claus Gittinger <cg@exept.de>
parents: 424
diff changeset
  1549
     starting the search at index start;
5372a8875432 added indexOfAny:startingAt:ifAbsent:
Claus Gittinger <cg@exept.de>
parents: 424
diff changeset
  1550
     if found, return the index. If not, return the value returned by exceptionBlock.
5372a8875432 added indexOfAny:startingAt:ifAbsent:
Claus Gittinger <cg@exept.de>
parents: 424
diff changeset
  1551
     The comparison is done using = 
5372a8875432 added indexOfAny:startingAt:ifAbsent:
Claus Gittinger <cg@exept.de>
parents: 424
diff changeset
  1552
     (i.e. equality test - not identity test).
5372a8875432 added indexOfAny:startingAt:ifAbsent:
Claus Gittinger <cg@exept.de>
parents: 424
diff changeset
  1553
5372a8875432 added indexOfAny:startingAt:ifAbsent:
Claus Gittinger <cg@exept.de>
parents: 424
diff changeset
  1554
     Notice, that for big collections, the runtime of this search
5372a8875432 added indexOfAny:startingAt:ifAbsent:
Claus Gittinger <cg@exept.de>
parents: 424
diff changeset
  1555
     grows proportional to size(receiver) * size(aCollection).
5372a8875432 added indexOfAny:startingAt:ifAbsent:
Claus Gittinger <cg@exept.de>
parents: 424
diff changeset
  1556
     You may think about using other mechanisms (Sets, Dictionaries etc)."
5372a8875432 added indexOfAny:startingAt:ifAbsent:
Claus Gittinger <cg@exept.de>
parents: 424
diff changeset
  1557
5372a8875432 added indexOfAny:startingAt:ifAbsent:
Claus Gittinger <cg@exept.de>
parents: 424
diff changeset
  1558
5372a8875432 added indexOfAny:startingAt:ifAbsent:
Claus Gittinger <cg@exept.de>
parents: 424
diff changeset
  1559
    |val|
5372a8875432 added indexOfAny:startingAt:ifAbsent:
Claus Gittinger <cg@exept.de>
parents: 424
diff changeset
  1560
5372a8875432 added indexOfAny:startingAt:ifAbsent:
Claus Gittinger <cg@exept.de>
parents: 424
diff changeset
  1561
    val := self indexOfAny:aCollection startingAt:start .
5372a8875432 added indexOfAny:startingAt:ifAbsent:
Claus Gittinger <cg@exept.de>
parents: 424
diff changeset
  1562
    val == 0 ifTrue:[^ exceptionBlock value].
5372a8875432 added indexOfAny:startingAt:ifAbsent:
Claus Gittinger <cg@exept.de>
parents: 424
diff changeset
  1563
    ^ val.
5372a8875432 added indexOfAny:startingAt:ifAbsent:
Claus Gittinger <cg@exept.de>
parents: 424
diff changeset
  1564
5372a8875432 added indexOfAny:startingAt:ifAbsent:
Claus Gittinger <cg@exept.de>
parents: 424
diff changeset
  1565
    "
5372a8875432 added indexOfAny:startingAt:ifAbsent:
Claus Gittinger <cg@exept.de>
parents: 424
diff changeset
  1566
     #(10 20 30 40 10 20 30 40) indexOfAny:#(40 50 30) startingAt:5 ifAbsent:-1  
5372a8875432 added indexOfAny:startingAt:ifAbsent:
Claus Gittinger <cg@exept.de>
parents: 424
diff changeset
  1567
     #(10 20 30 40 10 20 30 40) indexOfAny:#(40.0 50 30.0) startingAt:5 ifAbsent:-1  
5372a8875432 added indexOfAny:startingAt:ifAbsent:
Claus Gittinger <cg@exept.de>
parents: 424
diff changeset
  1568
     #(10 20 30 40 10 20 30 40) indexOfAny:#(99 88 77) startingAt:5 ifAbsent:['oops']  
5372a8875432 added indexOfAny:startingAt:ifAbsent:
Claus Gittinger <cg@exept.de>
parents: 424
diff changeset
  1569
    "
5372a8875432 added indexOfAny:startingAt:ifAbsent:
Claus Gittinger <cg@exept.de>
parents: 424
diff changeset
  1570
!
5372a8875432 added indexOfAny:startingAt:ifAbsent:
Claus Gittinger <cg@exept.de>
parents: 424
diff changeset
  1571
360
claus
parents: 359
diff changeset
  1572
lastIndexOf:anElement startingAt:start ifAbsent:exceptionBlock
claus
parents: 359
diff changeset
  1573
    "search the collection backwards for anElement starting the search at 
claus
parents: 359
diff changeset
  1574
     index start; if found, return the index 
claus
parents: 359
diff changeset
  1575
     otherwise return the value of the exceptionBlock.
claus
parents: 359
diff changeset
  1576
     The comparison is done using = 
claus
parents: 359
diff changeset
  1577
     (i.e. equality test - not identity test)."
claus
parents: 359
diff changeset
  1578
claus
parents: 359
diff changeset
  1579
    |index|
claus
parents: 359
diff changeset
  1580
claus
parents: 359
diff changeset
  1581
    index := self lastIndexOf:anElement startingAt:start.
claus
parents: 359
diff changeset
  1582
    (index == 0) ifTrue:[^ exceptionBlock value].
claus
parents: 359
diff changeset
  1583
    ^ index
claus
parents: 359
diff changeset
  1584
claus
parents: 359
diff changeset
  1585
    "
claus
parents: 359
diff changeset
  1586
     #(10 20 30 40 10 20 30 40) lastIndexOf:40   startingAt:8 ifAbsent:['none'] 
claus
parents: 359
diff changeset
  1587
     #(10 20 30 40 10 20 30 40) lastIndexOf:40.0 startingAt:8 ifAbsent:['none'] 
claus
parents: 359
diff changeset
  1588
     #(10 20 30 40 10 20 30 40) lastIndexOf:35   startingAt:8 ifAbsent:['none'] 
claus
parents: 359
diff changeset
  1589
     #(10 20 30 40 10 20 30 40) lastIndexOf:10   startingAt:8 ifAbsent:['none'] 
claus
parents: 359
diff changeset
  1590
    "
claus
parents: 359
diff changeset
  1591
!
claus
parents: 359
diff changeset
  1592
claus
parents: 359
diff changeset
  1593
lastIndexOf:anElement startingAt:start
claus
parents: 359
diff changeset
  1594
    "search the collection backwards for anElement, starting the search at index start;
claus
parents: 359
diff changeset
  1595
     if found, return the index otherwise return 0.
claus
parents: 359
diff changeset
  1596
     The comparison is done using = 
claus
parents: 359
diff changeset
  1597
     (i.e. equality test - not identity test)."
claus
parents: 359
diff changeset
  1598
362
claus
parents: 360
diff changeset
  1599
    |startIndex "{ Class: SmallInteger }"|
360
claus
parents: 359
diff changeset
  1600
362
claus
parents: 360
diff changeset
  1601
    startIndex := start.
360
claus
parents: 359
diff changeset
  1602
    startIndex to:1 by:-1 do:[:index |
claus
parents: 359
diff changeset
  1603
	anElement = (self at:index) ifTrue:[^ index].
claus
parents: 359
diff changeset
  1604
    ].
claus
parents: 359
diff changeset
  1605
    ^ 0
claus
parents: 359
diff changeset
  1606
claus
parents: 359
diff changeset
  1607
    "
claus
parents: 359
diff changeset
  1608
     #(10 20 30 40 10 20 30 40) lastIndexOf:40   startingAt:8  
claus
parents: 359
diff changeset
  1609
     #(10 20 30 40 10 20 30 40) lastIndexOf:40.0 startingAt:8  
claus
parents: 359
diff changeset
  1610
     #(10 20 30 40 10 20 30 40) lastIndexOf:35   startingAt:8  
claus
parents: 359
diff changeset
  1611
     #(10 20 30 40 10 20 30 40) lastIndexOf:10   startingAt:8  
362
claus
parents: 360
diff changeset
  1612
     #(10 20 30 40 10 20 30 40) lastIndexOf:10   startingAt:4  
360
claus
parents: 359
diff changeset
  1613
    "
claus
parents: 359
diff changeset
  1614
!
claus
parents: 359
diff changeset
  1615
claus
parents: 359
diff changeset
  1616
lastIndexOf:anElement ifAbsent:exceptionBlock
claus
parents: 359
diff changeset
  1617
    "search the collection backwards for anElement;
claus
parents: 359
diff changeset
  1618
     if found, return the index otherwise return the value of the
claus
parents: 359
diff changeset
  1619
     exceptionBlock.
claus
parents: 359
diff changeset
  1620
     The comparison is done using = 
claus
parents: 359
diff changeset
  1621
     (i.e. equality test - not identity test)."
claus
parents: 359
diff changeset
  1622
claus
parents: 359
diff changeset
  1623
    |index|
claus
parents: 359
diff changeset
  1624
claus
parents: 359
diff changeset
  1625
    index := self lastIndexOf:anElement startingAt:self size.
claus
parents: 359
diff changeset
  1626
    (index == 0) ifTrue:[^ exceptionBlock value].
claus
parents: 359
diff changeset
  1627
    ^ index
claus
parents: 359
diff changeset
  1628
claus
parents: 359
diff changeset
  1629
    "
claus
parents: 359
diff changeset
  1630
     #(10 20 30 40 10 20 30 40) lastIndexOf:40   ifAbsent:['none'] 
claus
parents: 359
diff changeset
  1631
     #(10 20 30 40 10 20 30 40) lastIndexOf:40.0 ifAbsent:['none'] 
claus
parents: 359
diff changeset
  1632
     #(10 20 30 40 10 20 30 40) lastIndexOf:35   ifAbsent:['none'] 
claus
parents: 359
diff changeset
  1633
     #(10 20 30 40 10 20 30 40) lastIndexOf:10   ifAbsent:['none'] 
claus
parents: 359
diff changeset
  1634
    "
claus
parents: 359
diff changeset
  1635
!
claus
parents: 359
diff changeset
  1636
claus
parents: 359
diff changeset
  1637
lastIndexOf:anElement
claus
parents: 359
diff changeset
  1638
    "search the collection backwards for anElement;
claus
parents: 359
diff changeset
  1639
     if found, return the index otherwise return 0.
claus
parents: 359
diff changeset
  1640
     The comparison is done using = 
claus
parents: 359
diff changeset
  1641
     (i.e. equality test - not identity test)."
claus
parents: 359
diff changeset
  1642
claus
parents: 359
diff changeset
  1643
    ^ self lastIndexOf:anElement startingAt:self size 
claus
parents: 359
diff changeset
  1644
claus
parents: 359
diff changeset
  1645
    "
claus
parents: 359
diff changeset
  1646
     #(10 20 30 40 50 60 70) lastIndexOf:40    
claus
parents: 359
diff changeset
  1647
     #(10 20 30 40 50 60 70) lastIndexOf:40.0  
claus
parents: 359
diff changeset
  1648
     #(10 20 30 40 50 60 70) lastIndexOf:35    
claus
parents: 359
diff changeset
  1649
     #(10 20 30 40 50 60 70) lastIndexOf:10    
claus
parents: 359
diff changeset
  1650
    "
claus
parents: 359
diff changeset
  1651
!
claus
parents: 359
diff changeset
  1652
claus
parents: 359
diff changeset
  1653
nextIndexOf:anElement from:start to:stop ifAbsent:exceptionBlock
claus
parents: 359
diff changeset
  1654
    "search the collection for anElement, starting the search at index start
claus
parents: 359
diff changeset
  1655
     and stopping at stop;
claus
parents: 359
diff changeset
  1656
     if found, return the index otherwise return the value of the
claus
parents: 359
diff changeset
  1657
     exceptionBlock.
claus
parents: 359
diff changeset
  1658
     The comparison is done using = 
claus
parents: 359
diff changeset
  1659
     (i.e. equality test - not identity test)."
claus
parents: 359
diff changeset
  1660
claus
parents: 359
diff changeset
  1661
    |index|
claus
parents: 359
diff changeset
  1662
claus
parents: 359
diff changeset
  1663
    index := self nextIndexOf:anElement from:start to:stop.
claus
parents: 359
diff changeset
  1664
    (index == 0) ifTrue:[^ exceptionBlock value].
claus
parents: 359
diff changeset
  1665
    ^ index
claus
parents: 359
diff changeset
  1666
claus
parents: 359
diff changeset
  1667
    "
claus
parents: 359
diff changeset
  1668
     #(10 20 30 40 10 20 30 40) nextIndexOf:40   from:2 to:6 ifAbsent:['none'] 
claus
parents: 359
diff changeset
  1669
     #(10 20 30 40 10 20 30 40) nextIndexOf:40.0 from:2 to:6 ifAbsent:['none'] 
claus
parents: 359
diff changeset
  1670
     #(10 20 30 40 10 20 30 40) nextIndexOf:35   from:2 to:6 ifAbsent:['none'] 
claus
parents: 359
diff changeset
  1671
    "
claus
parents: 359
diff changeset
  1672
!
claus
parents: 359
diff changeset
  1673
claus
parents: 359
diff changeset
  1674
nextIndexOf:anElement from:start to:stop
claus
parents: 359
diff changeset
  1675
    "search the collection for anElement, starting the search at index start,
claus
parents: 359
diff changeset
  1676
     stopping at:stop;
claus
parents: 359
diff changeset
  1677
     if found, return the index otherwise return 0.
claus
parents: 359
diff changeset
  1678
     The comparison is done using = 
claus
parents: 359
diff changeset
  1679
     (i.e. equality test - not identity test)."
claus
parents: 359
diff changeset
  1680
claus
parents: 359
diff changeset
  1681
    |startIndex "{ Class: SmallInteger }"
claus
parents: 359
diff changeset
  1682
     stopIndex  "{ Class: SmallInteger }" |
claus
parents: 359
diff changeset
  1683
claus
parents: 359
diff changeset
  1684
    startIndex := start.
claus
parents: 359
diff changeset
  1685
    stopIndex :=  stop.
claus
parents: 359
diff changeset
  1686
    startIndex to:stop do:[:index |
claus
parents: 359
diff changeset
  1687
	anElement = (self at:index) ifTrue:[^ index].
claus
parents: 359
diff changeset
  1688
    ].
claus
parents: 359
diff changeset
  1689
    ^ 0
claus
parents: 359
diff changeset
  1690
claus
parents: 359
diff changeset
  1691
    "
claus
parents: 359
diff changeset
  1692
     #(10 20 30 40 10 20 30 40) nextIndexOf:40   from:2 to:6  
claus
parents: 359
diff changeset
  1693
     #(10 20 30 40 10 20 30 40) nextIndexOf:40.0 from:2 to:6   
claus
parents: 359
diff changeset
  1694
     #(10 20 30 40 10 20 30 40) nextIndexOf:35   from:2 to:6   
claus
parents: 359
diff changeset
  1695
    "
claus
parents: 359
diff changeset
  1696
!
claus
parents: 359
diff changeset
  1697
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1698
findFirst:aBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1699
    "find the first element, for which evaluation of the argument, aBlock
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1700
     returns true; return its index or 0 if none detected."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1701
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1702
    |stop  "{ Class: SmallInteger }" |
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1703
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1704
    stop := self size.
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1705
    1 to:stop do:[:index |
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1706
	(aBlock value:(self at:index)) ifTrue:[^ index].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1707
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1708
    ^ 0
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1709
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1710
    "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1711
     #(1 2 3 4 5 6) findFirst:[:x | (x >= 3)]
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1712
     #(1 2 3 4 5 6) findFirst:[:x | (x >= 3) and:[x even]]
244
9faa2da0650a Text <-> StringCollection
claus
parents: 233
diff changeset
  1713
     #(1 2 3 4 5 6) findFirst:[:x | (x >= 8)]           
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1714
     'one.two.three' findFirst:[:c | (c == $.)]
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1715
    "
13
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
  1716
!
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
  1717
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
  1718
findLast:aBlock
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
  1719
    "find the last element, for which evaluation of the argument, aBlock
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1720
     returns true; return its index or 0 if none detected."
13
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
  1721
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1722
    |start "{ Class: SmallInteger }"|
13
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
  1723
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1724
    start := self size.
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1725
    start to:1 by:-1 do:[:index |
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1726
	(aBlock value:(self at:index)) ifTrue:[^ index].
13
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
  1727
    ].
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
  1728
    ^ 0
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
  1729
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1730
    "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1731
     #(1 99 3 99 5 6) findLast:[:x | (x == 99)]
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1732
     'one.two.three' findLast:[:c | (c == $.)]
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1733
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1734
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1735
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1736
includes:anElement
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1737
    "return true if the collection contains anElement; false otherwise.
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1738
     Comparison is done using equality compare (i.e. =).
360
claus
parents: 359
diff changeset
  1739
     See #includesIdentical: if identity is asked for."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1740
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1741
    ((self indexOf:anElement startingAt:1) == 0) ifTrue:[^ false].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1742
    ^ true
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1743
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1744
    "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1745
     #(10 20 30 40 50 60 70) includes:99      
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1746
     #(10 20 30 40 50 60 70) includes:40     
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1747
     #(10 20 30 40 50 60 70) includes:40.0    
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1748
    "
360
claus
parents: 359
diff changeset
  1749
!
claus
parents: 359
diff changeset
  1750
claus
parents: 359
diff changeset
  1751
includesIdentical:anElement
claus
parents: 359
diff changeset
  1752
    "return true if the collection contains anElement; false otherwise.
claus
parents: 359
diff changeset
  1753
     Comparison is done using identity compare (i.e. ==).
claus
parents: 359
diff changeset
  1754
     See #includes: if equality is asked for."
claus
parents: 359
diff changeset
  1755
claus
parents: 359
diff changeset
  1756
    ((self identityIndexOf:anElement startingAt:1) == 0) ifTrue:[^ false].
claus
parents: 359
diff changeset
  1757
    ^ true
claus
parents: 359
diff changeset
  1758
claus
parents: 359
diff changeset
  1759
    "
claus
parents: 359
diff changeset
  1760
     #(10 20 30 40 50 60 70) includesIdentical:40     
claus
parents: 359
diff changeset
  1761
     #(10 20 30 40 50 60 70) includesIdentical:40.0    
claus
parents: 359
diff changeset
  1762
     #(10 20 30 40 50 60 70) includes:40     
claus
parents: 359
diff changeset
  1763
     #(10 20 30 40 50 60 70) includes:40.0    
claus
parents: 359
diff changeset
  1764
claus
parents: 359
diff changeset
  1765
     be careful:
claus
parents: 359
diff changeset
  1766
claus
parents: 359
diff changeset
  1767
     #(10 20 30 40.0 50 60 70) includes:40.0    
claus
parents: 359
diff changeset
  1768
     #(10 20 30 40.0 50 60 70) includesIdentical:40.0    
claus
parents: 359
diff changeset
  1769
    "
368
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1770
!
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1771
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1772
indexOfSubCollection:aCollection
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1773
    "find a subcollection. 
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1774
     If found, return the index; if not found, return 0."
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1775
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1776
    ^ self indexOfSubCollection:aCollection startingAt:1 ifAbsent:[0]
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1777
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1778
    "
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1779
     #(1 2 3 4 5 6 7) indexOfSubCollection:#()  
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1780
     #(1 2 3 4 5 6 7) indexOfSubCollection:#(1)      
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1781
     #(1 2 3 4 5 6 7) indexOfSubCollection:#(1 2 3 4) 
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1782
     #(1 2 3 4 5 6 7) indexOfSubCollection:#(2 3 5)   
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1783
     #(1 2 3 2 3 4 5) indexOfSubCollection:#(2 3 4)  
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1784
     #(1 2 3 4 5 6 7) indexOfSubCollection:#(5 6 7)  
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1785
     #(1 2 3 4 5 6 7) indexOfSubCollection:#(5 6 8)  
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1786
     #(1 2 3 4 5 6 7) indexOfSubCollection:#(5 6 7 8)  
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1787
    "
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1788
!
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1789
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1790
indexOfSubCollection:aCollection startingAt:startIndex
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1791
    "find a subcollection starting at index. 
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1792
     If found, return the index; if not found, return 0."
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1793
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1794
    ^ self indexOfSubCollection:aCollection startingAt:startIndex ifAbsent:[0]
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1795
!
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1796
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1797
indexOfSubCollection:aCollection ifAbsent:exceptionBlock
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1798
    "find a subcollection. If found, return the index;
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1799
     if not found, return the result of evaluating exceptionBlock."
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1800
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1801
    ^ self indexOfSubCollection:aCollection startingAt:1 ifAbsent:exceptionBlock
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1802
!
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1803
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1804
indexOfSubCollection:aCollection startingAt:startIndex ifAbsent:exceptionBlock
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1805
    "find a subcollection, starting at index. If found, return the index;
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1806
     if not found, return the result of evaluating exceptionBlock.
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1807
     This is a q&d hack - not very efficient"
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1808
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1809
    |same first 
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1810
     mySize     "{Class: SmallInteger }"
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1811
     checkIndex "{Class: SmallInteger }"
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1812
     cmpIndex   "{Class: SmallInteger }"
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1813
     sz         "{Class: SmallInteger }"|
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1814
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1815
    mySize := self size.
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1816
    sz := aCollection size.
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1817
    sz == 0 ifTrue:[^ exceptionBlock value].
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1818
    first := aCollection at:1.
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1819
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1820
    checkIndex := startIndex - 1.    
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1821
    [true] whileTrue:[
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1822
	checkIndex := self indexOf:first startingAt:checkIndex+1.
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1823
	checkIndex == 0 ifTrue:[^ exceptionBlock value].
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1824
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1825
	(checkIndex + sz - 1) > mySize ifTrue:[
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1826
	    ^ 0
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1827
	].
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1828
	same := true.
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1829
	cmpIndex := 1.
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1830
	[same and:[cmpIndex <= sz]] whileTrue:[
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1831
	    (self at:checkIndex + cmpIndex - 1) = (aCollection at:cmpIndex) ifFalse:[
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1832
		same := false
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1833
	    ] ifTrue:[
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1834
		cmpIndex := cmpIndex + 1
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1835
	    ]
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1836
	].
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1837
	same ifTrue:[^ checkIndex].
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1838
    ]    
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1839
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1840
    "
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1841
     #(1 2 3 4 5 6 7) indexOfSubCollection:#()  startingAt:2 
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1842
     #(1 2 3 4 5 6 7) indexOfSubCollection:#(1) startingAt:2     
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1843
     #(1 2 1 2 1 2 3) indexOfSubCollection:#(1 2 3) startingAt:2 
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1844
     #(1 2 1 2 1 2 3) indexOfSubCollection:#(1 2)   startingAt:2  
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1845
     #(1 2 1 2 1 2 3) indexOfSubCollection:#(1 2)   startingAt:3  
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1846
     #(1 2 1 2 1 2 3) indexOfSubCollection:#(1 2)   startingAt:4 
a3c21a89ec37 *** empty log message ***
claus
parents: 362
diff changeset
  1847
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1848
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1849
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1850
!SequenceableCollection methodsFor:'sorting & reordering'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1851
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1852
reverse
2
claus
parents: 1
diff changeset
  1853
    "reverse the order of the elements inplace"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1854
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1855
    |lowIndex "{ Class: SmallInteger }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1856
     hiIndex  "{ Class: SmallInteger }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1857
     t|
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1858
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1859
    hiIndex := self size.
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1860
    lowIndex := 1.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1861
    [lowIndex < hiIndex] whileTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1862
	t := self at:lowIndex.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1863
	self at:lowIndex put:(self at:hiIndex). 
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1864
	self at:hiIndex put:t.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1865
	lowIndex := lowIndex + 1.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1866
	hiIndex := hiIndex - 1
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1867
    ]
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1868
    "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1869
     #(4 5 6 7 7) reverse
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1870
     #(1 4 7 10 2 5) asOrderedCollection reverse
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1871
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1872
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1873
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1874
quickSortFrom:begin to:end
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1875
    "actual quicksort worker for sort-message"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1876
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1877
    |b "{ Class: SmallInteger }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1878
     e "{ Class: SmallInteger }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1879
     middleElement temp |
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1880
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1881
    b := begin.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1882
    e := end.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1883
    middleElement := self at:((b + e) // 2).
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1884
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1885
    [b < e] whileTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1886
	[b < end and:[(self at:b) < middleElement]] whileTrue:[b := b + 1].
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1887
	[e > begin and:[middleElement < (self at:e)]] whileTrue:[e := e - 1].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1888
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1889
	(b <= e) ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1890
	    (b == e) ifFalse:[
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1891
		temp := self at:b.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1892
		self at:b put:(self at:e).
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1893
		self at:e put:temp
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1894
	    ].
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1895
	    b := b + 1.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1896
	    e := e - 1
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1897
	]
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1898
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1899
    (begin < e) ifTrue:[self quickSortFrom:begin to:e].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1900
    (b < end) ifTrue:[self quickSortFrom:b to:end]
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1901
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1902
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1903
quickSortFrom:begin to:end with:aCollection
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1904
    "actual quicksort worker for sortWith-message"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1905
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1906
    |b "{ Class: SmallInteger }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1907
     e "{ Class: SmallInteger }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1908
     middleElement temp |
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1909
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1910
    b := begin.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1911
    e := end.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1912
    middleElement := self at:((b + e) // 2).
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1913
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1914
    [b < e] whileTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1915
	[b < end and:[(self at:b) < middleElement]] whileTrue:[b := b + 1].
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1916
	[e > begin and:[middleElement < (self at:e)]] whileTrue:[e := e - 1].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1917
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1918
	(b <= e) ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1919
	    (b == e) ifFalse:[
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1920
		temp := self at:b.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1921
		self at:b put:(self at:e).
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1922
		self at:e put:temp.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1923
		temp := aCollection at:b.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1924
		aCollection at:b put:(aCollection at:e).
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1925
		aCollection at:e put:temp
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1926
	    ].
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1927
	    b := b + 1.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1928
	    e := e - 1
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1929
	]
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1930
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1931
    (begin < e) ifTrue:[self quickSortFrom:begin to:e with:aCollection].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1932
    (b < end) ifTrue:[self quickSortFrom:b to:end with:aCollection]
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1933
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1934
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1935
quickSortFrom:begin to:end sortBlock:sortBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1936
    "actual quicksort worker for sort:-message"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1937
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1938
    |b "{ Class: SmallInteger }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1939
     e "{ Class: SmallInteger }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1940
     middleElement temp |
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1941
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1942
    b := begin.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1943
    e := end.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1944
    middleElement := self at:((b + e) // 2).
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1945
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1946
    [b < e] whileTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1947
	[b < end and:[sortBlock value:(self at:b) value:middleElement]] whileTrue:[b := b + 1].
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1948
	[e > begin and:[sortBlock value:middleElement value:(self at:e)]] whileTrue:[e := e - 1].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1949
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1950
	(b <= e) ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1951
	    (b == e) ifFalse:[
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1952
		temp := self at:b.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1953
		self at:b put:(self at:e).
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1954
		self at:e put:temp
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1955
	    ].
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1956
	    b := b + 1.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1957
	    e := e - 1
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1958
	]
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1959
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1960
    (begin < e) ifTrue:[self quickSortFrom:begin to:e sortBlock:sortBlock].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1961
    (b < end) ifTrue:[self quickSortFrom:b to:end sortBlock:sortBlock]
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1962
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1963
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1964
quickSortFrom:begin to:end sortBlock:sortBlock with:aCollection
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1965
    "actual quicksort worker for sort:with:-message"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1966
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1967
    |b "{ Class: SmallInteger }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1968
     e "{ Class: SmallInteger }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1969
     middleElement temp |
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1970
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1971
    b := begin.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1972
    e := end.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1973
    middleElement := self at:((b + e) // 2).
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1974
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1975
    [b < e] whileTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1976
	[b < end and:[sortBlock value:(self at:b) value:middleElement]] whileTrue:[b := b + 1].
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1977
	[e > begin and:[sortBlock value:middleElement value:(self at:e)]] whileTrue:[e := e - 1].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1978
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1979
	(b <= e) ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1980
	    (b == e) ifFalse:[
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1981
		temp := self at:b.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1982
		self at:b put:(self at:e).
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1983
		self at:e put:temp.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1984
		temp := aCollection at:b.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1985
		aCollection at:b put:(aCollection at:e).
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1986
		aCollection at:e put:temp
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1987
	    ].
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1988
	    b := b + 1.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1989
	    e := e - 1
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1990
	]
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1991
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1992
    (begin < e) ifTrue:[self quickSortFrom:begin to:e sortBlock:sortBlock with:aCollection].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1993
    (b < end) ifTrue:[self quickSortFrom:b to:end sortBlock:sortBlock with:aCollection]
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1994
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1995
69
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
  1996
topologicalSort:sortBlock
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
  1997
    "sort the collection inplace using a sloooow sort algorithm.
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  1998
     This algorithm has O-square runtime behavior and should be used only
69
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
  1999
     in special situations.
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
  2000
     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
  2001
     a>c (for example, to sort classes by inheritance)
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2002
69
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
  2003
     In other situations, use #sort; which implements the quicksort algorithm.
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
  2004
    "
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
  2005
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
  2006
    |smallestIndex "{ Class: SmallInteger }"
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
  2007
     end           "{ Class: SmallInteger }"
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
  2008
     smallest thisOne|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2009
77
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  2010
    "this is just a q&d hack - there must be better implementations for this ;-)"
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  2011
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  2012
    end := self size.
69
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
  2013
    1 to:end do:[:index |
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  2014
	smallest := self at:index.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  2015
	smallestIndex := index.
69
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
  2016
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  2017
	(index + 1) to:end do:[:index2 |
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  2018
	    thisOne := self at:index2.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  2019
	    (sortBlock value:thisOne value:smallest) ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  2020
		smallestIndex := index2.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  2021
		smallest := thisOne
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  2022
	    ].
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  2023
	].
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  2024
	(smallestIndex ~~ index) ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  2025
	    thisOne := self at:index.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  2026
	    self at:index put:smallest.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  2027
	    self at:smallestIndex put:thisOne
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  2028
	].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2029
    ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2030
69
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
  2031
    "
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  2032
     #(1 16 7 98 3 19 4 0) topologicalSort:[:a :b | a < b]   
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  2033
     #(1 16 7 98 3 19 4 0) sort:[:a :b | a < b]              
77
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  2034
     Smalltalk allClasses asArray topologicalSort:[:a :b | b isSubclassOf:a] 
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  2035
     Smalltalk allClasses asArray sort:[:a :b | b isSubclassOf:a] 
69
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
  2036
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2037
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2038
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2039
sort
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2040
    "sort the collection inplace. The elements are compared using
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  2041
     > and < i.e. they should offer a magnitude-like protocol.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  2042
     The implementation uses the quicksort algorithm, which may not be
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  2043
     the best possible for all situations."
13
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
  2044
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  2045
    |stop|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2046
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  2047
    stop := self size.
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  2048
    (stop > 1) ifTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  2049
	self quickSortFrom:1 to:stop
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2050
    ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2051
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  2052
    "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  2053
     #(1 16 7 98 3 19 4 0) sort
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  2054
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  2055
     |data|
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  2056
     data := Random new next:100000.
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  2057
     'random  ' print. (Time millisecondsToRun:[data sort]) printNL.
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  2058
     'sorted  ' print. (Time millisecondsToRun:[data sort]) printNL.
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  2059
     data reverse. 
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  2060
     'reverse ' print. (Time millisecondsToRun:[data sort]) printNL.
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  2061
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2062
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2063
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2064
sort:sortBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2065
    "sort the collection inplace using the 2-arg block sortBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2066
     for comparison. This allows any sort criteria to be implemented."
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2067
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  2068
    |stop|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2069
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  2070
    stop := self size.
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  2071
    (stop > 1) ifTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  2072
	self quickSortFrom:1 to:stop sortBlock:sortBlock
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2073
    ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2074
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  2075
    "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  2076
     #(1 16 7 98 3 19 4 0) sort:[:a :b | a < b]
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  2077
     #(1 16 7 98 3 19 4 0) sort:[:a :b | a > b]
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  2078
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2079
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2080
69
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
  2081
sortWith:aCollection
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
  2082
    "sort the receiver collection inplace, also sort aCollection with it.
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
  2083
     Use, when you have a key collection to sort another collection with."
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
  2084
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
  2085
    |stop|
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
  2086
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
  2087
    stop := self size.
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
  2088
    (stop > 1) ifTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  2089
	self quickSortFrom:1 to:stop with:aCollection
69
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
  2090
    ]
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
  2091
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
  2092
    "
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
  2093
     |c1 c2|
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
  2094
     c1 := #(1 16 7 9).
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
  2095
     c2 := #('one' 'sixteen' 'seven' 'nine').
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
  2096
     c1 sortWith:c2.
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  2097
     c1 printNL.
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  2098
     c2 printNL
69
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
  2099
    "
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
  2100
!
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
  2101
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2102
sort:sortBlock with:aCollection
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2103
    "sort the collection inplace using the 2-arg block sortBlock
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  2104
     for comparison. Also reorder the elements in aCollection.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  2105
     Use, when you have a key collection to sort some other collection with."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2106
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  2107
    |stop|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2108
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  2109
    stop := self size.
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  2110
    (stop > 1) ifTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  2111
	self quickSortFrom:1 to:stop sortBlock:sortBlock with:aCollection
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2112
    ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2113
69
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
  2114
    "
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
  2115
     |c1 c2|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2116
     c1 := #(1 16 7 9).
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2117
     c2 := #('one' 'sixteen' 'seven' 'nine').
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2118
     c1 sort:[:a :b | a > b] with:c2.
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  2119
     c1 printNL.
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  2120
     c2 printNL
69
4564b6328136 *** empty log message ***
claus
parents: 61
diff changeset
  2121
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2122
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2123
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2124
!SequenceableCollection methodsFor:'enumerating'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2125
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2126
do:aBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2127
    "evaluate the argument, aBlock for every element in the collection."
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2128
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  2129
    |stop "{ Class:SmallInteger }"|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2130
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  2131
    stop := self size.
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  2132
    1 to:stop do:[:index |
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  2133
	aBlock value:(self at:index).
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2134
    ]
77
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  2135
    "
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  2136
     #(one two three four five six) do:[:element | Transcript showCr:element]
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  2137
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2138
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2139
356
claus
parents: 348
diff changeset
  2140
pairWiseDo:aBlock
claus
parents: 348
diff changeset
  2141
    "evaluate the argument, aBlock for every pair of elements in the collection.
claus
parents: 348
diff changeset
  2142
     The block is called with 2 arguments for each 2 elements in the receiver.
claus
parents: 348
diff changeset
  2143
     An error will be reported, if the number of elements in the receiver
claus
parents: 348
diff changeset
  2144
     is not a multiple of 2."
claus
parents: 348
diff changeset
  2145
claus
parents: 348
diff changeset
  2146
    |stop "{ Class:SmallInteger }"|
claus
parents: 348
diff changeset
  2147
claus
parents: 348
diff changeset
  2148
    stop := self size.
claus
parents: 348
diff changeset
  2149
    1 to:stop by:2 do:[:index |
claus
parents: 348
diff changeset
  2150
	aBlock value:(self at:index) value:(self at:index+1).
claus
parents: 348
diff changeset
  2151
    ]
claus
parents: 348
diff changeset
  2152
    "
claus
parents: 348
diff changeset
  2153
     #(1 one 2 two 3 three 4 four 5 five 6 six) 
claus
parents: 348
diff changeset
  2154
     pairWiseDo:[:num :sym | Transcript show:num; show:' is: '; showCr:sym]
claus
parents: 348
diff changeset
  2155
claus
parents: 348
diff changeset
  2156
claus
parents: 348
diff changeset
  2157
     #(1 1  1 2  1 3  1 4  1 5) 
claus
parents: 348
diff changeset
  2158
     pairWiseDo:[:x :y | Transcript showCr:x@y]
claus
parents: 348
diff changeset
  2159
    "
claus
parents: 348
diff changeset
  2160
!
claus
parents: 348
diff changeset
  2161
3
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  2162
keysAndValuesDo:aTwoArgBlock
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  2163
    "evaluate the argument, aBlock for every element in the collection,
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  2164
     passing both index and element as arguments."
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  2165
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  2166
    |stop  "{ Class:SmallInteger }"|
3
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  2167
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  2168
    stop := self size.
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  2169
    1 to:stop do:[:index |
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  2170
	aTwoArgBlock value:index value:(self at:index).
3
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  2171
    ]
77
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  2172
    "
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  2173
     #(one two three four five six) keysAndValuesDo:[:key :element | Transcript show:key; space; showCr:element]
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  2174
    "
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  2175
!
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  2176
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  2177
with:aSequenceableCollection do:aTwoArgBlock
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  2178
    "evaluate the argument, aBlock for successive elements from
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  2179
     each the receiver and the argument, aSequenceableCollection.
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  2180
     The second argument, aBlock must be a two-argument block.
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  2181
     The collection argument must implement access via a numeric key."
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  2182
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  2183
    |stop  "{ Class: SmallInteger }" |
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  2184
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  2185
    stop := self size.
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  2186
    1 to:stop do:[:index |
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  2187
	aTwoArgBlock value:(self at:index) value:(aSequenceableCollection at:index).
77
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  2188
    ]
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  2189
    "
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  2190
     #(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
  2191
    "
3
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  2192
!
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  2193
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2194
from:index1 to:index2 do:aBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2195
    "evaluate the argument, aBlock for the elements with index index1 to
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2196
     index2 in the collection"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2197
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  2198
    |start "{ Class:SmallInteger }"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2199
     stop  "{ Class:SmallInteger }" |
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2200
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  2201
    start := index1.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2202
    stop := index2.
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  2203
    start to:stop do:[:index |
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  2204
	aBlock value:(self at:index).
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2205
    ]
77
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  2206
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  2207
    "
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  2208
     #(one two three four five six) from:3 to:5 do:[:element | Transcript showCr:element]
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  2209
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2210
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2211
424
claus
parents: 422
diff changeset
  2212
from:startIndex do:aBlock
claus
parents: 422
diff changeset
  2213
    "evaluate the argument, aBlock for the elements starting with the
claus
parents: 422
diff changeset
  2214
     element at startIndex to the end."
claus
parents: 422
diff changeset
  2215
claus
parents: 422
diff changeset
  2216
    ^ self from:startIndex to:self size do:aBlock
claus
parents: 422
diff changeset
  2217
claus
parents: 422
diff changeset
  2218
    "
claus
parents: 422
diff changeset
  2219
     #(one two three four five six) from:3 do:[:element | Transcript showCr:element]
claus
parents: 422
diff changeset
  2220
    "
claus
parents: 422
diff changeset
  2221
!
claus
parents: 422
diff changeset
  2222
42
e33491f6f260 *** empty log message ***
claus
parents: 32
diff changeset
  2223
from:index1 to:index2 reverseDo:aBlock
e33491f6f260 *** empty log message ***
claus
parents: 32
diff changeset
  2224
    "evaluate the argument, aBlock for the elements with index index1 to
e33491f6f260 *** empty log message ***
claus
parents: 32
diff changeset
  2225
     index2 in the collection. Step in reverse order"
e33491f6f260 *** empty log message ***
claus
parents: 32
diff changeset
  2226
e33491f6f260 *** empty log message ***
claus
parents: 32
diff changeset
  2227
    |start "{ Class:SmallInteger }"
e33491f6f260 *** empty log message ***
claus
parents: 32
diff changeset
  2228
     stop  "{ Class:SmallInteger }" |
e33491f6f260 *** empty log message ***
claus
parents: 32
diff changeset
  2229
e33491f6f260 *** empty log message ***
claus
parents: 32
diff changeset
  2230
    start := index1.
e33491f6f260 *** empty log message ***
claus
parents: 32
diff changeset
  2231
    stop := index2.
e33491f6f260 *** empty log message ***
claus
parents: 32
diff changeset
  2232
    stop to:start by:-1 do:[:index |
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  2233
	aBlock value:(self at:index).
42
e33491f6f260 *** empty log message ***
claus
parents: 32
diff changeset
  2234
    ]
e33491f6f260 *** empty log message ***
claus
parents: 32
diff changeset
  2235
77
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  2236
    "
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  2237
     #(one two three four five six) from:3 to:5 reverseDo:[:element | Transcript showCr:element]
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  2238
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2239
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2240
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2241
reverseDo:aBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2242
    "evaluate the argument, aBlock for every element in the collection
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2243
     in reverse order"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2244
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  2245
    |sz  "{ Class:SmallInteger }"|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2246
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  2247
    sz := self size.
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  2248
    sz to:1 by:-1 do:[:index |
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  2249
	aBlock value:(self at:index).
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2250
    ]
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  2251
77
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  2252
    "
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  2253
     #(one two three four five six) reverseDo:[:element | Transcript showCr:element]
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  2254
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2255
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2256
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2257
collect:aBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2258
    "evaluate the argument, aBlock for every element in the collection
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2259
     and return a collection of the results"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2260
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2261
    |newCollection
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  2262
     sz  "{ Class:SmallInteger }"|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2263
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  2264
    sz := self size.
252
  2265
    newCollection := self copyEmptyAndGrow:sz.
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  2266
    1 to:sz do:[:index |
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  2267
	newCollection at:index put:(aBlock value:(self at:index)).
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2268
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2269
    ^ newCollection
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  2270
77
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  2271
    "
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  2272
     #(one two three four five six) collect:[:element | element asUppercase]  
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  2273
     #(1 2 3 4 5 6 7 8 9) collect:[:element | element factorial]   
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  2274
     (1 to:9) collect:[:element | element * element]   
77
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  2275
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2276
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2277
356
claus
parents: 348
diff changeset
  2278
pairWiseCollect:aBlock
claus
parents: 348
diff changeset
  2279
    "evaluate the argument, aBlock for every pair of elements in the collection.
claus
parents: 348
diff changeset
  2280
     The block is called with 2 arguments for each 2 elements in the receiver.
claus
parents: 348
diff changeset
  2281
     An error will be reported, if the number of elements in the receiver
claus
parents: 348
diff changeset
  2282
     is not a multiple of 2.
claus
parents: 348
diff changeset
  2283
     Collect the results and return a new collection containing those."
claus
parents: 348
diff changeset
  2284
claus
parents: 348
diff changeset
  2285
    |stop newCollection dstIdx "{ Class:SmallInteger }"|
claus
parents: 348
diff changeset
  2286
claus
parents: 348
diff changeset
  2287
    stop := self size.
claus
parents: 348
diff changeset
  2288
    newCollection := self copyEmptyAndGrow:stop // 2.
claus
parents: 348
diff changeset
  2289
    dstIdx := 1.
claus
parents: 348
diff changeset
  2290
    1 to:stop by:2 do:[:index |
claus
parents: 348
diff changeset
  2291
	newCollection at:dstIdx put:(aBlock value:(self at:index) value:(self at:index+1)).
claus
parents: 348
diff changeset
  2292
	dstIdx := dstIdx + 1
claus
parents: 348
diff changeset
  2293
    ].
claus
parents: 348
diff changeset
  2294
    ^ newCollection
claus
parents: 348
diff changeset
  2295
claus
parents: 348
diff changeset
  2296
    "
claus
parents: 348
diff changeset
  2297
     #(1 one 2 two 3 three 4 four 5 five 6 six) 
claus
parents: 348
diff changeset
  2298
     pairWiseCollect:[:num :sym | sym->num] 
claus
parents: 348
diff changeset
  2299
claus
parents: 348
diff changeset
  2300
claus
parents: 348
diff changeset
  2301
     #(1 1  1 2  1 3  1 4  1 5) 
claus
parents: 348
diff changeset
  2302
     pairWiseCollect:[:x :y | x@y] 
claus
parents: 348
diff changeset
  2303
    "
claus
parents: 348
diff changeset
  2304
!
claus
parents: 348
diff changeset
  2305
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  2306
from:start to:stop collect:aBlock
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  2307
    "evaluate the argument, aBlock for the elements indexed by start
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  2308
     to stop in the collection and return a collection of the results"
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  2309
202
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
  2310
    |newCollection sz
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  2311
     idx  "{ Class:SmallInteger }"|
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  2312
202
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
  2313
    sz := stop - start + 1.
252
  2314
    newCollection := self copyEmptyAndGrow:sz.
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  2315
    idx := 1.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  2316
    start to:stop do:[:index |
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  2317
	newCollection at:idx put:(aBlock value:(self at:index)).
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  2318
	idx := idx + 1
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  2319
    ].
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  2320
    ^ newCollection
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  2321
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  2322
    "
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  2323
     #(one two three four five six) from:2 to:4 collect:[:element | element asUppercase]  
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  2324
    "
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  2325
!
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  2326
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2327
select:aBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2328
    "evaluate the argument, aBlock for every element in the collection
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2329
     and return a collection of all elements for which the block return
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2330
     true"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2331
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  2332
    |element newColl species needCopy
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  2333
     sz  "{ Class:SmallInteger }"|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2334
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  2335
    sz := self size.
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  2336
    species := self species.
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  2337
    species growIsCheap ifFalse:[
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  2338
	newColl := OrderedCollection new:sz.
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  2339
	needCopy := true
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  2340
    ] ifTrue:[
202
40ca7cc6fb9c *** empty log message ***
claus
parents: 186
diff changeset
  2341
	newColl := self copyEmpty:sz.
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  2342
	needCopy := false
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  2343
    ].
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  2344
    1 to:sz do:[:index |
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  2345
	element := self at:index.
252
  2346
	(aBlock value:element) ifTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  2347
	    newColl add:element
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  2348
	].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2349
    ].
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  2350
    needCopy ifTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  2351
	newColl := (species withAll:newColl) postCopyFrom:self
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  2352
    ].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2353
    ^ newColl
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  2354
77
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  2355
    "
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  2356
     #(one two three four five six) select:[:element | element startsWith:'f']   
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  2357
     #(1 2 3 4 5 6 7 8 9) select:[:element | element odd]   
159
514c749165c3 *** empty log message ***
claus
parents: 118
diff changeset
  2358
     (#(17 12 1 98 51) asSortedCollection:[:a :b | b < a]) select:[:element | element odd]   
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  2359
     (1 to:9) select:[:element | element odd]   
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  2360
     (Smalltalk allClasses) select:[:class | class name startsWith:'S']   
77
6c38ca59927f *** empty log message ***
claus
parents: 69
diff changeset
  2361
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2362
! !