initial checkin
authorClaus Gittinger <cg@exept.de>
Wed, 22 Nov 2006 14:12:51 +0100
changeset 69 820c8523f020
parent 68 c238f87345bb
child 70 7a1fe064963b
initial checkin
MCDependencySorter.st
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MCDependencySorter.st	Wed Nov 22 14:12:51 2006 +0100
@@ -0,0 +1,111 @@
+"{ Package: 'stx:goodies/monticello' }"
+
+Object subclass:#MCDependencySorter
+	instanceVariableNames:'required provided orderedItems'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Monticello-Loading'
+!
+
+
+!MCDependencySorter class methodsFor:'as yet unclassified'!
+
+items: aCollection
+	^ self new addAll: aCollection
+!
+
+new
+	^ self basicNew initialize
+!
+
+sortItems: aCollection
+	| sorter |
+	sorter _ self items: aCollection.
+	sorter externalRequirements do: [:req  | sorter addProvision: req].
+	^ sorter orderedItems.
+! !
+
+!MCDependencySorter methodsFor:'accessing'!
+
+externalRequirements
+	| unloaded providedByUnloaded |
+	unloaded := self itemsWithMissingRequirements.
+	providedByUnloaded := (unloaded gather: [:e | e provisions]) asSet.
+	^ required keys reject: [:ea | providedByUnloaded includes: ea ]
+!
+
+itemsWithMissingRequirements
+	| items |
+	items _ Set new.
+	required do: [:ea | items addAll: ea].
+	^ items
+! !
+
+!MCDependencySorter methodsFor:'building'!
+
+add: anItem
+	| requirements |
+	requirements _ self unresolvedRequirementsFor: anItem.
+	requirements isEmpty
+		ifTrue: [self addToOrder: anItem]
+		ifFalse: [self addRequirements: requirements for: anItem]
+!
+
+addAll: aCollection
+	aCollection asArray sort do: [:ea | self add: ea]
+!
+
+addExternalProvisions: aCollection
+	(aCollection intersection: self externalRequirements)
+		do: [:ea | self addProvision: ea]
+! !
+
+!MCDependencySorter methodsFor:'initialize-release'!
+
+initialize
+	provided _ Set new.
+	required _ Dictionary new.
+	orderedItems _ OrderedCollection new.
+! !
+
+!MCDependencySorter methodsFor:'private'!
+
+addProvision: anObject
+	| newlySatisfied |
+	provided add: anObject.
+	newlySatisfied _ required removeKey: anObject ifAbsent: [#()].
+	self addAll: newlySatisfied.
+!
+
+addRequirement: reqObject for: itemObject
+	(self itemsRequiring: reqObject) add: itemObject
+!
+
+addRequirements: aCollection for: anObject
+	aCollection do: [:ea | self addRequirement: ea for: anObject]
+!
+
+addToOrder: anItem
+	orderedItems add: anItem.
+	anItem provisions do: [:ea | self addProvision: ea].
+!
+
+itemsRequiring: anObject
+	^ required at: anObject ifAbsentPut: [Set new]
+!
+
+unresolvedRequirementsFor: anItem
+	^ anItem requirements difference: provided
+! !
+
+!MCDependencySorter methodsFor:'sorting'!
+
+orderedItems
+	^ orderedItems
+! !
+
+!MCDependencySorter class methodsFor:'documentation'!
+
+version
+    ^ '$Header: /cvs/stx/stx/goodies/monticello/MCDependencySorter.st,v 1.1 2006-11-22 13:12:51 cg Exp $'
+! !