OrderedSet.st
author Stefan Vogel <sv@exept.de>
Tue, 28 Apr 2020 16:22:44 +0200
changeset 25376 88a3329875ba
parent 25065 d341dc629f81
permissions -rw-r--r--
#REFACTORING by stefan class: MethodDictionary class removed: #newWithCapacity: moved to superclass
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
24618
1cb472ae5a65 #DOCUMENTATION by exept
Claus Gittinger <cg@exept.de>
parents: 24177
diff changeset
     1
"{ Encoding: utf8 }"
1cb472ae5a65 #DOCUMENTATION by exept
Claus Gittinger <cg@exept.de>
parents: 24177
diff changeset
     2
15143
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
     3
"
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
     4
 COPYRIGHT (c) 2001 by eXept Software AG
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
     5
              All Rights Reserved
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
     6
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
     7
 This software is furnished under a license and may be used
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
     8
 only in accordance with the terms of that license and with the
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
     9
 inclusion of the above copyright notice.   This software may not
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    10
 be provided or otherwise made available to, or used by, any
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    11
 other person.  No title to or ownership of the software is
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    12
 hereby transferred.
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    13
"
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    14
"{ Package: 'stx:libbasic' }"
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    15
17411
d3afe64aadcb class: OrderedSet
Stefan Vogel <sv@exept.de>
parents: 16809
diff changeset
    16
"{ NameSpace: Smalltalk }"
d3afe64aadcb class: OrderedSet
Stefan Vogel <sv@exept.de>
parents: 16809
diff changeset
    17
15143
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    18
Set subclass:#OrderedSet
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    19
	instanceVariableNames:'order'
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    20
	classVariableNames:''
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    21
	poolDictionaries:''
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    22
	category:'Collections-Sequenceable'
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    23
!
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    24
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    25
!OrderedSet class methodsFor:'documentation'!
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    26
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    27
copyright
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    28
"
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    29
 COPYRIGHT (c) 2001 by eXept Software AG
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    30
              All Rights Reserved
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    31
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    32
 This software is furnished under a license and may be used
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    33
 only in accordance with the terms of that license and with the
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    34
 inclusion of the above copyright notice.   This software may not
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    35
 be provided or otherwise made available to, or used by, any
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    36
 other person.  No title to or ownership of the software is
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    37
 hereby transferred.
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    38
"
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    39
!
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    40
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    41
documentation
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    42
"
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    43
    I am a subclass of Set whose elements are ordered in a
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    44
    similar fashion to OrderedCollection.
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    45
    That is, I have both Set behavior (only keeping a single instance of
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    46
    an element) but I also remember the original order, in which elements
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    47
    were added.
20632
7c6a436e1c89 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 17411
diff changeset
    48
    Therefore, this combines fast access/check/add via hashing with a defined 
7c6a436e1c89 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 17411
diff changeset
    49
    order when enumerating.
15143
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    50
20632
7c6a436e1c89 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 17411
diff changeset
    51
    [instance variables:]
7c6a436e1c89 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 17411
diff changeset
    52
        order <OrderedCollection>       Ordered collection of values reflecting the order 
7c6a436e1c89 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 17411
diff changeset
    53
                                        in the set. 
15143
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    54
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    55
    [author:]
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    56
        Claus Gittinger
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    57
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    58
    [see also:]
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    59
        OrderedCollection 
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    60
        Dictionary OrderedDictionary
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    61
        Set Bag
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    62
"
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    63
!
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    64
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    65
examples
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    66
"
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    67
                                                                    [exBegin]
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    68
        |s|
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    69
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    70
        s := OrderedSet new.
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    71
        s add:'one'.
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    72
        s add:'two'.
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    73
        s add:'one'.
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    74
        s add:'two'.
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    75
        s add:'three'.
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    76
        s size.         
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    77
        s do:[:each | Transcript showCR:each].         
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    78
                                                                    [exEnd]
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    79
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    80
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    81
                                                                    [exBegin]
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    82
        |s|
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    83
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    84
        s := OrderedSet new.
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    85
        s add:'one'.
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    86
        s add:'two'.
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    87
        s add:'one'.
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    88
        s add:'two'.
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    89
        s add:'three'.
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    90
        s remove:'one'.
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    91
        s size.         
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    92
        s do:[:each | Transcript showCR:each].         
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    93
                                                                    [exEnd]
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    94
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    95
                                                                    [exBegin]
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    96
        |s|
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    97
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    98
        s := OrderedSet new.
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    99
        s add:'one'.
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   100
        s addFirst:'two'.
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   101
        s addFirst:'three'.
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   102
        s add:'one'.
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   103
        s add:'two'.
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   104
        s add:'three'.
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   105
        s size.         
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   106
        s do:[:each | Transcript showCR:each].         
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   107
                                                                    [exEnd]
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   108
"
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   109
! !
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   110
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   111
!OrderedSet class methodsFor:'instance creation'!
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   112
21219
31ce02101bb7 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 20632
diff changeset
   113
