KeyedCollection.st
author Claus Gittinger <cg@exept.de>
Tue, 09 Jul 2019 20:55:17 +0200
changeset 24417 03b083548da2
parent 23888 ecd7ab5136be
child 24612 1ac50ebe401a
permissions -rw-r--r--
#REFACTORING by exept class: Smalltalk class changed: #recursiveInstallAutoloadedClassesFrom:rememberIn:maxLevels:noAutoload:packageTop:showSplashInLevels: Transcript showCR:(... bindWith:...) -> Transcript showCR:... with:...
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
23888
ecd7ab5136be #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 23706
diff changeset
     1
"{ Encoding: utf8 }"
ecd7ab5136be #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 23706
diff changeset
     2
3615
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     3
"
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     4
 COPYRIGHT (c) 1998 by eXept Software AG
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     5
              All Rights Reserved
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     6
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     7
 This software is furnished under a license and may be used
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     8
 only in accordance with the terms of that license and with the
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     9
 inclusion of the above copyright notice.   This software may not
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    10
 be provided or otherwise made available to, or used by, any
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    11
 other person.  No title to or ownership of the software is
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    12
 hereby transferred.
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    13
"
9482
7bebdb8e4c60 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9480
diff changeset
    14
"{ Package: 'stx:libbasic' }"
8893
99996b25482e +isAbstract
Claus Gittinger <cg@exept.de>
parents: 3615
diff changeset
    15
19469
e43475084bb5 #DOCUMENTATION
Claus Gittinger <cg@exept.de>
parents: 17120
diff changeset
    16
"{ NameSpace: Smalltalk }"
e43475084bb5 #DOCUMENTATION
Claus Gittinger <cg@exept.de>
parents: 17120
diff changeset
    17
3615
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    18
Collection subclass:#KeyedCollection
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    19
	instanceVariableNames:''
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    20
	classVariableNames:''
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    21
	poolDictionaries:''
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    22
	category:'Collections-Abstract'
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    23
!
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    24
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    25
!KeyedCollection class methodsFor:'documentation'!
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    26
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    27
copyright
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    28
"
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    29
 COPYRIGHT (c) 1998 by eXept Software AG
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    30
              All Rights Reserved
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    31
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    32
 This software is furnished under a license and may be used
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    33
 only in accordance with the terms of that license and with the
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    34
 inclusion of the above copyright notice.   This software may not
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    35
 be provided or otherwise made available to, or used by, any
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    36
 other person.  No title to or ownership of the software is
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    37
 hereby transferred.
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    38
"
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    39
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    40
!
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    41
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    42
documentation
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    43
"
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    44
    Abstract superclass for collections which have a key->value mapping.
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    45
    This abstract class provides functionality common to those collections,
17120
246d9198d84e class: KeyedCollection
Claus Gittinger <cg@exept.de>
parents: 13045
diff changeset
    46
    without knowing how the concrete class implements things. 
246d9198d84e class: KeyedCollection
Claus Gittinger <cg@exept.de>
parents: 13045
diff changeset
    47
    Thus, all methods found here depend on some basic mechanisms 
246d9198d84e class: KeyedCollection
Claus Gittinger <cg@exept.de>
parents: 13045
diff changeset
    48
    to be defined in the concrete class. 
3615
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    49
    These basic methods are usually defined as #subclassResponsibility here.
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    50
    Some methods are also redefined for better performance.
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    51
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    52
    Subclasses should at least implement:
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    53
        at:ifAbsent:        - accessing elements
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    54
        removeKey:ifAbsent  - removing
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    55
        keysAndValuesDo:    - enumerating
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    56
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    57
    [author:]
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    58
        Claus Gittinger
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    59
"
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    60
! !
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    61
21649
4a09b7965b34 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21369
diff changeset
    62
!KeyedCollection class methodsFor:'instance creation'!
4a09b7965b34 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21369
diff changeset
    63
23354
bcd17ecee2c6 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23341
diff changeset
    64
decodeFromLiteralArray:anArray
bcd17ecee2c6 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23341
diff changeset
    65
    "create & return a new instance from information encoded in anArray."
bcd17ecee2c6 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23341
diff changeset
    66
bcd17ecee2c6 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23341
diff changeset
    67
    |dictionary
bcd17ecee2c6 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23341
diff changeset
    68
     sz "{ Class: SmallInteger }"|
bcd17ecee2c6 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23341
diff changeset
    69
bcd17ecee2c6 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23341
diff changeset
    70
    sz := anArray size.
bcd17ecee2c6 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23341
diff changeset
    71
    dictionary := self new:sz//2.
bcd17ecee2c6 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23341
diff changeset
    72
    2 to:sz by:2 do:[:idx | |key val|
bcd17ecee2c6 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23341
diff changeset
    73
        key := (anArray at:idx) decodeAsLiteralArray.
bcd17ecee2c6 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23341
diff changeset
    74
        val := (anArray at:idx+1) decodeAsLiteralArray.
bcd17ecee2c6 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23341
diff changeset
    75
        dictionary at:key put:val
bcd17ecee2c6 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23341
diff changeset
    76
    ].
bcd17ecee2c6 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23341
diff changeset
    77
    ^ dictionary
bcd17ecee2c6 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23341
diff changeset
    78
bcd17ecee2c6 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23341
diff changeset
    79
    "
bcd17ecee2c6 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23341
diff changeset
    80
     (SmallDictionary new
bcd17ecee2c6 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23341
diff changeset
    81
         at:1 put:'one';
bcd17ecee2c6 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23341
diff changeset
    82
         at:2 put:'two';
bcd17ecee2c6 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23341
diff changeset
    83
         yourself
bcd17ecee2c6 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23341
diff changeset
    84
     ) literalArrayEncoding decodeAsLiteralArray
bcd17ecee2c6 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23341
diff changeset
    85
    "
bcd17ecee2c6 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23341
diff changeset
    86
bcd17ecee2c6 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23341
diff changeset
    87
    "Created: / 17-09-2018 / 14:51:59 / Stefan Vogel"
bcd17ecee2c6 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23341
diff changeset
    88
!
bcd17ecee2c6 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23341
diff changeset
    89
23341
1fdd8b7e859c #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 23338
diff changeset
    90
withAll:aCollection
1fdd8b7e859c #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 23338
diff changeset
    91
    "create a KeyedCollection from another Collection with keys"
21655
058cafb6c2f6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21653
diff changeset
    92
058cafb6c2f6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21653
diff changeset
    93
    |newDict|
058cafb6c2f6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21653
diff changeset
    94
23341
1fdd8b7e859c #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 23338
diff changeset
    95
    newDict := self new:aCollection size.
1fdd8b7e859c #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 23338
diff changeset
    96
    aCollection keysAndValuesDo:[:key :value |
21655
058cafb6c2f6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21653
diff changeset
    97
        newDict at:key put:value.
058cafb6c2f6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21653
diff changeset
    98
    ].
