--- /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 $'
+! !