X Tutup
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
a032f35
update for GemStone 3.4 ...
dalehenrich Dec 21, 2015
6ea4f01
Merge branch 'master' into dev
dalehenrich Apr 4, 2016
078756d
forgotten update of version number for Grease in GRPlatform
May 5, 2016
05383e1
Sync 2016-08-25
marschall Aug 25, 2016
ef0bacc
Merge pull request #16 from marschall/sync-2016-08-25
marschall Aug 25, 2016
446a1a7
Merge branch 'dev' of https://github.com/SeasideSt/Grease into Seasid…
dalehenrich Aug 26, 2016
302cf83
Merge branch 'SeasideSt-dev' into dev
dalehenrich Aug 26, 2016
bef5f44
Merge branch 'dev' of github.com:GsDevKit/Grease into dev
dalehenrich Aug 26, 2016
f60f890
allow pharo6.0 failures ... until pharo 6.0 approaches release ... ad…
dalehenrich Aug 26, 2016
df7625d
Merge branch 'dev' of github.com:GsDevKit/Grease into dev
dalehenrich Aug 26, 2016
a8b603f
allow_failures needs to be in a matrix:
dalehenrich Aug 26, 2016
914fc54
Merge pull request #18 from GsDevKit/dev
dalehenrich Aug 26, 2016
3ca918d
Synch 2016-08-26
marschall Aug 26, 2016
b02ba13
Merge pull request #19 from marschall/sync-2016-0826
marschall Aug 26, 2016
a668272
eliminate some seaside.gemstone.com references
dalehenrich Feb 28, 2017
4b2c66a
Merge branch 'dev' of github.com:GsDevKit/Grease into dev
dalehenrich Feb 28, 2017
cde5434
update gemstone versions
dalehenrich Feb 28, 2017
15d1ec6
* added GRDynamicVariable
theseion May 18, 2017
9bda9b1
sync with smalltalkhub
May 25, 2017
ff9f6e1
Added pharo6 to baseline + adapted yaml file with supported versions
May 25, 2017
bb43166
Compatibility for Pharo6
May 25, 2017
1416992
Compatibility for Pharo6
May 25, 2017
c4a2d00
Compatibility for Pharo6
May 25, 2017
8251c94
Fix for Squeak 5.1, removed support for squeak 4.6 and added Squeak 6…
May 25, 2017
b31288a
remove squeak 6 since it's not supported on smalltalk ci yet
May 25, 2017
e0e49f0
Merge branch 'master' into dev
May 25, 2017
9c3d66a
Reverted changes to files because of different whitespace
May 25, 2017
ead2c3f
Merge branch 'dev' into pull23_dev
May 25, 2017
87b33fd
added GRDynamicVariable to Pharo60 package
May 25, 2017
c7e2bc7
added GRDynamicVariable to Squeak
theseion May 25, 2017
85bbc25
Added GRDynamicVariable implementation on GemStone
May 25, 2017
27b9484
Merge pull request #24 from SeasideSt/pull23_dev
May 25, 2017
e299075
Updated version to 1.3.0
May 25, 2017
06854d7
Merge branch 'master' of https://github.com/SeasideSt/Grease into Sea…
dalehenrich May 25, 2017
a3aca8e
Merge branch 'SeasideSt-master' into dev
dalehenrich May 25, 2017
43c850d
Pharo6 compatibility: GRPackage>>resolve:with: should take -Pharo6.0-…
May 26, 2017
604cd5b
Merge pull request #6 from SeasideSt/master
dalehenrich May 26, 2017
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
[._]*.s[a-w][a-z]
[._]s[a-w][a-z]
*.un~
Session.vim
.netrwhist
*~
11 changes: 7 additions & 4 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -1,14 +1,17 @@
language: smalltalk
sudo: false
smalltalk:
- Pharo-6.0
- Pharo-5.0
- Pharo-4.0
- Pharo-3.0
- Squeak-4.5
- Squeak-5.0
- Squeak-5.1
- GemStone-3.1.0.6
- GemStone-3.2.12
- GemStone-3.3.0
- GemStone-3.2.16
- GemStone-3.3.4
cache:
directories:
- $SMALLTALK_CI_CACHE
#matrix:
# allow_failures:
# - smalltalk: Pharo-6.0
23 changes: 12 additions & 11 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,31 +3,32 @@ The Grease Portability Library [![Build Status](https://travis-ci.org/SeasideSt

The main repository of Grease is on Smalltalkhub: (http://www.smalltalkhub.com/#!/~Seaside/Grease11). This repository mirrors it.

Grease enhances the ANSI Smalltalk standard. With only a few exceptions, we assume platforms are fully ANSI-compliant. Platforms want to support Seaside and standardization makes this easier for the project’s developers and its porters.
Grease enhances the ANSI Smalltalk standard. With only a few exceptions, we assume platforms are fully ANSI-compliant. Platforms want to support Seaside and standardization makes this easier for the project’s developers and its porters.

Grease defines expected APIs with unit tests. Platforms can quickly determine if they are compatible and users can examine the tests to determine exactly which behaviours they can count on.

Grease takes a pragmatic approach to compatibility. Sometimes a method behaves so differently on two platforms, for example, that we are forced to avoid it or to standardize on a new selector. To get standard exception signaling on all platforms, Grease is forced to provide special exception classes that can be subclassed. Sometimes we need to put “right” aside and settle, instead, on a solution that can be implemented everywhere.
Grease takes a pragmatic approach to compatibility. Sometimes a method behaves so differently on two platforms, for example, that we are forced to avoid it or to standardize on a new selector. To get standard exception signaling on all platforms, Grease is forced to provide special exception classes that can be subclassed. Sometimes we need to put “right” aside and settle, instead, on a solution that can be implemented everywhere.

Grease tries to be concise and consistent. Despite its pragmatic approach, we still want to be “right” as much as possible. Because it’s hard to remove functionality once it has been added, we need to carefully consider each addition before proceeding. We’re moving slowly and looking for methods that are commonly used and that have clear names and semantics.
Grease tries to be concise and consistent. Despite its pragmatic approach, we still want to be “right” as much as possible. Because it’s hard to remove functionality once it has been added, we need to carefully consider each addition before proceeding. We’re moving slowly and looking for methods that are commonly used and that have clear names and semantics.

Grease does not try to solve all problems. We are not testing Sockets or HTTP clients. We don’t expect platforms to have standard SSL or graphics libraries. Its scope may grow over time, but for now we’re focusing on extending the functionality of the core classes defined in the ANSI standard (collections, exceptions, streams, blocks, etc.) and on other pieces of functionality that are critical to the Seaside project (e.g. random number generation and secure hashing).
Grease does not try to solve all problems. We are not testing Sockets or HTTP clients. We don’t expect platforms to have standard SSL or graphics libraries. Its scope may grow over time, but for now we’re focusing on extending the functionality of the core classes defined in the ANSI standard (collections, exceptions, streams, blocks, etc.) and on other pieces of functionality that are critical to the Seaside project (e.g. random number generation and secure hashing).

Grease is widely adopted. Implementations exist already for all platforms that support Seaside 3.x. As well as Seaside, new versions of Magritte, Pier, and Monticello are already being implemented on top of Grease.

##Travis builds
## Travis builds

The [Travis CI builds](https://travis-ci.org/SeasideSt/Grease) currently test Grease for the following platforms and versions:

| Squeak | Pharo | GemStone |
| --------------- | ---------------- | -------------------- |
| Squeak 5.0 | Pharo 5.0 | GemStone 3.3.0 |
| Squeak 4.5 | Pharo 4.0 | GemStone 3.2.12 |
| | Pharo 3.0 | GemStone 3.1.0.6 |
| Squeak 5.1 | Pharo 6.0 | GemStone 3.3.4 |
| | Pharo 5.0 | GemStone 3.2.16 |
| | Pharo 4.0 | GemStone 3.1.0.6 |
| | Pharo 3.0 | |

##Installation
## Installation

###Squeak and Pharo
### Squeak and Pharo

Make sure you have the [MetacelloPreview version](https://github.com/dalehenrich/metacello-work), otherwise the load will not work. You have two options for loading: from Smalltalkhub or from Github.

Expand All @@ -47,7 +48,7 @@ Metacello new
githubUser: 'SeasideSt' project: 'Grease' commitish: '' path: 'repository';
load
```
###GemStone
### GemStone

Grease is part of the GLASS setup. You can upgrade your version of Grease using [GsUpgrader](https://github.com/GsDevKit/gsUpgrader).
GsUpgrader works on all versions of GemStone against all versions of GLASS:
Expand Down
5 changes: 3 additions & 2 deletions repository/BaselineOfGrease.package/.filetree
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
{
"noMethodMetaData" : true,
"separateMethodMetaAndSource" : false,
"useCypressPropertiesFile" : true }
"noMethodMetaData" : true,
"useCypressPropertiesFile" : true
}
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,25 @@ baseline: spec
spec
group: 'Slime' with: #('Grease-Pharo40-Slime');
group: 'Slime Tests' with: #('Grease-Tests-Slime') ].
spec
for: #(#'pharo6.x')
do: [
spec
package: 'Grease-Core'
with: [ spec includes: #('Grease-Pharo60-Core') ];
package: 'Grease-Tests-Core'
with: [ spec includes: #('Grease-Tests-Pharo20-Core') ];
package: 'Grease-Pharo60-Core'
with: [ spec requires: #('Grease-Core') ];
package: 'Grease-Tests-Pharo20-Core'
with: [ spec requires: #('Grease-Tests-Core') ];
package: 'Grease-Pharo40-Slime'
with: [ spec requires: #('Grease-Core') ];
package: 'Grease-Tests-Slime'
with: [ spec requires: #('Grease-Pharo40-Slime') ].
spec
group: 'Slime' with: #('Grease-Pharo40-Slime');
group: 'Slime Tests' with: #('Grease-Tests-Slime') ].
spec
for: #'gemstone'
do: [
Expand All @@ -128,14 +147,14 @@ baseline: spec
spec
className: 'ConfigurationOfGsCore';
versionString: #'stable';
repository: 'http://seaside.gemstone.com/ss/MetacelloRepository' ];
repository: 'http://seaside.gemtalksystems.com/ss/MetacelloRepository' ];
project: 'UTF8'
with: [
spec
className: 'ConfigurationOfGsMisc';
versionString: #'stable';
loads: #('Utf8Encoding');
repository: 'http://seaside.gemstone.com/ss/MetacelloRepository' ];
repository: 'http://seaside.gemtalksystems.com/ss/MetacelloRepository' ];
project: 'System-Digital-Signatures'
copyFrom: 'UTF8'
with: [ spec loads: #('System-Digital-Signatures') ];
Expand Down Expand Up @@ -193,7 +212,7 @@ baseline: spec
requires: #('Grease-GemStone-Core');
postLoadDoIt: #'initializeLatin1ToUtf8Encodings' ] ].
spec
for: #(#'gs3.2.x' #'gs3.3.x')
for: #(#'gs3.2.x' #'gs3.3.x' #'gs3.4.x')
do: [
spec
package: 'Grease-Tests-GemStone-Core'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,6 @@
"class" : {
},
"instance" : {
"baseline:" : "JohanBrichau 2/27/2016 13:46",
"baseline:" : "JohanBrichau 5/25/2017 12:45",
"initializeLatin1ToUtf8Encodings" : "JohanBrichau 10/19/2014 10:00",
"slimeForSqueakPharo1xPharo2x:" : "JohanBrichau 02/16/2014 03:49" } }
Original file line number Diff line number Diff line change
@@ -1,14 +1,11 @@
{
"category" : "BaselineOfGrease",
"classinstvars" : [
],
"classvars" : [
],
"commentStamp" : "",
"instvars" : [
],
"name" : "BaselineOfGrease",
"pools" : [
],
"super" : "BaselineOf",
"type" : "normal" }
"category" : "BaselineOfGrease",
"classinstvars" : [ ],
"pools" : [ ],
"classvars" : [ ],
"instvars" : [ ],
"name" : "BaselineOfGrease",
"type" : "normal"
}
Original file line number Diff line number Diff line change
@@ -1 +1 @@
SystemOrganization addCategory: #BaselineOfGrease!
SystemOrganization addCategory: #'BaselineOfGrease'!
Original file line number Diff line number Diff line change
@@ -1 +1 @@
(name 'BaselineOfGrease-JohanBrichau.14' message 'Ensure Squeak5 tests package is loaded in Squeak5' id 'abde1bd6-a8d6-45fc-a922-bcf63ec38f03' date '27 February 2016' time '1:47:23.046532 pm' author 'JohanBrichau' ancestors ((name 'BaselineOfGrease-JohanBrichau.13' message 'Forked Grease-Tests-Pharo-Core into Grease-Tests-Squeak5-Core' id '3a01ebbc-8859-45db-ae5a-e5de8073d3a4' date '27 February 2016' time '1:40:18.726436 pm' author 'JohanBrichau' ancestors ((name 'BaselineOfGrease-JohanBrichau.12' message 'added Pharo-Tests to Squeak5 load' id 'ffe11ade-e4f1-496d-ae59-74543cfad134' date '27 February 2016' time '1:21:56.832518 pm' author 'JohanBrichau' ancestors ((name 'BaselineOfGrease-JohanBrichau.11' message 'added pharo5 platform to baseline' id '5c0332e9-ef4c-43cd-9066-7c9fe9ed6506' date '27 February 2016' time '12:12:12.067693 pm' author 'JohanBrichau' ancestors ((name 'BaselineOfGrease-JohanBrichau.10' message 'added squeak 5 platform' id '18f9d568-869f-4550-804a-b0ba101f33f3' date '13 December 2015' time '8:36:25.150207 pm' author 'JohanBrichau' ancestors ((name 'BaselineOfGrease-dkh.9' message 'Update baseline for GemStone 3.3' id 'af9364dd-14bc-4e5e-9fc7-0abe08732ab2' date '26 May 2015' time '11:46:07 am' author 'dkh' ancestors ((name 'BaselineOfGrease-JohanBrichau.8' message 'separate package for Squeak' id '91c019c7-2b8b-40c3-97d9-2047a69512a7' date '22 March 2015' time '12:01:37 pm' author 'JohanBrichau' ancestors ((name 'BaselineOfGrease-JohanBrichau.7' message 'included Pharo 4 and did some baseline formatting' id '3722041d-d4b5-4496-a25a-0e891fe9a945' date '8 November 2014' time '9:28:01 am' author 'JohanBrichau' ancestors ((name 'BaselineOfGrease-JohanBrichau.6' message 'added initializeLatin1ToUtf8Encodings' id '4d976044-1aa9-44b6-bab0-b66ac758b3cd' date '19 October 2014' time '10:05:25 am' author 'JohanBrichau' ancestors ((name 'BaselineOfGrease-JohanBrichau.6' message 'added initializeLatin1ToUtf8Encodings' id 'b4ac5766-d472-4557-beff-59e5b733bce0' date '19 October 2014' time '10:04:55 am' author 'JohanBrichau' ancestors ((name 'BaselineOfGrease-dkh.5' message 'typoe' id '93eb3230-7956-4a6e-85dc-243f3dd895a1' date '4 June 2014' time '3:13:26 pm' author 'dkh' ancestors ((name 'BaselineOfGrease-dkh.4' message 'woops specified the package branch incorrectly ... I think I got it right this time...' id '3003ee31-9d17-4dd1-9b9a-f8a80e4f0ba1' date '4 June 2014' time '3:12:31 pm' author 'dkh' ancestors ((name 'BaselineOfGrease-dkh.3' message 'add Grease-Tests-GemStone-Core.v32 to baseline' id '26f128ca-b62e-4295-9a58-a9758b670c37' date '4 June 2014' time '2:57:48 pm' author 'dkh' ancestors ((name 'BaselineOfGrease-JohanBrichau.2' message 'forgotten methods' id '38758da9-c922-4530-a19e-f8783900e787' date '16 February 2014' time '3:50:22 am' author 'JohanBrichau' ancestors ((name 'BaselineOfGrease-JohanBrichau.1' message 'first baseline' id 'b89398df-14c6-4b6a-a2ba-91ad806bb07f' date '16 February 2014' time '1:49:46 am' author 'JohanBrichau' ancestors () stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())
(name 'BaselineOfGrease-dkh.19' message 'merged by GitFileTree-MergeDriver' id 'b05179de-cbe6-4b80-824b-f6220d2c9252' date '25 May 2017' time '11:41:41.478907 am' author 'dkh' ancestors ((name 'BaselineOfGrease-dkh.17' message 'eliminate some seaside.gemstone.com references' id '01c1cf6a-4d84-47d2-97f0-b9c4d7fffd58' date '28 February 2017' time '1:54:50 pm' author 'dkh' ancestors ((name 'BaselineOfGrease-dkh.16' message 'merged by GitFileTree-MergeDriver' id '644ab134-dd42-4b9f-948b-c277cd963d5d' date '26 August 2016' time '5:20:50 am' author 'dkh' ancestors ((name 'BaselineOfGrease-dkh.15' message 'merged by GitFileTree-MergeDriver' id '86b6f4f6-f95f-4bd7-9224-f31c5460e354' date '4 April 2016' time '9:40:53 am' author 'dkh' ancestors () stepChildren ())(name 'BaselineOfGrease-dkh.15' message 'merged by GitFileTree-MergeDriver' id '415af41c-2c3d-40a8-9f75-d9e8de921224' date '26 August 2016' time '2:19:29 am' author 'dkh' ancestors ((name 'BaselineOfGrease-dkh.10' message 'update for GemStone 3.4 ...' id 'ad7f9331-d83f-4976-bf57-1d1e81111fc6' date '21 December 2015' time '3:07:11 pm' author 'dkh' ancestors () stepChildren ())(name 'BaselineOfGrease-JohanBrichau.14' message 'Ensure Squeak5 tests package is loaded in Squeak5' id 'abde1bd6-a8d6-45fc-a922-bcf63ec38f03' date '27 February 2016' time '1:47:23 am' author 'JohanBrichau' ancestors ((name 'BaselineOfGrease-JohanBrichau.13' message 'Forked Grease-Tests-Pharo-Core into Grease-Tests-Squeak5-Core' id '3a01ebbc-8859-45db-ae5a-e5de8073d3a4' date '27 February 2016' time '1:40:18 am' author 'JohanBrichau' ancestors ((name 'BaselineOfGrease-JohanBrichau.12' message 'added Pharo-Tests to Squeak5 load' id 'ffe11ade-e4f1-496d-ae59-74543cfad134' date '27 February 2016' time '1:21:56 am' author 'JohanBrichau' ancestors ((name 'BaselineOfGrease-JohanBrichau.11' message 'added pharo5 platform to baseline' id '5c0332e9-ef4c-43cd-9066-7c9fe9ed6506' date '27 February 2016' time '12:12:12 pm' author 'JohanBrichau' ancestors ((name 'BaselineOfGrease-JohanBrichau.10' message 'added squeak 5 platform' id '18f9d568-869f-4550-804a-b0ba101f33f3' date '13 December 2015' time '8:36:25 am' author 'JohanBrichau' ancestors ((name 'BaselineOfGrease-dkh.9' message 'Update baseline for GemStone 3.3' id 'af9364dd-14bc-4e5e-9fc7-0abe08732ab2' date '26 May 2015' time '11:46:07 am' author 'dkh' ancestors ((name 'BaselineOfGrease-JohanBrichau.8' message 'separate package for Squeak' id '91c019c7-2b8b-40c3-97d9-2047a69512a7' date '22 March 2015' time '12:01:37 pm' author 'JohanBrichau' ancestors ((name 'BaselineOfGrease-JohanBrichau.7' message 'included Pharo 4 and did some baseline formatting' id '3722041d-d4b5-4496-a25a-0e891fe9a945' date '8 November 2014' time '9:28:01 am' author 'JohanBrichau' ancestors ((name 'BaselineOfGrease-JohanBrichau.6' message 'added initializeLatin1ToUtf8Encodings' id '4d976044-1aa9-44b6-bab0-b66ac758b3cd' date '19 October 2014' time '10:05:25 am' author 'JohanBrichau' ancestors ((name 'BaselineOfGrease-JohanBrichau.6' message 'added initializeLatin1ToUtf8Encodings' id 'b4ac5766-d472-4557-beff-59e5b733bce0' date '19 October 2014' time '10:04:55 am' author 'JohanBrichau' ancestors ((name 'BaselineOfGrease-dkh.5' message 'typoe' id '93eb3230-7956-4a6e-85dc-243f3dd895a1' date '4 June 2014' time '3:13:26 pm' author 'dkh' ancestors ((name 'BaselineOfGrease-dkh.4' message 'woops specified the package branch incorrectly ... I think I got it right this time...' id '3003ee31-9d17-4dd1-9b9a-f8a80e4f0ba1' date '4 June 2014' time '3:12:31 pm' author 'dkh' ancestors ((name 'BaselineOfGrease-dkh.3' message 'add Grease-Tests-GemStone-Core.v32 to baseline' id '26f128ca-b62e-4295-9a58-a9758b670c37' date '4 June 2014' time '2:57:48 pm' author 'dkh' ancestors ((name 'BaselineOfGrease-JohanBrichau.2' message 'forgotten methods' id '38758da9-c922-4530-a19e-f8783900e787' date '16 February 2014' time '3:50:22 am' author 'JohanBrichau' ancestors ((name 'BaselineOfGrease-JohanBrichau.1' message 'first baseline' id 'b89398df-14c6-4b6a-a2ba-91ad806bb07f' date '16 February 2014' time '1:49:46 am' author 'JohanBrichau' ancestors () stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())(name 'BaselineOfGrease-JohanBrichau.18' message 'Pharo 6 compatibility' id 'd2d614aa-b80c-0d00-b4b6-ae9900bfc9db' date '25 May 2017' time '12:46:04.246978 pm' author 'JohanBrichau' ancestors ((name 'BaselineOfGrease-JohanBrichau.17' message 'Added pharo6' id '52335469-982c-483b-a975-4518820b9bcf' date '25 May 2017' time '11:20:35.004053 am' author 'JohanBrichau' ancestors ((id '644ab134-dd42-4b9f-948b-c277cd963d5d')) stepChildren ())) stepChildren ())) stepChildren ())
3 changes: 1 addition & 2 deletions repository/BaselineOfGrease.package/properties.json
Original file line number Diff line number Diff line change
@@ -1,2 +1 @@
{
}
{ }
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
adding
"protocol: adding"
addAll: aDictionary
aDictionary keysAndValuesDo: [ :key :value |
self privateAt: key put: value ].
^ aDictionary
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
enumerating
keysAndAllValuesDo: aTwoArgumentBlock
| seenKeys |
seenKeys := GRSmallOrderedSet new.
1 to: size do: [ :index |
| key |
key := keys at: index.
(seenKeys includes: key) ifFalse: [
aTwoArgumentBlock
value: key
value: (self privateAllAt: key startingAt: index).
seenKeys add: key ] ]
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
private
privateAllAt: aKey startingAt: aStartInteger
^ Array new: 2 streamContents: [ :stream |
aStartInteger to: size do: [ :index |
(keys at: index) = aKey
ifTrue: [ stream nextPut: (values at: index) ] ] ]
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ removeKey: aKey ifAbsent: aBlock

"This is inefficient and could be optimized."
| removed |
removed := Array streamContents: [ :stream |
removed := Array new: 2 streamContents: [ :stream |
| index |
[ (index := self findIndexFor: aKey) = 0 ] whileFalse: [
stream nextPut: (self removeIndex: index) ] ].
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,10 @@
},
"instance" : {
"add:" : "lr 7/25/2011 19:52",
"addAll:" : "pmm 8/26/2016 15:57",
"allAt:" : "jf 2/15/2010 15:39",
"allAt:ifAbsent:" : "jf 2/15/2010 15:39",
"at:add:" : "jf 2/15/2010 13:24",
"removeKey:ifAbsent:" : "jf 2/15/2010 14:43" } }
"keysAndAllValuesDo:" : "pmm 8/26/2016 15:52",
"privateAllAt:startingAt:" : "pmm 8/26/2016 15:52",
"removeKey:ifAbsent:" : "pmm 8/26/2016 15:56" } }
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
I am an implementation of an ordered multi-map. I allow multiple values to be associated with the same key and maintain the order of addition. #at: and its derivatives all operate on the first matching key, while #allAt: returns the complete list of values for a key in the order they were added.
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
adding
add: anAssociation
self privateAt: anAssociation key put: anAssociation value.
^ anAssociation
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
adding
addAll: aDictionary
aDictionary keysAndValuesDo: [ :key :value |
self privateAt: key put: value ].
^ aDictionary
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
accessing
allAt: aKey
^ self privateAllAt: aKey startingAt: 1
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
accessing
allAt: aKey ifAbsent: absentBlock
| results |
results := self allAt: aKey.
^ results isEmpty
ifTrue: [ absentBlock value ]
ifFalse: [ results ]
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
adding
at: aKey add: aValue
"Add an association between aKey and aValue. Do not replace existing
values with the same key."

^ self privateAt: aKey put: aValue
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
enumerating
keysAndAllValuesDo: aTwoArgumentBlock
| seenKeys |
seenKeys := GRSmallOrderedSet new.
1 to: size * 2 - 1 by: 2 do: [ :index |
| key |
key := table at: index.
(seenKeys includes: key) ifFalse: [
aTwoArgumentBlock
value: key
value: (self privateAllAt: key startingAt: index).
seenKeys add: key ] ]
Loading
X Tutup