new:anInteger
31ce02101bb7 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 20632
diff changeset
   114
    ^ (super new:anInteger) initializeOrder:anInteger
15143
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   115
! !
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   116
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   117
!OrderedSet methodsFor:'accessing'!
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   118
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   119
at:index
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   120
    "return the indexed instance variable with index, anInteger.
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   121
     Report an error, if the index is wrong."
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   122
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   123
    ^ order at:index
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   124
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   125
    "Modified: / 16.11.2001 / 10:27:40 / cg"
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   126
!
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   127
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   128
at:index ifAbsent:exceptionalValue
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   129
    "return the indexed instance variable with index, anInteger.
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   130
     If not present, return the value from exceptionalValue."
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   131
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   132
    ^ order at:index ifAbsent:exceptionalValue
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   133
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   134
    "Modified: / 16.11.2001 / 10:27:40 / cg"
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   135
!
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   136
24081
916a16fd5889 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 24080
diff changeset
   137
atIndex:index
916a16fd5889 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 24080
diff changeset
   138
    ^ order at:index
916a16fd5889 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 24080
diff changeset
   139
916a16fd5889 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 24080
diff changeset
   140
    "Created: / 15-04-2019 / 19:14:27 / Stefan Vogel"
916a16fd5889 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 24080
diff changeset
   141
!
916a16fd5889 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 24080
diff changeset
   142
24083
2c2aa640efbc #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 24081
diff changeset
   143
atIndex:index ifAbsent:exceptionalValue
24081
916a16fd5889 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 24080
diff changeset
   144
    "return an element at a given index"
916a16fd5889 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 24080
diff changeset
   145
24083
2c2aa640efbc #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 24081
diff changeset
   146
    ^ order at:index ifAbsent:exceptionalValue
24081
916a16fd5889 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 24080
diff changeset
   147
916a16fd5889 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 24080
diff changeset
   148
    "Created: / 15-04-2019 / 19:18:01 / Stefan Vogel"
916a16fd5889 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 24080
diff changeset
   149
!
916a16fd5889 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 24080
diff changeset
   150
15143
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   151
order
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   152
    "returns the values in the order of their appearance"
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   153
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   154
    ^ order
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   155
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   156
    "
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   157
     |s|
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   158
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   159
     s := OrderedSet new.
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   160
     s add:'aaa'; add:'bbb'; add:'ccc'; add:'ddd'; add:'aaa'.
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   161
     s order
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   162
    "
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   163
! !
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   164
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   165
!OrderedSet methodsFor:'adding & removing'!
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   166
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   167
add:anObject 
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   168
    "Add anObject to the receiver (if not already included). 
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   169
     Also, remember in the order (i.e. add to the end)
15878
ed345dd0ab0c class: OrderedSet
Stefan Vogel <sv@exept.de>
parents: 15143
diff changeset
   170
     If anObject is already present in the set,
