MCAncestry.st
changeset 1 4bd059691a48
child 609 4e18c7f47be9
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MCAncestry.st	Wed Nov 22 13:44:41 2006 +0100
@@ -0,0 +1,150 @@
+"{ Package: 'stx:goodies/monticello' }"
+
+Object subclass:#MCAncestry
+	instanceVariableNames:'ancestors stepChildren'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Monticello-Versioning'
+!
+
+MCAncestry comment:'Abstract superclass of records of ancestry.'
+!
+
+
+!MCAncestry class methodsFor:'as yet unclassified'!
+
+new
+	^ self basicNew initialize
+! !
+
+!MCAncestry methodsFor:'ancestry'!
+
+allAncestorsDo: aBlock
+	self ancestors do:
+		[:ea |
+		aBlock value: ea.
+		ea allAncestorsDo: aBlock]
+!
+
+allAncestorsOnPathTo: aVersionInfo
+	^ MCFilteredVersionSorter new
+		target: aVersionInfo;
+		addAllVersionInfos: self ancestors;
+		sortedVersionInfos
+!
+
+ancestorString
+	^ String streamContents:
+		[:s | self ancestors do: [:ea | s nextPutAll: ea name] separatedBy: [s nextPutAll: ', ']]
+!
+
+ancestors
+	^ ancestors ifNil: [#()]
+!
+
+ancestorsDoWhileTrue: aBlock
+	self ancestors do:
+		[:ea |
+		(aBlock value: ea) ifTrue: 
+			[ea ancestorsDoWhileTrue: aBlock]]
+!
+
+breadthFirstAncestors
+	^ Array streamContents: [:s | self breadthFirstAncestorsDo: [:ea | s nextPut: ea]]
+!
+
+breadthFirstAncestorsDo: aBlock
+	| seen todo next |
+	seen _ Set with: self.
+	todo _ OrderedCollection with: self.
+	[todo isEmpty] whileFalse:
+		[next _ todo removeFirst.
+		next ancestors do:
+			[:ea |
+			(seen includes: ea) ifFalse:
+				[aBlock value: ea.
+				seen add: ea.
+				todo add: ea]]]
+!
+
+commonAncestorWith: aNode
+	| commonAncestors |
+	commonAncestors _ self commonAncestorsWith: aNode.
+	^ commonAncestors at: 1 ifAbsent: [nil]
+!
+
+commonAncestorsWith: aVersionInfo
+
+	| sharedAncestors mergedOrder sorter |
+	sorter _ MCVersionSorter new
+						addVersionInfo: self;
+						addVersionInfo: aVersionInfo.
+	mergedOrder _ sorter sortedVersionInfos.
+	sharedAncestors _ (sorter allAncestorsOf: self) intersection: (sorter allAncestorsOf: aVersionInfo).
+	^ mergedOrder select: [:ea | sharedAncestors includes: ea]
+!
+
+hasAncestor: aVersionInfo
+	^ self
+		hasAncestor: aVersionInfo
+		alreadySeen: OrderedCollection new
+!
+
+hasAncestor: aVersionInfo alreadySeen: aList
+	(aList includes: self) ifTrue: [^ false].
+	aList add: self.
+
+	^ self = aVersionInfo or: [self ancestors anySatisfy: [:ea | ea hasAncestor: aVersionInfo alreadySeen: aList]]
+!
+
+isRelatedTo: aVersionInfo
+	^ aVersionInfo timeStamp < self timeStamp
+		ifTrue: [self hasAncestor: aVersionInfo]
+		ifFalse: [aVersionInfo hasAncestor: self]
+!
+
+stepChildren
+	^ stepChildren ifNil: [#()]
+!
+
+stepChildrenString
+	^ String streamContents:
+		[:s | self stepChildren do: [:ea | s nextPutAll: ea name] separatedBy: [s nextPutAll: ', ']]
+!
+
+topologicalAncestors
+	| frontier f |
+	^ Array streamContents:
+		[:s |
+		frontier _ MCFrontier frontierOn: self.
+		[f _ frontier frontier.
+		s nextPutAll: f.
+		frontier removeAll: f.
+		f isEmpty] whileFalse] 
+!
+
+trimAfterVersionInfo: aVersionInfo
+	aVersionInfo = self
+		ifTrue: [ancestors _ #()]
+		ifFalse:
+			[aVersionInfo date <= self date ifTrue:
+				[ancestors do: [:ea | ea trimAfterVersionInfo: aVersionInfo]]
+		]
+!
+
+withBreadthFirstAncestors
+	^ (Array with: self), self breadthFirstAncestors
+! !
+
+!MCAncestry methodsFor:'initializing'!
+
+initialize
+	ancestors _ #().
+	stepChildren _ #()
+! !
+
+!MCAncestry class methodsFor:'documentation'!
+
+version
+    ^ '$Header: /cvs/stx/stx/goodies/monticello/MCAncestry.st,v 1.1 2006-11-22 12:44:41 cg Exp $'
+! !