"======================================================================
|
|   MappedCollection Method Definitions
|
 ======================================================================"


"======================================================================
|
| Copyright (C) 1990, 1991 Free Software Foundation, Inc.
| Written by Steve Byrne.
|
| This file is part of GNU Smalltalk.
|
| GNU Smalltalk is free software; you can redistribute it and/or modify it
| under the terms of the GNU General Public License as published by the Free
| Software Foundation; either version 1, or (at your option) any later version.
| 
| GNU Smalltalk is distributed in the hope that it will be useful, but WITHOUT
| ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
| FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
| details.
| 
| You should have received a copy of the GNU General Public License along with
| GNU Smalltalk; see the file COPYING.  If not, write to the Free Software
| Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  
|
 ======================================================================"


"
|     Change Log
| ============================================================================
| Author       Date       Change 
| sbyrne     25 Apr 89	  created.
|
"

Collection subclass: #MappedCollection
	   instanceVariableNames: 'domain map'
	   classVariableNames: ''
	   poolDictionaries: ''
	   category: nil.

MappedCollection comment: 
'I represent collections of objects that are indirectly indexed by names.
There are really two collections involved: domain and a map.  The map maps
between external names and indices into domain, which contains the
real association.  In order to work properly, the domain and map objects must
be instances of a subclass of SequenceableCollection or Dictionary. ' !

!MappedCollection class methodsFor: 'basic'!

collection: aCollection map: aMap
    ^self new setCollection: aCollection andMap: aMap
!

new
    self error: 'new not available for MappedCollections; use collection:map:'
!!


!MappedCollection methodsFor: 'basic'!

at: key
    ^domain at: (map at: key)
!

at: key put: value
    ^domain at: (map at: key) put: value
!

contents
    | contents |
    contents _ Bag new.
    map do: [ :domainKey | contents add: domain at: domainKey ].
    ^contents
!

size
    ^domain size
!

add: anObject
    self shouldNotImplement
!

contents
    | aBag |
    aBag _ Bag new.
    map do: [ :value | aBag add: (domain at: value) ].
    ^aBag
!

do: aBlock
    map do: [ :value | aBlock value: (domain at: value) ]
!

collect: aBlock
    | aStream |
    aStream _ WriteStream on: (self species new: self size).
    self do: [ :value | aStream nextPut: (aBlock value: value) ].
    ^aStream contents
!

select: aBlock
    | aStream |
    aStream _ WriteStream on: (self species new: self size).
    self do: [ :value | (aBlock value: value) ifTrue:
    	    	[ aStream nextPut: value ] ].
    ^aStream contents
!!



!MappedCollection methodsFor: 'private'!

setCollection: aCollection andMap: aMap
    domain _ aCollection.
    map _ aMap
!

species
    ^domain species
!!