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