058cafb6c2f6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21653
diff changeset
    99
    ^ newDict
058cafb6c2f6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21653
diff changeset
   100
058cafb6c2f6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21653
diff changeset
   101
    "
058cafb6c2f6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21653
diff changeset
   102
        |d|
058cafb6c2f6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21653
diff changeset
   103
058cafb6c2f6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21653
diff changeset
   104
        d := Dictionary withKeys:#(a b c d e) andValues:#(1 2 3 4 5).
23341
1fdd8b7e859c #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 23338
diff changeset
   105
        SmallDictionary withAll:d.
1fdd8b7e859c #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 23338
diff changeset
   106
1fdd8b7e859c #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 23338
diff changeset
   107
        SmallDictionary withAll:#('one' 'two' 'three' 'four').
21655
058cafb6c2f6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21653
diff changeset
   108
    "
058cafb6c2f6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21653
diff changeset
   109
058cafb6c2f6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21653
diff changeset
   110
    "Created: / 17-03-2017 / 11:29:09 / stefan"
23341
1fdd8b7e859c #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 23338
diff changeset
   111
    "Modified (comment): / 14-09-2018 / 17:54:12 / Stefan Vogel"
21655
058cafb6c2f6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21653
diff changeset
   112
!
058cafb6c2f6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21653
diff changeset
   113
21649
4a09b7965b34 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21369
diff changeset
   114
withAssociations:aCollectionOfAssociations
4a09b7965b34 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21369
diff changeset
   115
    "return a new instance where associations are taken from the argument"
4a09b7965b34 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21369
diff changeset
   116
21655
058cafb6c2f6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21653
diff changeset
   117
    |newDict|
21649
4a09b7965b34 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21369
diff changeset
   118
21655
058cafb6c2f6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21653
diff changeset
   119
    newDict := self new:aCollectionOfAssociations size.
21649
4a09b7965b34 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21369
diff changeset
   120
    aCollectionOfAssociations do:[:assoc |
4a09b7965b34 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21369
diff changeset
   121
        newDict at:assoc key put:assoc value
4a09b7965b34 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21369
diff changeset
   122
    ].
4a09b7965b34 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21369
diff changeset
   123
    ^ newDict
4a09b7965b34 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21369
diff changeset
   124
4a09b7965b34 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21369
diff changeset
   125
    "
