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