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