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