23341
1fdd8b7e859c #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 23338
diff changeset
   126
     SmallDictionary withAssociations:{ #'one'->1 .
21649
4a09b7965b34 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21369
diff changeset
   127
                                   #'two'->2 .
4a09b7965b34 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21369
diff changeset
   128
                                   #'three'->3 .
4a09b7965b34 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21369
diff changeset
   129
                                   #'four'->4 }
4a09b7965b34 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21369
diff changeset
   130
    "
4a09b7965b34 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21369
diff changeset
   131
4a09b7965b34 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21369
diff changeset
   132
    "Created: / 16-03-2017 / 12:15:38 / stefan"
21655
058cafb6c2f6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21653
diff changeset
   133
    "Modified: / 17-03-2017 / 11:30:55 / stefan"
23341
1fdd8b7e859c #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 23338
diff changeset
   134
    "Modified (comment): / 14-09-2018 / 17:45:56 / Stefan Vogel"
21649
4a09b7965b34 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21369
diff changeset
   135
!
4a09b7965b34 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21369
diff changeset
   136
23341
1fdd8b7e859c #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 23338
diff changeset
   137
withKeyValuePairs:aCollection
1fdd8b7e859c #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 23338
diff changeset
   138
    "return a new instance where keys and values are taken from 
1fdd8b7e859c #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 23338
diff changeset
   139
     elements of aCollection, which are pairs (2-element SeuqenceableCollection) of key and value"
1fdd8b7e859c #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 23338
diff changeset
   140
1fdd8b7e859c #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 23338
diff changeset
   141
    |newDict|
1fdd8b7e859c #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 23338
diff changeset
   142
1fdd8b7e859c #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 23338
diff changeset
   143
    newDict := self new:(aCollection size).
1fdd8b7e859c #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 23338
diff changeset
   144
    aCollection do:[:pair |
1fdd8b7e859c #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 23338
diff changeset
   145
        newDict at:(pair first) put:(pair second)
1fdd8b7e859c #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 23338
diff changeset
   146
    ].
1fdd8b7e859c #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 23338
diff changeset
   147
    ^ newDict
1fdd8b7e859c #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 23338
diff changeset
   148
1fdd8b7e859c #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 23338
diff changeset
   149
    "
1fdd8b7e859c #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 23338
diff changeset
   150
     SmallDictionary withKeyValuePairs:#( ('one' 1) ('two' 2) ('three' 3) ('four' 4))
1fdd8b7e859c #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 23338
diff changeset
   151
    "
1fdd8b7e859c #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 23338
diff changeset
   152
1fdd8b7e859c #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 23338
diff changeset
   153
    "Created: / 14-09-2018 / 17:44:35 / Stefan Vogel"
1fdd8b7e859c #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 23338
diff changeset
   154
!
1fdd8b7e859c #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 23338
diff changeset
   155
1fdd8b7e859c #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 23338
diff changeset
   156
withKeys:keyCollection andValues:valueCollection
21649
4a09b7965b34 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21369
diff changeset
   157
    "return a new instance where keys and values are taken from
4a09b7965b34 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21369
diff changeset
   158
     the argumentArrays."
4a09b7965b34 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21369
diff changeset
   159
4a09b7965b34 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21369
diff changeset
   160
    |newColl sz "{ Class: SmallInteger }"|
4a09b7965b34 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21369
diff changeset
   161
23341
1fdd8b7e859c #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 23338
diff changeset
   162
    sz := keyCollection size.
21649
4a09b7965b34 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21369
diff changeset
   163
    newColl := self new:sz.
4a09b7965b34 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21369
diff changeset
   164
    1 to:sz do:[:index |
23341
1fdd8b7e859c #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 23338
diff changeset
   165
        newColl at:(keyCollection at:index) put:(valueCollection at:index).
21649
4a09b7965b34 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21369
diff changeset
   166
    ].
4a09b7965b34 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21369
diff changeset
   167
    ^ newColl
4a09b7965b34 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21369
diff changeset
   168
4a09b7965b34 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21369
diff changeset
   169
    "Created: / 16-03-2017 / 11:06:51 / stefan"
4a09b7965b34 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21369
diff changeset
   170
    "Modified (format): / 16-03-2017 / 12:12:09 / stefan"
23341
1fdd8b7e859c #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 23338
diff changeset
   171
    "Modified (format): / 14-09-2018 / 17:50:05 / Stefan Vogel"
21649
4a09b7965b34 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21369
diff changeset
   172
!
4a09b7965b34 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21369
diff changeset
   173
23341
1fdd8b7e859c #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 23338
diff changeset
   174
withKeysAndValues:aSequenceableCollection
21649
4a09b7965b34 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21369
diff changeset
   175
    "return a new instance where keys and values are taken from alternating
23341
1fdd8b7e859c #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 23338
diff changeset
   176
     elements of aSequenceableCollection"
21649
4a09b7965b34 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21369
diff changeset
   177
4a09b7965b34 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21369
diff changeset
   178
    |newDict sz "{ Class: SmallInteger }"|
4a09b7965b34 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21369
diff changeset
   179
23341
1fdd8b7e859c #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 23338
diff changeset
   180
    sz := aSequenceableCollection size.
23398
15d76e8be04c #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 23363
diff changeset
   181
    sz odd ifTrue:[
15d76e8be04c #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 23363
diff changeset
   182
        SubscriptOutOfBoundsError
15d76e8be04c #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 23363
diff changeset
   183
            raiseRequestWith:sz+1
15d76e8be04c #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 23363
diff changeset
   184
            errorString:('odd number of elements - subscript (' , (sz+1) printString , ') would be out of bounds')
15d76e8be04c #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 23363
diff changeset
   185
    ].
21655
058cafb6c2f6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21653
diff changeset
   186
    newDict := self new:sz.
21649
4a09b7965b34 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21369
diff changeset
   187
    1 to:sz by:2 do:[:i |
23341
1fdd8b7e859c #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 23338
diff changeset
   188
        newDict at:(aSequenceableCollection at:i) put:(aSequenceableCollection at:i+1)
21649
4a09b7965b34 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21369
diff changeset
   189
    ].
4a09b7965b34 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21369
diff changeset
   190
    ^ newDict
4a09b7965b34 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21369
diff changeset
   191
4a09b7965b34 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21369
diff changeset
   192
    "
23341
1fdd8b7e859c #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 23338
diff changeset
   193
     SmallDictionary withKeysAndValues:#('one' 1 'two' 2 'three' 3 'four' 4)
23398
15d76e8be04c #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 23363
diff changeset
   194
     SmallDictionary withKeysAndValues:#('one' 1 'two' 2 'three' 3 'incomplete')
21649
4a09b7965b34 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21369
diff changeset
   195
    "
4a09b7965b34 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21369
diff changeset
   196
4a09b7965b34 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21369
diff changeset
   197
    "Created: / 16-03-2017 / 12:13:27 / stefan"
21655
058cafb6c2f6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21653
diff changeset
   198
    "Modified: / 17-03-2017 / 11:32:42 / stefan"
23398
15d76e8be04c #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 23363
diff changeset
   199
    "Modified (comment): / 04-10-2018 / 10:09:46 / Stefan Vogel"
21649
4a09b7965b34 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21369
diff changeset
   200
! !
4a09b7965b34 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21369
diff changeset
   201
8893
99996b25482e +isAbstract
Claus Gittinger <cg@exept.de>
parents: 3615
diff changeset
   202
!KeyedCollection class methodsFor:'queries'!
99996b25482e +isAbstract
Claus Gittinger <cg@exept.de>
parents: 3615
diff changeset
   203
99996b25482e +isAbstract
Claus Gittinger <cg@exept.de>
parents: 3615
diff changeset
   204
isAbstract
11222
7e8b37ffc6ca comment
Claus Gittinger <cg@exept.de>
parents: 10533
diff changeset
   205
    "Return if this class is an abstract class.
7e8b37ffc6ca comment
Claus Gittinger <cg@exept.de>
parents: 10533
diff changeset
   206
     True is returned for KeyedCollection here; false for subclasses.
19469
e43475084bb5 #DOCUMENTATION
Claus Gittinger <cg@exept.de>
parents: 17120
diff changeset
   207
     Abstract subclasses must redefine this again."
11222
7e8b37ffc6ca comment
Claus Gittinger <cg@exept.de>
parents: 10533
diff changeset
   208
8893
99996b25482e +isAbstract
Claus Gittinger <cg@exept.de>
parents: 3615
diff changeset
   209
    ^ self == KeyedCollection
99996b25482e +isAbstract
Claus Gittinger <cg@exept.de>
parents: 3615
diff changeset
   210
! !
99996b25482e +isAbstract
Claus Gittinger <cg@exept.de>
parents: 3615
diff changeset
   211
3615
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   212
!KeyedCollection methodsFor:'accessing'!
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   213
21653
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   214
associationAt:aKey 
21649
4a09b7965b34 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21369
diff changeset
   215
    "return an association consisting of aKey and the element indexed 
4a09b7965b34 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21369
diff changeset
   216
     by aKey - 
4a09b7965b34 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21369
diff changeset
   217
     report an error, if no element is stored under aKey."
4a09b7965b34 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21369
diff changeset
   218
21653
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   219
    ^ self associationAt:aKey ifAbsent:[self errorKeyNotFound:aKey]
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   220
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   221
    "Modified: / 16-03-2017 / 17:19:52 / stefan"
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   222
!
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   223
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   224
associationAt:aKey ifAbsent:exceptionBlock
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   225
    "return an association consisting of aKey and the element indexed by aKey -
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   226
     return result of exceptionBlock if no element is stored under aKey.
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   227
     Warning: this is a comatibility interface only, with a different semantic as
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   228
              the original ST80 implementation. The returned assoc is created on the fly,
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   229
              and not the one stored in the receiver (there are not assocs there)"
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   230
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   231
    |value|
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   232
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   233
    value := self at:aKey ifAbsent:[^ exceptionBlock value].
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   234
    ^ Association key:aKey value:value.
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   235
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   236
    "Created: / 16-03-2017 / 17:17:05 / stefan"
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   237
!
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   238
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   239
associations
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   240
    "return an ordered collection containing the receiver's associations."
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   241
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   242
    |coll|
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   243
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   244
    coll := OrderedCollection new.
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   245
    self associationsDo:[:assoc | coll add:assoc].
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   246
    ^ coll
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   247
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   248
    "Created: / 16-03-2017 / 17:30:47 / stefan"
21649
4a09b7965b34 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21369
diff changeset
   249
!
4a09b7965b34 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21369
diff changeset
   250
3615
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   251
at:key
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   252
    "return the value stored under akey.
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   253
     Raise an error if not found"
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   254
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   255
    ^ self at:key ifAbsent:[self errorKeyNotFound:key].
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   256
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   257
    "Modified: / 19.6.1998 / 00:48:27 / cg"
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   258
!
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   259
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   260
at:key ifAbsent:exceptionBlock
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   261
    "return the value stored under akey.
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   262
     Return the value from evaluating exceptionBlock if not found"
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   263
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   264
    ^ self subclassResponsibility
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   265
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   266
    "Created: / 19.6.1998 / 00:48:23 / cg"
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   267
!
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   268
21653
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   269
at:aKey ifAbsent:default update:aBlock
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   270
    "update the element stored under aKey with the result from
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   271
     evaluating aBlock with the previous stored value as argument, or with default,
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   272
     if there was no such key initially.
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   273
     Return the new value stored."
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   274
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   275
    ^ self at:aKey put:(aBlock value:(self at:aKey ifAbsent:default))
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   276
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   277
    "Created: / 16-03-2017 / 17:28:15 / stefan"
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   278
!
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   279
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   280
at:aKey ifAbsentPut:valueBlock
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   281
    "return the element indexed by aKey if present,
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   282
     if not present, store the result of evaluating valueBlock
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   283
     under aKey and return it.
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   284
     WARNING: do not add elements while iterating over the receiver.
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   285
              Iterate over a copy to do this."
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   286
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   287
    ^ self at:aKey ifAbsent:[self at:aKey put:valueBlock value].
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   288
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   289
    "Created: / 16-03-2017 / 17:23:07 / stefan"
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   290
!
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   291
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   292
at:aKey ifPresent:aBlock
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   293
    "try to retrieve the value stored at aKey.
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   294
     If there is nothing stored under this key, do nothing.
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   295
     Otherwise, evaluate aBlock, passing the retrieved value as argument."
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   296
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   297
    |v|
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   298
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   299
    v := self at:aKey ifAbsent:[^ nil].
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   300
    ^ aBlock value:v.
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   301
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   302
    "Created: / 16-03-2017 / 17:11:27 / stefan"
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   303
!
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   304
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   305
at:aKey put:anObject
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   306
    "add the argument anObject under key, aKey to the receiver.
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   307
     Return anObject (sigh).
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   308
     WARNING: do not add elements while iterating over the receiver.
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   309
              Iterate over a copy to do this."
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   310
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   311
    ^ self subclassResponsibility
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   312
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   313
    "Created: / 16-03-2017 / 17:33:12 / stefan"
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   314
!
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   315
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   316
at:aKey put:anObject ifPresent:aBlock
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   317
    "if the receiver contains an element stored under aKey,
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   318
     retrieve it and evaluate aBlock passing the element as argument,
23888
ecd7ab5136be #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 23706
diff changeset
   319
     return the block's value.
21653
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   320
     If not, store aValue under the key.
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   321
     Use this with an error-reporting block, to ensure that no keys are reused"
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   322
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   323
    |value isAbsent|
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   324
21655
058cafb6c2f6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21653
diff changeset
   325
    value := self at:aKey ifAbsentPut:[isAbsent := true. anObject].
21653
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   326
    isAbsent notNil ifTrue:[
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   327
        ^ value.
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   328
    ].
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   329
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   330
    ^ aBlock value:value.
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   331
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   332
    "Created: / 16-03-2017 / 17:38:00 / stefan"
21655
058cafb6c2f6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21653
diff changeset
   333
    "Modified: / 17-03-2017 / 11:37:26 / stefan"
23888
ecd7ab5136be #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 23706
diff changeset
   334
    "Modified (comment): / 13-03-2019 / 10:26:05 / Claus Gittinger"
21653
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   335
!
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   336
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   337
at:aKey update:aBlock
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   338
    "update the element stored under aKey with the result from
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   339
     evaluating aBlock with the previous stored value as argument.
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   340
     Report an error if there was no such key initially.
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   341
     Return the new value stored."
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   342
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   343
    ^ self at:aKey put:(aBlock value:(self at:aKey))
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   344
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   345
    "Created: / 16-03-2017 / 17:29:22 / stefan"
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   346
!
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   347
21368
1e4c41f4d3af #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 19844
diff changeset
   348
keyAtEqualValue:value
3615
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   349
    "return the key under which value is stored.
21368
1e4c41f4d3af #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 19844
diff changeset
   350
     Raise an error if not found.
1e4c41f4d3af #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 19844
diff changeset
   351
     This is a slow access, since the receiver is searched sequentially.
1e4c41f4d3af #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 19844
diff changeset
   352
     NOTICE:
21369
d7b0866974d9 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 21368
diff changeset
   353
        The value is searched using equality compare"
3615
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   354
21368
1e4c41f4d3af #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 19844
diff changeset
   355
    ^ self keyAtEqualValue:value ifAbsent:[self errorValueNotFound:value].
3615
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   356
21368
1e4c41f4d3af #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 19844
diff changeset
   357
    "Created: / 07-02-2017 / 11:11:41 / cg"
3615
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   358
!
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   359
21368
1e4c41f4d3af #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 19844
diff changeset
   360
keyAtEqualValue:value ifAbsent:exceptionBlock
1e4c41f4d3af #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 19844
diff changeset
   361
    "return the key under which value is stored.
1e4c41f4d3af #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 19844
diff changeset
   362
     If not found, return the value from evaluating exceptionBlock.
1e4c41f4d3af #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 19844
diff changeset
   363
     This is a slow access, since the receiver is searched sequentially.
1e4c41f4d3af #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 19844
diff changeset
   364
     NOTICE:
1e4c41f4d3af #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 19844
diff changeset
   365
        The value is searched using equality compare"
1e4c41f4d3af #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 19844
diff changeset
   366
1e4c41f4d3af #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 19844
diff changeset
   367
    self keysAndValuesDo:[:elKey :elValue |
1e4c41f4d3af #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 19844
diff changeset
   368
        value = elValue ifTrue:[^ elKey]
1e4c41f4d3af #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 19844
diff changeset
   369
    ].
1e4c41f4d3af #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 19844
diff changeset
   370
    ^ exceptionBlock value
1e4c41f4d3af #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 19844
diff changeset
   371
1e4c41f4d3af #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 19844
diff changeset
   372
    "Created: / 07-02-2017 / 11:12:03 / cg"
1e4c41f4d3af #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 19844
diff changeset
   373
!
1e4c41f4d3af #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 19844
diff changeset
   374
1e4c41f4d3af #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 19844
diff changeset
   375
keyAtIdenticalValue:value
3615
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   376
    "return the key under which value is stored.
21368
1e4c41f4d3af #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 19844
diff changeset
   377
     Raise an error if not found.
1e4c41f4d3af #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 19844
diff changeset
   378
     This is a slow access, since the receiver is searched sequentially.
1e4c41f4d3af #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 19844
diff changeset
   379
     NOTICE:
1e4c41f4d3af #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 19844
diff changeset
   380
        The value is searched using identity compare"
1e4c41f4d3af #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 19844
diff changeset
   381
1e4c41f4d3af #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 19844
diff changeset
   382
    ^ self keyAtIdenticalValue:value ifAbsent:[self errorValueNotFound:value].
1e4c41f4d3af #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 19844
diff changeset
   383
1e4c41f4d3af #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 19844
diff changeset
   384
    "Created: / 07-02-2017 / 11:12:23 / cg"
1e4c41f4d3af #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 19844
diff changeset
   385
!
1e4c41f4d3af #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 19844
diff changeset
   386
1e4c41f4d3af #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 19844
diff changeset
   387
keyAtIdenticalValue:value ifAbsent:exceptionBlock
1e4c41f4d3af #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 19844
diff changeset
   388
    "return the key under which value is stored.
1e4c41f4d3af #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 19844
diff changeset
   389
     If not found, return the value from evaluating exceptionBlock.
1e4c41f4d3af #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 19844
diff changeset
   390
     This is a slow access, since the receiver is searched sequentially.
1e4c41f4d3af #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 19844
diff changeset
   391
     NOTICE:
1e4c41f4d3af #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 19844
diff changeset
   392
        The value is searched using identity compare"
3615
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   393
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   394
    self keysAndValuesDo:[:elKey :elValue |
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   395
        value == elValue ifTrue:[^ elKey]
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   396
    ].
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   397
    ^ exceptionBlock value
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   398
21368
1e4c41f4d3af #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 19844
diff changeset
   399
    "Created: / 07-02-2017 / 11:12:46 / cg"
1e4c41f4d3af #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 19844
diff changeset
   400
!
1e4c41f4d3af #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 19844
diff changeset
   401
1e4c41f4d3af #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 19844
diff changeset
   402
keyAtValue:value
1e4c41f4d3af #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 19844
diff changeset
   403
    "return the key under which value is stored.
1e4c41f4d3af #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 19844
diff changeset
   404
     Raise an error if not found.
1e4c41f4d3af #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 19844
diff changeset
   405
     This is a slow access, since the receiver is searched sequentially.
1e4c41f4d3af #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 19844
diff changeset
   406
     NOTICE:
21653
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   407
        The value is searched using equality compare"
21368
1e4c41f4d3af #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 19844
diff changeset
   408
21653
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   409
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   410
    ^ self keyAtEqualValue:value.
21368
1e4c41f4d3af #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 19844
diff changeset
   411
1e4c41f4d3af #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 19844
diff changeset
   412
    "Created: / 19-06-1998 / 00:49:16 / cg"
1e4c41f4d3af #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 19844
diff changeset
   413
    "Modified (comment): / 07-02-2017 / 11:13:29 / cg"
21653
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   414
    "Modified (comment): / 16-03-2017 / 18:00:28 / stefan"
21368
1e4c41f4d3af #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 19844
diff changeset
   415
!
1e4c41f4d3af #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 19844
diff changeset
   416
1e4c41f4d3af #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 19844
diff changeset
   417
keyAtValue:value ifAbsent:exceptionBlock
1e4c41f4d3af #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 19844
diff changeset
   418
    "return the key under which value is stored.
1e4c41f4d3af #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 19844
diff changeset
   419
     If not found, return the value from evaluating exceptionBlock.
1e4c41f4d3af #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 19844
diff changeset
   420
     This is a slow access, since the receiver is searched sequentially.
1e4c41f4d3af #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 19844
diff changeset
   421
     NOTICE:
21653
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   422
        The value is searched using equality compare"
21368
1e4c41f4d3af #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 19844
diff changeset
   423
21653
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   424
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   425
    ^ self keyAtEqualValue:value ifAbsent:exceptionBlock.
21368
1e4c41f4d3af #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 19844
diff changeset
   426
1e4c41f4d3af #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 19844
diff changeset
   427
    "Created: / 19-06-1998 / 00:50:34 / cg"
1e4c41f4d3af #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 19844
diff changeset
   428
    "Modified: / 07-02-2017 / 11:13:20 / cg"
21653
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   429
    "Modified (comment): / 16-03-2017 / 18:00:37 / stefan"
3615
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   430
!
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   431
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   432
keys
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   433
    "return a collection containing the keys of the receiver"
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   434
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   435
    |keyCollection|
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   436
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   437
    keyCollection := OrderedCollection new.
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   438
    self keysDo:[:aKey |
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   439
        keyCollection add:aKey
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   440
    ].
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   441
    ^ keyCollection
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   442
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   443
    "Modified: / 19.6.1998 / 00:48:27 / cg"
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   444
    "Created: / 19.6.1998 / 00:51:49 / cg"
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   445
! !
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   446
23338
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   447
!KeyedCollection methodsFor:'adding'!
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   448
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   449
addAll:aCollection
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   450
    "ANSI 5.7.2.1:
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   451
     Message:  addAll: dictionary
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   452
      Synopsis
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   453
        Store the elements of dictionary in the receiver at the
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   454
        corresponding keys from dictionary.
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   455
      Definition: <abstractDictionary>
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   456
        This message is equivalent to repeatedly sending the #at:put:
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   457
        message to the receiver with each of the keys and elements in
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   458
        dictionary in turn.  If a key in dictionary is key equivalent
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   459
        to a key in the receiver, the associated element in dictionary
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   460
        replaces the element in the receiver.
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   461
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   462
     Returns the argument, aCollection (sigh).
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   463
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   464
     WARNING: do not add elements while iterating over the receiver.
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   465
              Iterate over a copy to do this."
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   466
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   467
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   468
    self ~~ aCollection ifTrue:[
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   469
        aCollection isSequenceable ifTrue:[
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   470
            aCollection do:[:eachPair |
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   471
                self at:eachPair key put:eachPair value.
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   472
            ].
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   473
        ] ifFalse:[
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   474
            aCollection keysAndValuesDo:[:eachKey :eachValue |
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   475
                self at:eachKey put:eachValue.
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   476
            ]
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   477
        ].
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   478
    ].
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   479
    ^ aCollection
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   480
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   481
    "
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   482
     |d1 d2|
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   483
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   484
     d1 := Dictionary new.
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   485
     d1 at:1 put:'one'.
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   486
     d1 at:2 put:'two'.
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   487
     d2 := Dictionary new.
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   488
     d2 at:3 put:'three'.
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   489
     d2 at:4 put:'four'.
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   490
     d1 addAll:d2.
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   491
     d1.
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   492
    "
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   493
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   494
    "Created: / 14-09-2018 / 16:41:49 / Stefan Vogel"
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   495
!
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   496
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   497
declareAllFrom:aDictionaryOrNil
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   498
    "merge all key-value pairs from aDictionary into the receiver.
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   499
     Values present in the arg will always end up in the receiver;
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   500
     i.e. a value coming from the argument is already in the receiver,
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   501
     the value from aDictionaryOrNil is stored into the receiver.
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   502
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   503
     sigh:
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   504
        For compatibility with #declare:from: the behavior should be changed as following:
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   505
        If the receiver already contains a key, the existing value is retained.
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   506
        To keep the compatibility with other smalltalks, the semantics of this remains
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   507
        as is, and #declareAllNewFrom: was added for convenience.
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   508
        See #declareAllNewFrom: which does exactly what this name implies."
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   509
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   510
    (aDictionaryOrNil notNil and:[self ~~ aDictionaryOrNil]) ifTrue:[
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   511
        aDictionaryOrNil keysAndValuesDo:[:key :value |
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   512
            self at:key put:value.
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   513
        ].
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   514
    ]
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   515
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   516
    "Created: / 14-09-2018 / 16:46:38 / Stefan Vogel"
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   517
!
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   518
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   519
declareAllNewFrom:aDictionaryOrNil
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   520
    "merge all new key-value pairs from aDictionary into the receiver
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   521
     i.e. If the receiver already contains a key, the existing value is retained.
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   522
     See also #declareAllFrom:"
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   523
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   524
    (aDictionaryOrNil notNil and:[self ~~ aDictionaryOrNil]) ifTrue:[
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   525
        aDictionaryOrNil keysAndValuesDo:[:key :value |
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   526
            (self includesKey:key) ifFalse:[
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   527
                self at:key put:value.
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   528
            ].
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   529
        ]
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   530
    ]
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   531
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   532
    "Created: / 14-09-2018 / 16:56:36 / Stefan Vogel"
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   533
! !
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   534
23354
bcd17ecee2c6 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23341
diff changeset
   535
!KeyedCollection methodsFor:'converting'!
bcd17ecee2c6 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23341
diff changeset
   536
bcd17ecee2c6 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23341
diff changeset
   537
literalArrayEncoding
bcd17ecee2c6 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23341
diff changeset
   538
    |literalArray idx|
bcd17ecee2c6 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23341
diff changeset
   539
bcd17ecee2c6 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23341
diff changeset
   540
    literalArray := Array new:(self size * 2)+1.
bcd17ecee2c6 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23341
diff changeset
   541
    literalArray at:1 put:self class name.
bcd17ecee2c6 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23341
diff changeset
   542
    idx := 2.
bcd17ecee2c6 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23341
diff changeset
   543
    self keysAndValuesDo:[:eachKey :eachValue |
bcd17ecee2c6 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23341
diff changeset
   544
        literalArray
bcd17ecee2c6 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23341
diff changeset
   545
            at:idx   put:eachKey literalArrayEncoding;
bcd17ecee2c6 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23341
diff changeset
   546
            at:idx+1 put:eachValue literalArrayEncoding.
bcd17ecee2c6 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23341
diff changeset
   547
        idx := idx + 2.
bcd17ecee2c6 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23341
diff changeset
   548
    ].
bcd17ecee2c6 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23341
diff changeset
   549
    ^ literalArray
bcd17ecee2c6 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23341
diff changeset
   550
bcd17ecee2c6 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23341
diff changeset
   551
    "
bcd17ecee2c6 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23341
diff changeset
   552
      |dict|
bcd17ecee2c6 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23341
diff changeset
   553
bcd17ecee2c6 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23341
diff changeset
   554
      dict := SmallDictionary new.
bcd17ecee2c6 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23341
diff changeset
   555
      dict at:1 put:'bla'.
bcd17ecee2c6 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23341
diff changeset
   556
      dict at:'fasel' put:#[1 2 3 4].
bcd17ecee2c6 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23341
diff changeset
   557
      dict literalArrayEncoding
bcd17ecee2c6 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23341
diff changeset
   558
    "
bcd17ecee2c6 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23341
diff changeset
   559
bcd17ecee2c6 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23341
diff changeset
   560
    "Created: / 17-09-2018 / 14:49:52 / Stefan Vogel"
bcd17ecee2c6 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23341
diff changeset
   561
! !
bcd17ecee2c6 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23341
diff changeset
   562
3615
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   563
!KeyedCollection methodsFor:'enumerating'!
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   564
21655
058cafb6c2f6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21653
diff changeset
   565
associationsDo:aBlock
058cafb6c2f6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21653
diff changeset
   566
    "perform the block for all associations in the collection.
058cafb6c2f6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21653
diff changeset
   567
058cafb6c2f6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21653
diff changeset
   568
     See also:
058cafb6c2f6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21653
diff changeset
   569
        #do:              (which passes values to its block)
058cafb6c2f6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21653
diff changeset
   570
        #keysDo:          (which passes only keys to its block)
058cafb6c2f6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21653
diff changeset
   571
        #keysAndValuesDo: (which passes keys&values)
058cafb6c2f6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21653
diff changeset
   572
058cafb6c2f6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21653
diff changeset
   573
     This is much like #keysAndValuesDo:, but aBlock gets the
058cafb6c2f6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21653
diff changeset
   574
     key and value as a single association argument.
058cafb6c2f6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21653
diff changeset
   575
     #keysAndValuesDo: and is a bit faster therefore (no intermediate objects).
058cafb6c2f6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21653
diff changeset
   576
058cafb6c2f6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21653
diff changeset
   577
     WARNING: do not add/remove elements while iterating over the receiver.
058cafb6c2f6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21653
diff changeset
   578
              Iterate over a copy to do this."
058cafb6c2f6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21653
diff changeset
   579
058cafb6c2f6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21653
diff changeset
   580
    self keysAndValuesDo:[:eachKey :eachValue|
058cafb6c2f6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21653
diff changeset
   581
        aBlock value:(Association key:eachKey value:eachValue).
058cafb6c2f6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21653
diff changeset
   582
    ].
058cafb6c2f6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21653
diff changeset
   583
058cafb6c2f6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21653
diff changeset
   584
    "Created: / 17-03-2017 / 11:05:29 / stefan"
058cafb6c2f6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21653
diff changeset
   585
!
058cafb6c2f6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21653
diff changeset
   586
23338
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   587
associationsSelect:aBlock
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   588
    "return a new collection with all elements from the receiver, for which
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   589
     the argument aBlock evaluates to true.
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   590
     The block gets keys and values as an association argument.
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   591
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   592
     See also: #keysAndValuesSelect: (which is slightly faster),
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   593
               #select: (which only passes the value)
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   594
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   595
     This is much like #keysAndValuesSelect:, but aBlock gets the
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   596
     key and value as a single association argument.
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   597
     #keysAndValuesSelect: and is a bit faster therefore (no intermediate objects).
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   598
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   599
     WARNING: do not add/remove elements while iterating over the receiver.
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   600
              Iterate over a copy to do this."
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   601
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   602
    |newCollection|
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   603
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   604
    newCollection := self species new.
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   605
    self keysAndValuesDo:[:key :value |
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   606
        (aBlock value:(Association key:key value:value)) ifTrue:[
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   607
            newCollection at:key put:value
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   608
        ]
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   609
    ].
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   610
    ^ newCollection
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   611
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   612
    "
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   613
     |ages|
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   614
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   615
     ages := Dictionary new.
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   616
     ages at:'cg' put:37.
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   617
     ages at:'ca' put:33.
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   618
     ages at:'sv' put:36.
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   619
     ages at:'tk' put:28.
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   620
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   621
     ages associationsSelect:[:assoc |
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   622
                (assoc key startsWith:'c') or:[assoc value < 30]].
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   623
    "
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   624
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   625
    "Created: / 14-09-2018 / 16:44:11 / Stefan Vogel"
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   626
!
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   627
3615
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   628
do:aBlock
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   629
    "evaluate aBlock for each value"
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   630
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   631
    self keysAndValuesDo:[:elKey :elValue | aBlock value:elValue]
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   632
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   633
    "Created: / 19.6.1998 / 00:56:24 / cg"
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   634
!
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   635
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   636
keysAndValuesDo:aBlock
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   637
    "evaluate aBlock for each key and value"
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   638
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   639
    ^ self subclassResponsibility
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   640
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   641
    "Created: / 19.6.1998 / 00:56:52 / cg"
23341
1fdd8b7e859c #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 23338
diff changeset
   642
!
1fdd8b7e859c #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 23338
diff changeset
   643
23363
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   644
keysAndValuesSelect:aBlock
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   645
    "return a new collection with all elements from the receiver, for which
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   646
     the argument aBlock evaluates to true.
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   647
     The block gets keys and values as separate arguments.
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   648
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   649
     See also:
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   650
        #associationsSelect:    (which passes key-value pairs),
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   651
        #keysSelect:            (which passes key values),
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   652
        #select:                (which only passes the value)
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   653
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   654
     This is much like #associationsSelect:, but aBlock gets the
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   655
     key and value as two separate arguments.
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   656
     #associationsSelect: is a bit slower.
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   657
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   658
     WARNING: do not add/remove elements while iterating over the receiver.
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   659
              Iterate over a copy to do this."
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   660
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   661
    |newCollection|
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   662
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   663
    newCollection := self species new.
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   664
    self keysAndValuesDo:[:key :value |
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   665
        (aBlock value:key value:value) ifTrue:[
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   666
            newCollection at:key put:value
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   667
        ]
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   668
    ].
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   669
    ^ newCollection
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   670
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   671
    "
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   672
     |ages|
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   673
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   674
     ages := SmallDictionary new.
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   675
     ages at:'cg' put:37.
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   676
     ages at:'ca' put:33.
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   677
     ages at:'sv' put:36.
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   678
     ages at:'tk' put:28.
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   679
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   680
     ages keysAndValuesSelect:[:name :age |
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   681
                (name startsWith:'c') or:[age < 30]].
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   682
    "
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   683
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   684
    "Created: / 18-09-2018 / 15:22:05 / Stefan Vogel"
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   685
!
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   686
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   687
keysSelect:aBlock
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   688
    "return a new collection with all elements from the receiver, for which
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   689
     the argument aBlock evaluates to true.
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   690
     The block gets the individual keys as its single argument.
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   691
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   692
     See also:
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   693
        #associationsSelect:            (which passes key->value associations),
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   694
        #keysAndValuesSelect:           (which passes key & value args)
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   695
        #select:                        (which passes values as arg),
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   696
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   697
     WARNING: do not add/remove elements while iterating over the receiver.
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   698
              Iterate over a copy to do this."
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   699
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   700
    |newCollection|
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   701
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   702
    newCollection := self species new.
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   703
    self keysAndValuesDo:[:key :value |
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   704
        (aBlock value:key) ifTrue:[
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   705
            newCollection at:key put:value
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   706
        ]
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   707
    ].
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   708
    ^ newCollection
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   709
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   710
    "
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   711
     |d|
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   712
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   713
     d := SmallDictionary new.
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   714
     d at:#foo put:#bar.
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   715
     d at:#bar put:#baz.
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   716
     d at:#baz put:#foo.
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   717
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   718
     d keysSelect:[:el | el startsWith:'b'].
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   719
    "
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   720
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   721
    "Created: / 18-09-2018 / 15:23:26 / Stefan Vogel"
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   722
!
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   723
23341
1fdd8b7e859c #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 23338
diff changeset
   724
printElementsDo:aBlock
1fdd8b7e859c #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 23338
diff changeset
   725
    "redefined, so #printOn: prints associations"
1fdd8b7e859c #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 23338
diff changeset
   726
1fdd8b7e859c #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 23338
diff changeset
   727
    ^ self associationsDo:aBlock
1fdd8b7e859c #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 23338
diff changeset
   728
1fdd8b7e859c #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 23338
diff changeset
   729
    "Created: / 14-09-2018 / 17:47:48 / Stefan Vogel"
23363
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   730
!
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   731
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   732
select:aBlock
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   733
    "return a new collection with all elements from the receiver, for which
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   734
     the argument aBlock evaluates to true.
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   735
     The block gets the individual values as its single argument.
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   736
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   737
     See also:
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   738
        #associationsSelect:            (which passes key->value associations),
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   739
        #keysAndValuesSelect:           (which passes key & value args)
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   740
        #keysSelect:                    (which passes key values),
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   741
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   742
     WARNING: do not add/remove elements while iterating over the receiver.
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   743
              Iterate over a copy to do this."
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   744
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   745
    |newCollection|
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   746
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   747
    newCollection := self species new.
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   748
    self keysAndValuesDo:[:key :value |
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   749
        (aBlock value:value) ifTrue:[
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   750
            newCollection at:key put:value
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   751
        ]
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   752
    ].
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   753
    ^ newCollection
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   754
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   755
    "
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   756
     |d|
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   757
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   758
     d := SmallDictionary new.
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   759
     d at:#foo put:#bar.
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   760
     d at:#bar put:#baz.
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   761
     d at:#baz put:#foo.
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   762
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   763
     d select:[:el | el startsWith:'b'].
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   764
    "
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   765
3d39badc34e9 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 23354
diff changeset
   766
    "Created: / 18-09-2018 / 15:25:15 / Stefan Vogel"
3615
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   767
! !
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   768
21655
058cafb6c2f6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21653
diff changeset
   769
23706
2ff9f4268f74 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 23398
diff changeset
   770
!KeyedCollection methodsFor:'queries'!
2ff9f4268f74 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 23398
diff changeset
   771
2ff9f4268f74 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 23398
diff changeset
   772
includesAssociation:anAssociation
2ff9f4268f74 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 23398
diff changeset
   773
    "return true, if there is an association in the receiver with the
2ff9f4268f74 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 23398
diff changeset
   774
     same key and value as the argument, anAssociation.
2ff9f4268f74 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 23398
diff changeset
   775
     NOTICE: in contrast to #includes:, this compares both key and value."
2ff9f4268f74 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 23398
diff changeset
   776
2ff9f4268f74 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 23398
diff changeset
   777
    |val|
2ff9f4268f74 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 23398
diff changeset
   778
2ff9f4268f74 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 23398
diff changeset
   779
    val := self at:(anAssociation key) ifAbsent:[^ false].
2ff9f4268f74 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 23398
diff changeset
   780
    ^ val = anAssociation value
2ff9f4268f74 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 23398
diff changeset
   781
2ff9f4268f74 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 23398
diff changeset
   782
    "Created: / 14-09-2018 / 16:48:10 / Stefan Vogel"
2ff9f4268f74 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 23398
diff changeset
   783
!
2ff9f4268f74 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 23398
diff changeset
   784
2ff9f4268f74 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 23398
diff changeset
   785
includesIdenticalKey:aKey
2ff9f4268f74 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 23398
diff changeset
   786
    "return true, if the argument, aKey is a key in the receiver"
2ff9f4268f74 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 23398
diff changeset
   787
2ff9f4268f74 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 23398
diff changeset
   788
    self keysDo:[:elKey | aKey == elKey ifTrue:[^ true]].
2ff9f4268f74 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 23398
diff changeset
   789
    ^ false
2ff9f4268f74 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 23398
diff changeset
   790
2ff9f4268f74 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 23398
diff changeset
   791
    "Created: / 19.6.1998 / 00:55:05 / cg"
2ff9f4268f74 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 23398
diff changeset
   792
!
2ff9f4268f74 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 23398
diff changeset
   793
2ff9f4268f74 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 23398
diff changeset
   794
includesKey:aKey
2ff9f4268f74 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 23398
diff changeset
   795
    "return true, if the argument, aKey is a key in the receiver"
2ff9f4268f74 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 23398
diff changeset
   796
2ff9f4268f74 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 23398
diff changeset
   797
    self keysDo:[:elKey | aKey = elKey ifTrue:[^ true]].
2ff9f4268f74 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 23398
diff changeset
   798
    ^ false
2ff9f4268f74 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 23398
diff changeset
   799
2ff9f4268f74 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 23398
diff changeset
   800
    "Created: / 19.6.1998 / 00:55:05 / cg"
2ff9f4268f74 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 23398
diff changeset
   801
! !
2ff9f4268f74 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 23398
diff changeset
   802
3615
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   803
!KeyedCollection methodsFor:'removing'!
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   804
21732
0fd83e26247f #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21655
diff changeset
   805
removeAllKeys:aCollection
0fd83e26247f #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21655
diff changeset
   806
    "remove all keys of the argument, aCollection from the receiver.
0fd83e26247f #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21655
diff changeset
   807
     Raises an error, if some element-to-remove is not in the receiver."
0fd83e26247f #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21655
diff changeset
   808
0fd83e26247f #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21655
diff changeset
   809
    aCollection do:[:element | self removeKey:element].
0fd83e26247f #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21655
diff changeset
   810
0fd83e26247f #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21655
diff changeset
   811
    "Modified (comment): / 28-04-2017 / 13:36:15 / stefan"
0fd83e26247f #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21655
diff changeset
   812
!
0fd83e26247f #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21655
diff changeset
   813
23338
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   814
removeAssociation:assoc
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   815
    "remove the association from the collection.
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   816
     If it was not in the collection report an error.
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   817
     Only the key is used in the passed argument, and a new
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   818
     association, for the key and the previously stored value is returned.
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   819
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   820
     WARNING: do not remove elements while iterating over the receiver.
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   821
              See #saveRemoveKey: to do this."
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   822
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   823
    |key|
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   824
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   825
    key := assoc key.
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   826
    ^ Association key:key value:(self removeKey:key)
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   827
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   828
    "Created: / 14-09-2018 / 16:20:47 / Stefan Vogel"
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   829
!
e2290d3eb871 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21732
diff changeset
   830
3615
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   831
removeKey:aKey
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   832
    "remove key (and the value stored under that key) from the
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   833
     receiver; raise an error if no such element is contained"
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   834
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   835
    ^ self removeKey:aKey ifAbsent:[self errorKeyNotFound:aKey]
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   836
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   837
    "Created: / 19.6.1998 / 00:53:25 / cg"
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   838
    "Modified: / 19.6.1998 / 00:54:02 / cg"
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   839
!
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   840
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   841
removeKey:aKey ifAbsent:exceptionBlock
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   842
    "remove key (and the value stored under that key) from the
19844
9a7234d4b08c #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 19469
diff changeset
   843
     receiver; return the value which was stored previously there.
9a7234d4b08c #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 19469
diff changeset
   844
     If no such element is contained, return the value
3615
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   845
     from evaluating exceptionBlock"
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   846
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   847
    ^ self subclassResponsibility
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   848
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   849
    "Created: / 19.6.1998 / 00:53:58 / cg"
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   850
! !
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   851
21653
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   852
!KeyedCollection methodsFor:'searching'!
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   853
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   854
findFirst:aBlock ifNone:exceptionValue
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   855
    "find the index of the first element, for which evaluation of the argument, aBlock returns true;
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   856
     return its index or the value from exceptionValue if none detected.
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   857
     This is much like #detect:ifNone:, however, here an INDEX is returned,
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   858
     while #detect:ifNone: returns the element.
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   859
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   860
     Here we return the first key for which aBlock matches the value.
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   861
     Note that there is no order in a Dictionary, so any element is first."
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   862
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   863
    self keysAndValuesDo:[:eachKey :eachValue| (aBlock value:eachValue) ifTrue:[^ eachKey]].
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   864
    ^ exceptionValue value.
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   865
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   866
    "
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   867
        (KeyValueList withKeys:#('a' 'b' 'c') andValues:#('bla' 'hello' 'hallo'))
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   868
            findFirst:[:v| v first = $h].
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   869
    "
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   870
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   871
    "Created: / 16-03-2017 / 17:46:02 / stefan"
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   872
!
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   873
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   874
findFirstKey:aBlock
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   875
    "find and return the first key, for which evaluation of the argument, aBlock
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   876
     returns true; return nil if none is detected."
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   877
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   878
    self keysDo:[:key |
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   879
        (aBlock value:key) ifTrue:[^ key].
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   880
    ].
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   881
    ^ nil
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   882
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   883
    "Created: 8.10.1996 / 22:01:31 / cg"
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   884
    "Modified: 8.10.1996 / 22:02:03 / cg"
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   885
! !
baee5890dca8 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21649
diff changeset
   886
3615
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   887
!KeyedCollection class methodsFor:'documentation'!
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   888
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   889
version
19469
e43475084bb5 #DOCUMENTATION
Claus Gittinger <cg@exept.de>
parents: 17120
diff changeset
   890
    ^ '$Header$'
12667
4297ecfffa96 #values moved up
Claus Gittinger <cg@exept.de>
parents: 11222
diff changeset
   891
!
4297ecfffa96 #values moved up
Claus Gittinger <cg@exept.de>
parents: 11222
diff changeset
   892
4297ecfffa96 #values moved up
Claus Gittinger <cg@exept.de>
parents: 11222
diff changeset
   893
version_CVS
19469
e43475084bb5 #DOCUMENTATION
Claus Gittinger <cg@exept.de>
parents: 17120
diff changeset
   894
    ^ '$Header$'
3615
c0f82feaf6a7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   895
! !
17120
246d9198d84e class: KeyedCollection
Claus Gittinger <cg@exept.de>
parents: 13045
diff changeset
   896