1
1
"use strict" ;
2
2
3
+ var extend = require ( "util" ) . _extend ;
4
+
3
5
var lineage_hunter = function ( ) {
4
6
5
7
var pa = require ( './pattern_assembler' ) ;
6
8
7
9
function findlineage ( pattern , patternlab ) {
10
+ // As we are adding edges from pattern to ancestor patterns, ensure it is known to the graph
11
+ patternlab . graph . add ( pattern ) ;
8
12
9
13
var pattern_assembler = new pa ( ) ;
10
14
@@ -28,6 +32,11 @@ var lineage_hunter = function () {
28
32
l . lineageState = ancestorPattern . patternState ;
29
33
}
30
34
35
+ patternlab . graph . add ( ancestorPattern ) ;
36
+
37
+ // Confusing: pattern includes "ancestorPattern", not the other way round
38
+ patternlab . graph . link ( pattern , ancestorPattern ) ;
39
+
31
40
pattern . lineage . push ( l ) ;
32
41
33
42
//also, add the lineageR entry if it doesn't exist
@@ -44,62 +53,71 @@ var lineage_hunter = function () {
44
53
}
45
54
46
55
ancestorPattern . lineageR . push ( lr ) ;
56
+ extend ( patternlab . graph . node ( ancestorPattern ) , lr ) ;
47
57
}
48
58
}
49
59
} ) ;
50
60
}
51
61
}
52
62
53
- function setPatternState ( direction , pattern , targetPattern ) {
54
- // if the request came from the past, apply target pattern state to current pattern lineage
63
+ /**
64
+ * Apply the target pattern state either to any predecessors or successors of the given
65
+ * pattern in the pattern graph.
66
+ * @param direction Either 'fromPast' or 'fromFuture'
67
+ * @param pattern {Pattern}
68
+ * @param targetPattern {Pattern}
69
+ * @param graph {PatternGraph}
70
+ */
71
+ function setPatternState ( direction , pattern , targetPattern , graph ) {
72
+ var index = null ;
55
73
if ( direction === 'fromPast' ) {
56
- for ( var i = 0 ; i < pattern . lineageIndex . length ; i ++ ) {
57
- if ( pattern . lineageIndex [ i ] === targetPattern . patternPartial ) {
58
- pattern . lineage [ i ] . lineageState = targetPattern . patternState ;
59
- }
60
- }
74
+ index = graph . lineage ( pattern ) ;
61
75
} else {
62
- //the request came from the future, apply target pattern state to current pattern reverse lineage
63
- for ( var i = 0 ; i < pattern . lineageRIndex . length ; i ++ ) {
64
- if ( pattern . lineageRIndex [ i ] === targetPattern . patternPartial ) {
65
- pattern . lineageR [ i ] . lineageState = targetPattern . patternState ;
66
- }
76
+ index = graph . lineageR ( pattern ) ;
77
+ }
78
+
79
+ // if the request came from the past, apply target pattern state to current pattern lineage
80
+ for ( var i = 0 ; i < index . length ; i ++ ) {
81
+ if ( index [ i ] . patternPartial === targetPattern . patternPartial ) {
82
+ index [ i ] . lineageState = targetPattern . patternState ;
67
83
}
68
84
}
69
85
}
70
86
71
87
72
88
function cascadePatternStates ( patternlab ) {
73
89
74
- var pattern_assembler = new pa ( ) ;
75
-
76
90
for ( var i = 0 ; i < patternlab . patterns . length ; i ++ ) {
77
91
var pattern = patternlab . patterns [ i ] ;
78
92
79
93
//for each pattern with a defined state
80
94
if ( pattern . patternState ) {
95
+ var lineage = patternlab . graph . lineage ( pattern ) ;
81
96
82
- if ( pattern . lineageIndex && pattern . lineageIndex . length > 0 ) {
97
+ if ( lineage && lineage . length > 0 ) {
83
98
84
99
//find all lineage - patterns being consumed by this one
85
- for ( var h = 0 ; h < pattern . lineageIndex . length ; h ++ ) {
86
- var lineagePattern = pattern_assembler . getPartial ( pattern . lineageIndex [ h ] , patternlab ) ;
87
- setPatternState ( 'fromFuture' , lineagePattern , pattern ) ;
100
+ for ( var h = 0 ; h < lineage . length ; h ++ ) {
101
+ // Not needed, the graph already knows the concrete pattern
102
+ // var lineagePattern = pattern_assembler.getPartial(lineageIndex[h], patternlab);
103
+ setPatternState ( 'fromFuture' , lineage [ h ] , pattern , patternlab . graph ) ;
88
104
}
89
105
}
90
-
91
- if ( pattern . lineageRIndex && pattern . lineageRIndex . length > 0 ) {
106
+ var lineageR = patternlab . graph . lineageR ( pattern ) ;
107
+ if ( lineageR && lineageR . length > 0 ) {
92
108
93
109
//find all reverse lineage - that is, patterns consuming this one
94
- for ( var j = 0 ; j < pattern . lineageRIndex . length ; j ++ ) {
110
+ for ( var j = 0 ; j < lineageR . length ; j ++ ) {
95
111
96
- var lineageRPattern = pattern_assembler . getPartial ( pattern . lineageRIndex [ j ] , patternlab ) ;
112
+ var lineageRPattern = lineageR [ j ] ;
97
113
98
114
//only set patternState if pattern.patternState "is less than" the lineageRPattern.patternstate
99
115
//or if lineageRPattern.patternstate (the consuming pattern) does not have a state
100
116
//this makes patternlab apply the lowest common ancestor denominator
101
- if ( lineageRPattern . patternState === '' || ( patternlab . config . patternStateCascade . indexOf ( pattern . patternState )
102
- < patternlab . config . patternStateCascade . indexOf ( lineageRPattern . patternState ) ) ) {
117
+ let patternStateCascade = patternlab . config . patternStateCascade ;
118
+ let patternStateIndex = patternStateCascade . indexOf ( pattern . patternState ) ;
119
+ let patternReverseStateIndex = patternStateCascade . indexOf ( lineageRPattern . patternState ) ;
120
+ if ( lineageRPattern . patternState === '' || ( patternStateIndex < patternReverseStateIndex ) ) {
103
121
104
122
if ( patternlab . config . debug ) {
105
123
console . log ( 'Found a lower common denominator pattern state: ' + pattern . patternState + ' on ' + pattern . patternPartial + '. Setting reverse lineage pattern ' + lineageRPattern . patternPartial + ' from ' + ( lineageRPattern . patternState === '' ? '<<blank>>' : lineageRPattern . patternState ) ) ;
@@ -108,9 +126,9 @@ var lineage_hunter = function () {
108
126
lineageRPattern . patternState = pattern . patternState ;
109
127
110
128
//take this opportunity to overwrite the lineageRPattern's lineage state too
111
- setPatternState ( 'fromPast' , lineageRPattern , pattern ) ;
129
+ setPatternState ( 'fromPast' , lineageRPattern , pattern , patternlab . graph ) ;
112
130
} else {
113
- setPatternState ( 'fromPast' , pattern , lineageRPattern ) ;
131
+ setPatternState ( 'fromPast' , pattern , lineageRPattern , patternlab . graph ) ;
114
132
}
115
133
}
116
134
}
0 commit comments