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