15143
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   171
     the order will not be changed. (See also: #addLast:)"
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   172
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   173
    (super testAndAdd:anObject) ifFalse:[
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   174
        order add:anObject.
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   175
    ].
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   176
    ^ anObject
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   177
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   178
    "
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   179
        self new 
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   180
                add:1;
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   181
                add:2;
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   182
                add:nil;
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   183
                add:1;
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   184
                yourself
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   185
    "
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   186
!
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   187
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   188
addFirst:anObject 
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   189
    "Add anObject to the receiver (if not already included). 
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   190
     Also, remember in the order (i.e. add to the beginning)"
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   191
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   192
    |oldObject|
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   193
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   194
    (self includes:anObject) ifTrue:[
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   195
        "/ must either remove the old one from both and add the new one to both,
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   196
        "/ or ensure that the old one is also in the order.
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   197
        "/ otherwise, the constraint that the object in the set and the one in the order
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   198
        "/ must be identical could be broken.
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   199
        oldObject := order remove:anObject.
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   200
    ] ifFalse:[
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   201
        oldObject := super add:anObject.
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   202
    ].
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   203
    order addFirst:oldObject.
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   204
    ^ anObject
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   205
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   206
    "
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   207
        self new 
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   208
                addFirst:1;
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   209
                addFirst:nil;
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   210
                yourself
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   211
    "
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   212
!
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   213
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   214
addLast:anObject 
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   215
    "Add anObject to the receiver (if not already included). 
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   216
     Also, remember in the order (i.e. add to the end)
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   217
     If anAssociation is already present in the receiver,
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   218
     it will be moved to the end. (See also: #add:)"
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   219
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   220
    |oldObject|
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   221
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   222
    (self includes:anObject) ifTrue:[
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   223
        oldObject := order remove:anObject.
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   224
    ] ifFalse:[
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   225
        oldObject := super add:anObject.
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   226
    ].
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   227
    order add:oldObject.
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   228
    ^ anObject
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   229
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   230
    "
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   231
        self new 
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   232
                addLast:1;
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   233
                addLast:nil;
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   234
                yourself
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   235
    "
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   236
!
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   237
23190
611aa626a4a4 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23135
diff changeset
   238
addOrReplace:anObject 
611aa626a4a4 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23135
diff changeset
   239
    "Add the argument, anObject to the receiver.
611aa626a4a4 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23135
diff changeset
   240
     If it is already included, replace it by anObject.
611aa626a4a4 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23135
diff changeset
   241
     Return nil, if anObject was not present in the receiver, 
611aa626a4a4 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23135
diff changeset
   242
     otherwise the element that has been replaced.
24618
1cb472ae5a65 #DOCUMENTATION by exept
Claus Gittinger <cg@exept.de>
parents: 24177
diff changeset
   243
     Notice: this sounds like a useless operation, but because sets compare by equality, 
1cb472ae5a65 #DOCUMENTATION by exept
Claus Gittinger <cg@exept.de>
parents: 24177
diff changeset
   244
             the old object may be replaced by another object when equeal, but not identical.
1cb472ae5a65 #DOCUMENTATION by exept
Claus Gittinger <cg@exept.de>
parents: 24177
diff changeset
   245
             For example, a string by a symbol or a float by an integer...
23190
611aa626a4a4 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23135
diff changeset
   246
611aa626a4a4 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23135
diff changeset
   247
     Also, remember in the order (i.e. add to the end)
611aa626a4a4 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23135
diff changeset
   248
     If anObject is already present in the set,
611aa626a4a4 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23135
diff changeset
   249
     the order will not be changed."
611aa626a4a4 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23135
diff changeset
   250
611aa626a4a4 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23135
diff changeset
   251
    |oldObject|
611aa626a4a4 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23135
diff changeset
   252
611aa626a4a4 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23135
diff changeset
   253
    oldObject := super addOrReplace:anObject.
611aa626a4a4 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23135
diff changeset
   254
    oldObject ~~ anObject ifTrue:[
611aa626a4a4 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23135
diff changeset
   255
        oldObject isNil ifTrue:[
611aa626a4a4 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23135
diff changeset
   256
            order add:anObject.
611aa626a4a4 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23135
diff changeset
   257
        ] ifFalse:[
611aa626a4a4 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23135
diff changeset
   258
            order replaceAll:oldObject with:anObject.
611aa626a4a4 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23135
diff changeset
   259
        ].
611aa626a4a4 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23135
diff changeset
   260
    ].
611aa626a4a4 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23135
diff changeset
   261
    ^ oldObject
611aa626a4a4 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23135
diff changeset
   262
611aa626a4a4 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23135
diff changeset
   263
    "
611aa626a4a4 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23135
diff changeset
   264
        Note that 1 is replaced by 1.0, but 1.0 is still at the beginning:
611aa626a4a4 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23135
diff changeset
   265
611aa626a4a4 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23135
diff changeset
   266
        self new 
611aa626a4a4 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23135
diff changeset
   267
                addOrReplace:1;
611aa626a4a4 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23135
diff changeset
   268
                addOrReplace:2;
611aa626a4a4 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23135
diff changeset
   269
                addOrReplace:nil;
611aa626a4a4 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23135
diff changeset
   270
                addOrReplace:1.0;
611aa626a4a4 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23135
diff changeset
   271
                yourself
611aa626a4a4 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23135
diff changeset
   272
    "
611aa626a4a4 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23135
diff changeset
   273
611aa626a4a4 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23135
diff changeset
   274
    "Created: / 03-07-2018 / 19:12:07 / Stefan Vogel"
611aa626a4a4 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23135
diff changeset
   275
    "Modified (comment): / 03-07-2018 / 23:39:04 / Stefan Vogel"
611aa626a4a4 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23135
diff changeset
   276
!
611aa626a4a4 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23135
diff changeset
   277
17411
d3afe64aadcb class: OrderedSet
Stefan Vogel <sv@exept.de>
parents: 16809
diff changeset
   278
clearContents
d3afe64aadcb class: OrderedSet
Stefan Vogel <sv@exept.de>
parents: 16809
diff changeset
   279
    "remove all elements from the receiver, but do not shrink. Returns the receiver."
d3afe64aadcb class: OrderedSet
Stefan Vogel <sv@exept.de>
parents: 16809
diff changeset
   280
d3afe64aadcb class: OrderedSet
Stefan Vogel <sv@exept.de>
parents: 16809
diff changeset
   281
    super clearContents.
d3afe64aadcb class: OrderedSet
Stefan Vogel <sv@exept.de>
parents: 16809
diff changeset
   282
    order clearContents.
d3afe64aadcb class: OrderedSet
Stefan Vogel <sv@exept.de>
parents: 16809
diff changeset
   283
!
d3afe64aadcb class: OrderedSet
Stefan Vogel <sv@exept.de>
parents: 16809
diff changeset
   284
15143
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   285
remove:oldObject ifAbsent:exceptionValueProvider
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   286
    "remove oldObject from the collection and return it.
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   287
     If it was not in the collection return the value of exceptionValueProvider.
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   288
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   289
     WARNING: do not remove elements while iterating over the receiver."
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   290
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   291
    |removedObject|
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   292
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   293
    removedObject := super remove:oldObject 
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   294
                           ifAbsent:[ ^ exceptionValueProvider value].      
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   295
    order removeIdentical:removedObject.
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   296
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   297
    ^ removedObject
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   298
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   299
    "
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   300
        OrderedSet new remove:nil
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   301
    "
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   302
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   303
    "Modified: / 16.11.2001 / 10:21:07 / cg"
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   304
!
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   305
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   306
removeAll
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   307
    "remove all elements from the receiver. Returns the receiver."
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   308
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   309
    super removeAll.
21219
31ce02101bb7 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 20632
diff changeset
   310
    self initializeOrder:0.
15143
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   311
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   312
    "Created: / 16.11.2001 / 10:21:40 / cg"
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   313
!
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   314
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   315
removeFirst
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   316
    "remove the first object from the collection and return it.
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   317
     If it was not in the collection, raise an error.
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   318
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   319
     WARNING: do not remove elements while iterating over the receiver."
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   320
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   321
    ^ self removeFirstIfAbsent:[self emptyCollectionError].
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   322
!
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   323
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   324
removeFirstIfAbsent:exceptionalValue
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   325
    "remove the first object from the collection and return it.
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   326
     If it was not in the collection, return the value from exceptionalValue.
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   327
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   328
     WARNING: do not remove elements while iterating over the receiver."
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   329
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   330
    |element|
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   331
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   332
    order isEmpty ifTrue:[^ exceptionalValue value].
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   333
    element := order first.
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   334
    ^ self remove:element.
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   335
!
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   336
23135
752c53e34c53 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 22424
diff changeset
   337
removeIdentical:oldObject ifAbsent:exceptionValueProvider
752c53e34c53 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 22424
diff changeset
   338
    "remove oldObject from the collection and return it.
752c53e34c53 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 22424
diff changeset
   339
     If it was not in the collection return the value of exceptionValueProvider.
752c53e34c53 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 22424
diff changeset
   340
752c53e34c53 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 22424
diff changeset
   341
     WARNING: do not remove elements while iterating over the receiver."
752c53e34c53 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 22424
diff changeset
   342
752c53e34c53 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 22424
diff changeset
   343
    |removedObject|
752c53e34c53 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 22424
diff changeset
   344
752c53e34c53 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 22424
diff changeset
   345
    removedObject := super removeIdentical:oldObject 
752c53e34c53 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 22424
diff changeset
   346
                           ifAbsent:[ ^ exceptionValueProvider value].      
752c53e34c53 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 22424
diff changeset
   347
    order removeIdentical:removedObject.
752c53e34c53 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 22424
diff changeset
   348
752c53e34c53 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 22424
diff changeset
   349
    ^ removedObject
752c53e34c53 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 22424
diff changeset
   350
752c53e34c53 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 22424
diff changeset
   351
    "
752c53e34c53 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 22424
diff changeset
   352
     |s ef er|
752c53e34c53 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 22424
diff changeset
   353
752c53e34c53 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 22424
diff changeset
   354
     s := OrderedSet new. 
752c53e34c53 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 22424
diff changeset
   355
     s add:'abc'.
752c53e34c53 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 22424
diff changeset
   356
     s add:'def'.
752c53e34c53 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 22424
diff changeset
   357
     s add:'ghi'.
752c53e34c53 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 22424
diff changeset
   358
     ef := s detect:[:el | el = 'def'].
752c53e34c53 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 22424
diff changeset
   359
     er := s removeIdentical:ef.
752c53e34c53 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 22424
diff changeset
   360
     s addFirst:er.
752c53e34c53 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 22424
diff changeset
   361
     s
752c53e34c53 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 22424
diff changeset
   362
    "
752c53e34c53 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 22424
diff changeset
   363
752c53e34c53 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 22424
diff changeset
   364
    "Created: / 27-06-2018 / 08:08:28 / Claus Gittinger"
752c53e34c53 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 22424
diff changeset
   365
!
752c53e34c53 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 22424
diff changeset
   366
15143
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   367
removeLast
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   368
    "remove the last object from the collection and return it.
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   369
     If it was not in the collection, raise an error.
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   370
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   371
     WARNING: do not remove elements while iterating over the receiver."
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   372
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   373
    ^ self removeLastIfAbsent:[self emptyCollectionError].
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   374
!
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   375
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   376
removeLastIfAbsent:exceptionalValue
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   377
    "remove the last object from the collection and return it.
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   378
     If it was not in the collection, return the value from exceptionalValue.
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   379
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   380
     WARNING: do not remove elements while iterating over the receiver."
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   381
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   382
    |lastElement|
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   383
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   384
    order isEmpty ifTrue:[^ exceptionalValue value].
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   385
    lastElement := order last.
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   386
    ^ self remove:lastElement.
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   387
!
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   388
16516
c9a60c35224d class: OrderedSet
Stefan Vogel <sv@exept.de>
parents: 15878
diff changeset
   389
safeRemove:oldObject ifAbsent:exceptionValueProvider
15143
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   390
    "remove the element, oldObject from the collection.
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   391
     Return the element 
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   392
     (could be non-identical to oldObject, since I hash on equality, not on identity).
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   393
     If it was not in the collection return the value of exceptionValueProvider.
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   394
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   395
     In contrast to #remove:, this does not resize the underlying collection
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   396
     and therefore does NOT rehash & change the elements order.
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   397
     Therefor this can be used while enumerating the receiver,
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   398
     which is not possible if #remove: is used.
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   399
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   400
     WARNING: since no resizing is done, the physical amount of memory used
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   401
              by the container remains the same, although the logical size shrinks.
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   402
              You may want to manually resize the receiver using #emptyCheck.
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   403
              (after the loop)"
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   404
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   405
    |removedObject|
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   406
16516
c9a60c35224d class: OrderedSet
Stefan Vogel <sv@exept.de>
parents: 15878
diff changeset
   407
    removedObject := super safeRemove:oldObject ifAbsent:[^ exceptionValueProvider value].
15143
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   408
    order removeIdentical:removedObject.
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   409
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   410
    ^ removedObject
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   411
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   412
    "Created: / 16.11.2001 / 10:23:48 / cg"
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   413
    "Modified: / 16.11.2001 / 10:24:03 / cg"
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   414
!
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   415
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   416
testAndAdd:anObject 
21651
e55ca15b7c8d #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 21461
diff changeset
   417
    "Test, if the element is present in the receiver.
15143
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   418
     Answer true, if the element did already exist in the collection,
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   419
     false otherwise.
21651
e55ca15b7c8d #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 21461
diff changeset
   420
     If the element does not exist, add it to the collection.
15143
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   421
     Also, remember in the order (i.e. add to the end)
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   422
     If anObject is already present in the set,
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   423
     the order will not be changed. (See also: #addLast:)"
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   424
21460
9eb25f04ec5f #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21219
diff changeset
   425
    (super testAndAdd:anObject) ifTrue:[
9eb25f04ec5f #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21219
diff changeset
   426
        ^ true
15143
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   427
    ].
21460
9eb25f04ec5f #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21219
diff changeset
   428
    order add:anObject.
9eb25f04ec5f #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21219
diff changeset
   429
    ^ false.
9eb25f04ec5f #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21219
diff changeset
   430
9eb25f04ec5f #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21219
diff changeset
   431
    "Modified: / 16-02-2017 / 13:45:50 / stefan"
21651
e55ca15b7c8d #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 21461
diff changeset
   432
    "Modified (comment): / 16-03-2017 / 16:48:54 / stefan"
15143
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   433
! !
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   434
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   435
!OrderedSet methodsFor:'converting'!
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   436
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   437
asNewOrderedSet
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   438
    "make sure to return a unique new set"
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   439
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   440
    "could be an instance of a subclass..."
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   441
    self class == OrderedSet ifTrue:[
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   442
        ^ self copy
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   443
    ].
21461
f6d6d64a6a24 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21460
diff changeset
   444
    ^ self asOrderedSet
f6d6d64a6a24 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21460
diff changeset
   445
f6d6d64a6a24 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21460
diff changeset
   446
    "Modified: / 16-02-2017 / 14:24:00 / stefan"
15143
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   447
!
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   448
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   449
asOrderedSet
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   450
    "make sure to return a unique new set"
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   451
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   452
    "could be an instance of a subclass..."
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   453
    self class == OrderedSet ifTrue:[
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   454
        ^ self.
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   455
    ].
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   456
    ^ super asOrderedSet
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   457
! !
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   458
24177
4353bb77db07 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 24083
diff changeset
   459
!OrderedSet methodsFor:'copying-private'!
15143
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   460
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   461
postCopy
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   462
    "have to copy the keyArray too"
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   463
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   464
    super postCopy.
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   465
    order := order copy.
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   466
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   467
    "Created: / 16.11.2001 / 10:28:50 / cg"
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   468
! !
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   469
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   470
!OrderedSet methodsFor:'enumerating'!
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   471
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   472
do:aBlock 
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   473
    "Evaluate aBlock for each of the sets's values
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   474
     in the order they have been added."
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   475
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   476
    order do:aBlock
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   477
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   478
    "Modified: / 16.11.2001 / 10:04:00 / cg"
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   479
!
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   480
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   481
doWithIndex:aBlock 
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   482
    "Squeak/V'Age compatibility; 
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   483
     Evaluate aBlock for each of the sets's values and index
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   484
     in the order they have been added."
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   485
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   486
    order doWithIndex:aBlock
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   487
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   488
    "Created: / 09-11-2010 / 16:09:17 / cg"
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   489
!
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   490
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   491
reverseDo:aBlock 
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   492
    "Evaluate aBlock for each of the sets's values
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   493
     in the reverse order they have been added."
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   494
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   495
    order reverseDo:aBlock
22132
f694f25e1989 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21651
diff changeset
   496
!
f694f25e1989 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21651
diff changeset
   497
f694f25e1989 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21651
diff changeset
   498
withIndexDo:aBlock 
f694f25e1989 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21651
diff changeset
   499
    "evaluate the argument, aBlock for every element in the collection,
f694f25e1989 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21651
diff changeset
   500
     passing both element and index as arguments.
f694f25e1989 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21651
diff changeset
   501
     Same as doWithIndex:, due to parallel evolution of different Smalltalk dialects"
f694f25e1989 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21651
diff changeset
   502
f694f25e1989 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21651
diff changeset
   503
    order withIndexDo:aBlock
f694f25e1989 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21651
diff changeset
   504
f694f25e1989 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21651
diff changeset
   505
    "Created: / 31-07-2017 / 16:37:34 / stefan"
15143
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   506
! !
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   507
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   508
!OrderedSet methodsFor:'initialization'!
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   509
21219
31ce02101bb7 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 20632
diff changeset
   510
initializeOrder:count
31ce02101bb7 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 20632
diff changeset
   511
    order := OrderedCollection new:count
15143
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   512
! !
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   513
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   514
!OrderedSet methodsFor:'searching'!
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   515
16809
130ac3b00ad5 class: OrderedSet
Stefan Vogel <sv@exept.de>
parents: 16516
diff changeset
   516
findFirst:aBlock ifNone:exceptionValue
130ac3b00ad5 class: OrderedSet
Stefan Vogel <sv@exept.de>
parents: 16516
diff changeset
   517
    "find the index of the first element, for which evaluation of the argument, aBlock returns true; 
130ac3b00ad5 class: OrderedSet
Stefan Vogel <sv@exept.de>
parents: 16516
diff changeset
   518
     return its index or the value from exceptionValue if none detected.
130ac3b00ad5 class: OrderedSet
Stefan Vogel <sv@exept.de>
parents: 16516
diff changeset
   519
     This is much like #detect:ifNone:, however, here an INDEX is returned,
130ac3b00ad5 class: OrderedSet
Stefan Vogel <sv@exept.de>
parents: 16516
diff changeset
   520
     while #detect:ifNone: returns the element."
130ac3b00ad5 class: OrderedSet
Stefan Vogel <sv@exept.de>
parents: 16516
diff changeset
   521
130ac3b00ad5 class: OrderedSet
Stefan Vogel <sv@exept.de>
parents: 16516
diff changeset
   522
    ^ order findFirst:aBlock ifNone:exceptionValue.
130ac3b00ad5 class: OrderedSet
Stefan Vogel <sv@exept.de>
parents: 16516
diff changeset
   523
!
130ac3b00ad5 class: OrderedSet
Stefan Vogel <sv@exept.de>
parents: 16516
diff changeset
   524
21460
9eb25f04ec5f #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21219
diff changeset
   525
findLast:aBlock ifNone:exceptionValue
9eb25f04ec5f #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21219
diff changeset
   526
    "find the index of the last element, for which evaluation of the argument, aBlock returns true.
9eb25f04ec5f #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21219
diff changeset
   527
     Return its index or the value from exceptionValue if none detected."
9eb25f04ec5f #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21219
diff changeset
   528
9eb25f04ec5f #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21219
diff changeset
   529
    ^ order findLast:aBlock ifNone:exceptionValue.
9eb25f04ec5f #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21219
diff changeset
   530
9eb25f04ec5f #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21219
diff changeset
   531
    "Created: / 16-02-2017 / 13:55:43 / stefan"
9eb25f04ec5f #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21219
diff changeset
   532
!
9eb25f04ec5f #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21219
diff changeset
   533
15143
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   534
indexOf:anObject
22424
06582f583ee4 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 22132
diff changeset
   535
    "return the index of anObject or 0 if not found in the collection.
06582f583ee4 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 22132
diff changeset
   536
     Compare using ="
06582f583ee4 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 22132
diff changeset
   537
15143
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   538
    ^ order indexOf:anObject.
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   539
! !
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   540
24080
0cc60a09f225 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 23190
diff changeset
   541
!OrderedSet methodsFor:'testing'!
0cc60a09f225 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 23190
diff changeset
   542
0cc60a09f225 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 23190
diff changeset
   543
isOrdered
25065
d341dc629f81 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 24618
diff changeset
   544
    "return true, if the receiver's elements are ordered.
d341dc629f81 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 24618
diff changeset
   545
     Re-redefined to true here, as I do have an order"
d341dc629f81 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 24618
diff changeset
   546
24080
0cc60a09f225 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 23190
diff changeset
   547
    ^ true
0cc60a09f225 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 23190
diff changeset
   548
0cc60a09f225 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 23190
diff changeset
   549
    "Created: / 15-04-2019 / 19:05:23 / Stefan Vogel"
0cc60a09f225 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 23190
diff changeset
   550
! !
0cc60a09f225 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 23190
diff changeset
   551
15143
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   552
!OrderedSet class methodsFor:'documentation'!
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   553
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   554
version
20632
7c6a436e1c89 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 17411
diff changeset
   555
    ^ '$Header$'
15143
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   556
!
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   557
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   558
version_CVS
20632
7c6a436e1c89 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 17411
diff changeset
   559
    ^ '$Header$'
15143
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   560
! !
7a1e2ff50fd5 Change package libbasic2 -> libbasic
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   561